学习目标

  • PHP操作MySQL的步骤
  • PHP连接MySQL服务器
  • 选择当前数据库
  • 执行各种SQL语句
  • 从结果集获取一行数据
  • 综合案例:学生信息管理

CMD模式下操作MySQL数据库步骤

CMD模式下操作MySQL数据库步骤
CMD模式下操作MySQL数据库步骤

  1. 登录到MySQL服务器;

    mysql -uroot -proot
  2. 选择当前数据库;

     use test;
  3. 设置字符集;

    set names gbk;
  4. 执行各种SQL语句。

    insert into student(name, sex, age) values ('张三', '男', 18);

PHP连接MySQL服务器

mysqli_connect()

描述:连接到 MySQL服务器

语法:

mysqli mysqli_connect([host][,username][,password][,dbname][,port])

参数:

  • host:MySQL服务器。可以包含端口号,默认值为“localhost:3306”
  • username:用户名。默认值是服务器进程所有者的用户名;
  • password:密码。
  • dbname:数据库名称。
  • port:MySQL服务器的端口号,默认为3306。

返回值:如果连接成功,则返回MySQLi连接对象。如果失败,则返回FALSE。

示例程序:

<?php
// 数据库配置信息
$db_host = "localhost";
$db_port = "3306";
$db_user = "dmeo";
$bd_password = "demo";
$db_name = "demo";
$charset = "utf8";

// PHP链接Mysql服务器

if (!$db_link = @mysqli_connect($db_host.":".$db_port, $db_user, $bd_password))
{
    echo "<h2>PHP链接Mysql数据库失败!!!</h2>";
    echo "链接失败的原因为:".mysqli_connect_error();
    die();
}
else
{
    echo "<h2>PHP链接Mysql数据库成功!!!</h2>";
    //输入链接信息
    var_dump($db_link);
}
链接成功示例
链接成功示例
链接失败示例
链接失败示例

@运算符

PHP 支持一个错误控制运算符@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉(不包括语法错误)。

@ 运算符只对表达式有效。

对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符。例如,可以把它放在变量,函数和 include调用,常量等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。

exit()或die()

描述:输出一个消息并且退出当前脚本,等同于die()。

语法:

void exit ([ string $string ] ) 

说明:输出 $string 的值,并中止程序的运行。

返回值:没有返回值

mysqli_connect_error()

描述:返回上一个 MySQL 连接产生的文本错误信息

语法:

string mysqli_connect_error ( void) 

参数:没有参数。

mysqli_close()

描述:关闭先前打开的数据库连接

语法:

bool mysqli_close ( mysqli $link )

选择当前数据库

描述:一个数据库服务器可能包含很多的数据库,通常需要针对某个具体的数据库进行编程

语法:

bool mysqli_select_db(mysqli $link, string $database)

返回值:如果成功返回TRUE,失败则返回FALSE。

设置客户端字符集

描述:设置默认字符编码

语法:

bool mysqli_set_charset ( mysqli $link , string $charset )

返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

执行各种SQL语句

mysqli_query()

描述:发送一条 MySQL 查询;

语法:

resource mysqli_query(mysqli $link , string $query )

参数:

  • $query是查询字符串;
  • $link是创建的活动的数据库连接;

说明:mysqli_query() 仅对 SELECT,SHOW 或 DESCRIBE 语句返回一个mysqli_result结果集对象,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysqli_query()在执行成功时返回 TRUE,出错时返回 FALSE。非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。

注意:查询字符串不应以分号结束,和命令行模式下有区别。

mysqli_free_result()

描述:释放与结果集相关联的内存

语法:

void mysqli_free_result ( mysqli_result $result )

参数:$result为结果集对象。

内存中的变量何时消失:

  1. 网页执行完毕,所有与本网页相关的变量自动销毁;
  2. 手动销毁指定的变量。

从结果集获取一行数据

mysqli_fetch_row()

描述:从结果集中取得一行作为枚举数组;

格式:

array mysqli_fetch_row ( mysqli_result $result )

返回:返回根据所取得的行生成的数组,如果没有更多行则返回 FALSE。

说明:mysqli_fetch_row() 从指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。

提示:依次调用mysqli_fetch_row()将返回结果集中的下一行,如果没有更多行则返回FALSE。

mysqli_fetch_assoc()

描述:从结果集中取得一行作为关联数组

语法:

array mysqli_fetch_assoc ( mysqli_result  $result )

返回值:从结果集取得的行生成的关联数组,如果没有更多行则返回 FALSE;

注意:此函数返回的字段名大小写敏感。

mysqli_fetch_array()

描述:从结果集中取得一行作为关联数组,或数字数组,或二者兼有

语法:

array mysqli_fetch_array ( mysqli_result  $result  [, int $result_type = MYSQLI_BOTH ] )

参数:$result_type是一个常量,取值:MYSQLI_BOTH(两者兼有,默认)、MYSQLI_ASSOC(关联索引)、MYSQLI_NUM(数字索引)

返回:返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE。

注意:本函数返回的字段名区分大小写。

mysqli_fetch_all()

描述:从结果集中取得所有行作为关联数组、枚举数组、或二者兼有

语法:

mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] )

提示:获取数据,要不是获取一条,要不是获取多条。

获取记录数

mysqli_num_rows()

描述:取得结果集中行的数目

语法:

int mysqli_num_rows ( mysqli_result $result )

说明:mysqli_num_rows()返回结果集中行的数目。

注意:此命令仅对 SELECT 语句有效

mysqli_affected_rows()

描述:取得前一次 MySQL 操作所影响的记录行数;

语法:

int mysqli_affected_rows ( mysqli $link )

说明:取得最近一次与 $link 关联的 SELECT、INSERT、UPDATE 或 DELETE 查询所影响的记录行数。

注意:如果最近一次查询失败,函数返回-1。当使用UPDATE查询,MySQL不会将原值和新值一样的值更新,返回值不一定就是查询条件所符合的记录,只有修改过的记录数才会被返回。

代码总结

<?php
// 数据库配置信息
$db_host = "localhost";
$db_port = "3306";
$db_user = "blog";
$bd_password = "blog";
$db_name = "blog";
$charset = "utf8";

// PHP链接Mysql服务器
if (!$db_link = @mysqli_connect($db_host.":".$db_port, $db_user, $bd_password))
{
    //链接数据库失败
    echo "<h2>PHP链接Mysql数据库失败!!!</h2>";
    echo "链接失败的原因为:".mysqli_connect_error();
    die(); //终止程序向下运行
}
else
{
    //链接数据库成功
    echo "<h2>PHP链接Mysql数据库成功!!!</h2>";
    //输入链接信息
    var_dump($db_link);
    echo "<hr>";

    //选择数据库
    if (!mysqli_select_db($db_link, $db_name))
    {
        echo "链接数据库{$db_name}失败!!!";
        die(); //终止程序向下运行
    }
    else 
    {
        echo "链接数据库{$db_name}成功!!!";
        echo "<hr>";

        //设置数据库返回数据字符集
        if (!mysqli_set_charset($db_link, $charset))
        {
            echo "设置数据库返回数据字符集失败!!!";
            die(); //终止程序向下运行
        }
        else
        {
            echo "设置数据库返回数据字符集成功!!!";
            echo "<hr>";

            //对数据库进行增删改查操作
            $sqlQuery = "SELECT * FROM typecho_comments"; //编写Mysql操作语句
            $sqlQuery = "UPDATE typecho_comments SET likes=likes+10 WHERE likes<10"; //编写Mysql操作语句
            // $sqlQuery = "UPDATE typecho_comments SET likes=likes+10 WHERE cid=68"; //编写Mysql操作语句
            $findResult = mysqli_query($db_link, $sqlQuery); //再数据库进行查询
            var_dump($findResult); //输出查询结果
            echo "<hr>";

            //从结果集中获取一行,并作为枚举数组返回
            while($findResultRow = mysqli_fetch_row($findResult))
            {
                print_r($findResultRow);
            }
            $findResultRow = mysqli_fetch_row($findResult);
            print_r($findResultRow);
            echo "<hr>";

            //从结果集中获取一行,并作为关联数组返回
            $findResultRow = mysqli_fetch_assoc($findResult);
            print_r($findResultRow);
            echo "<hr>";

            //从结果集中获取一行,并作为枚举数组或关联数组或者两者都输出
            $findResultRow = mysqli_fetch_array($findResult,$resulttype = MYSQLI_BOTH);
            print_r($findResultRow);
            echo "<hr>";

            //从结果集中获取所有行,并作为二维枚举数组输出
            $findResultRows = mysqli_fetch_all($findResult, MYSQLI_BOTH);
            print_r($findResultRows);
            echo "<hr>";

            // 查询结果集中的行数
            $resultRowsNumber = mysqli_num_rows($findResult);
            echo"当前数据库中共有{$resultRowsNumber}条评论信息";

            // 查询结果集中的行数
            $resultRowsNumber = mysqli_affected_rows($db_link);
            echo"当前数据库中共有{$resultRowsNumber}条信息得到更改";

            //查询执行完毕,释放相关结果集(注意,如果数据库返回的结果为布尔值,则不能销毁)
            mysqli_free_result($findResult); 
        }
    }
}

// 链接数据库并已得到想要查询的数据后要关闭数据库链接,节省系统资源
mysqli_close($db_link);

echo "<hr>";

综合案例:学生信息管理

了解数据表的结构设计

mysql> desc typecho_contents;
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| cid          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title        | varchar(200)     | YES  |     | NULL    |                |
| slug         | varchar(200)     | YES  | UNI | NULL    |                |
| created      | int(10) unsigned | YES  | MUL | 0       |                |
| modified     | int(10) unsigned | YES  |     | 0       |                |
| text         | longtext         | YES  |     | NULL    |                |
| order        | int(10) unsigned | YES  |     | 0       |                |
| authorId     | int(10) unsigned | YES  |     | 0       |                |
| template     | varchar(32)      | YES  |     | NULL    |                |
| type         | varchar(16)      | YES  |     | post    |                |
| status       | varchar(16)      | YES  |     | publish |                |
| password     | varchar(32)      | YES  |     | NULL    |                |
| commentsNum  | int(10) unsigned | YES  |     | 0       |                |
| allowComment | char(1)          | YES  |     | 0       |                |
| allowPing    | char(1)          | YES  |     | 0       |                |
| allowFeed    | char(1)          | YES  |     | 0       |                |
| parent       | int(10) unsigned | YES  |     | 0       |                |
| views        | int(10)          | YES  |     | 0       |                |
| likes        | int(10)          | YES  |     | 0       |                |
| viewsNum     | int(10)          | YES  |     | 0       |                |
| wordCount    | int(10)          | YES  |     | 0       |                |
+--------------+------------------+------+-----+---------+----------------+
21 rows in set (0.00 sec)

连接数据库的公共文件connect-mysql.php

<?php
// 数据库配置信息
$db_host = "localhost";
$db_port = "110";
$db_user = "demo";
$bd_password = "demo";
$db_name = "demo";
$charset = "utf8";

// PHP链接Mysql服务器
if (!$db_link = @mysqli_connect($db_host.":".$db_port, $db_user, $bd_password))
{
    //链接数据库失败
    echo "<h2>PHP链接Mysql数据库失败!!!</h2>";
    echo "链接失败的原因为:".mysqli_connect_error();
    die(); //终止程序向下运行
}

//选择数据库
if (!mysqli_select_db($db_link, $db_name))
{
    echo "选择数据库{$db_name}失败!!!";
    die(); //终止程序向下运行
}

//设置数据库返回数据字符集
if (!mysqli_set_charset($db_link, $charset))
{
    echo "设置数据库返回数据字符集失败!!!";
    die(); //终止程序向下运行
}

echo "<br>connect-mysql.php文件成功执行完毕!<br>";

输出文章列表页article-list.php

<?php
// https://demo.manyacan.com/article-list.php
// 引入链接数据库的文件:connect-mysql.php
require_once("./connect-mysql.php"); //数据库已链接

// 编写并执行查询sql语句
$sqlQuery = "SELECT * from typecho_contents ORDER BY cid ASC";
$findResult = mysqli_query($db_link, $sqlQuery);// 查询结果集赋值到变量中
// var_dump($findResult);
// die();

// 以关联数组形式获取结果集中所有行
$allRows = mysqli_fetch_all($findResult, MYSQLI_ASSOC);
// print_r($allRows);
// die();

// 获取文章总数(即结果集行数)
$numberOfRows = mysqli_num_rows($findResult);
// echo "共有{$numberOfRows}条数据";
// die();


?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文章列表页面</title>
    <script>
        // 自定义一个删除提示函数
        function confirmDel(cid) {
            if(window.confirm("确认删除cid为:"+cid+" 的文章?")) {
                window.location.href = "./delete-user.php?cid="+cid; // 用户确认删除时,浏览器窗口重定向
            }
        }
    </script>
</head>
<body>
    <div style="margin: 10px auto;text-align: center;">
        <h2>文章信息管理</h2>
        <a href="">添加文章</a>
        目前共有<font color=red><?php echo $numberOfRows?></font>篇文章
    </div>
   <table width="1000" border="1" align="center" rules="all" cellpadding="5">
        <tr bgcolor="#ccc">
            <th>cid</th>
            <th>title</th>
            <th>text</th>
            <th>type</th>
            <th>commentsNum</th>
            <th>viewsNum</th>
            <th>likes</th>
            <th>操作选项</th>
        </tr>

        <!-- 循环结果集得到的二维数组 -->
        <?php
        foreach($allRows as $row){
        ?>
        <tr align="center">
            <td><?php echo $row['cid'];?></td>
            <td><a href="https://blog.manyacan.com/archives/<?php echo $row['cid'];?>/" target="_blank"><?php echo $row['title'];?></a></td>
            <td><?php echo htmlentities(substr($row['text'] , 0 , 100),ENT_QUOTES,"UTF-8");?></td>
            <td><?php echo $row['type'];?></td>
            <td><?php echo $row['commentsNum'];?></td>
            <td><?php echo $row['viewsNum'];?></td>
            <td><?php echo $row['likes'];?></td>
            <td><a href="#">修改</a> | <a href="#" onclick="confirmDel(<?php echo $row['cid'];?>)">删除</a></td>
        </tr>
        <?php }?>
   </table>
</body>
</html>

删除文章页delete-article.php

<?php
// https://demo.manyacan.com/delete-article.php
// 引入链接数据库的文件:connect-mysql.php
require_once("./connect-mysql.php"); //数据库已链接

// 编写并执行SQL语句
// print_r($_GET);
$sqlQuery = "DELETE FROM typecho_contents WHERE cid=".$_GET["cid"];
echo $sqlQuery;

// 对SQL语句执行结果进行检查
if (mysqli_query($db_link, $sqlQuery)) {
    echo "删除用户操作执行成功!";
    header("refresh:3;url=./article-list.php"); // 删除成功后3秒跳转到文章列表页面
    die();
} else {
    echo "删除用户操作执行失败!";
}

添加学生信息add.php

<?php
//包含连接数据库的公共文件
require_once("./connect-mysql.php");

//判断表单是否合法提交(防止黑客攻击)
if(isset($_POST['token']) && $_POST['token']=="add")
{
    //获取表单提交数据
    $name    = $_POST['name'];
    $sex    = $_POST['sex'];
    $age     = $_POST['age'];
    $edu     = $_POST['edu'];
    $salary = $_POST['salary'];
    $bonus     = $_POST['bonus'];
    $city     = $_POST['city'];
    //构建插入的SQL语句
    $sql = "INSERT INTO student VALUES(null,'$name','$sex',$age,'$edu',$salary,$bonus,'$city')";
    //判断SQL语句是否执行成功
    if(mysqli_query($link,$sql))
    {
        echo "<h2>记录添加成功!</h2>";
        //告诉浏览器执行代码:等待3秒,并跳转到list.php文件
        header("refresh:3;url=./add-article.php");
        die(); //中止程序向下运行
    }
}
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>学生信息管理中心</title>
</head>
<body>
<div style="text-align:center;padding-bottom: 10px;">
    <h2>学生信息管理中心——添加学生</h2>
    <a href="./list.php">返回</a>
</div>

<form method="post" action=""> <!-- 只有表单可以发送post数据,action为空表单提交到当前自己页面 -->
<table width="400" bordercolor="#ccc" border="1" rules="all" align="center" cellpadding="5">
    <tr>
        <td width="80" align="right">姓名:</td>
        <td><input type="text" name="name"></td>
    </tr>
    <tr>
        <td width="80" align="right">性别:</td>
        <td>
            <input type="radio" name="sex" value="男" checked>男
            <input type="radio" name="sex" value="女">女
        </td>
    </tr>
    <tr>
        <td width="80" align="right">年龄:</td>
        <td><input type="text" name="age"></td>
    </tr>
    <tr>
        <td width="80" align="right">学历:</td>
        <td>
            <select name="edu">
                <option value="1">初中</option>
                <option value="2">高中</option>
                <option value="3" selected="selected">大专</option>
                <option value="4">本科</option>
                <option value="5">研究生</option>
            </select>
        </td>
    </tr>
    <tr>
        <td width="80" align="right">工资:</td>
        <td><input type="text" name="salary"></td>
    </tr>
    <tr>
        <td width="80" align="right">奖金:</td>
        <td><input type="text" name="bonus"></td>
    </tr>
    <tr>
        <td width="80" align="right">籍贯:</td>
        <td><input type="text" name="city"></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>
            <input type="submit" value="提交">
            <input type="hidden" name="token" value="add"><!--  防止恶意攻击 -->
            <input type="reset" value="重置">
        </td>
    </tr>
</table>
</body>
</html>

PHP处理复选框

<?php
//判断表单是否提交
if(isset($_POST['token']) && $_POST['token']=='add')
{
    print_r($_POST);
    //将$_POST['hobby']中的所有数据连成一个字符串
    //implode()将数组元素连成一个字符串
    //explode()将一个字符串分割成一个数组
    $hobby = implode(',',$_POST['hobby']);
    echo $hobby;
    die();
}
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<form method="post" action="">
爱好:
<input type="checkbox" name="hobby[]" value="画画">画画 <!-- 将多个复选框选项作为一个数组传递到PHP处理程序 -->
<input type="checkbox" name="hobby[]" value="音乐">音乐
<input type="checkbox" name="hobby[]" value="电脑">电脑
<input type="checkbox" name="hobby[]" value="游戏">游戏
<input type="checkbox" name="hobby[]" value="开车">开车
<input type="submit" value="提交">
<input type="hidden" name="token" value="add">
</form>
</body>
</html>