php操作MySQL数据库(二)

    xiaoxiao2025-05-29  6

    执行语句

    在完成数据库的连接后,就可以通过 SQL 语句操作数据库了。在 MySQLi扩展中,通常使用 mysqli_query() 函数发送 SQL 语句,获取执行结果。函数的声明方式如下:

    mixed mysqli_query ( mysqli $link, //数据库连接 string $query, //SQL语句 int $resultmode = MYSQLI_STORE_RESULT //结果集模式 ) 在上述声明中,$link 表示通过 mysqli_connect() 函数获取的数据库连接,$query 表示 SQL 语句。当函数执行 SELECT、SHOW、DESCRIBE 或EXPLAIN 查询时,返回值是查询结果集,而对于其他查询,成功返回 true,失败返回 false。

    在 mysqli_query() 函数中,可选参数 $resultmode 表示结果集模式,其值可以是 MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 两种常量。MYSQLI_STORE_RESULT 模式会将结果集全部读取到 PHP 端,而MYSQLI_USE_RESULT 模式仅初始化结果集检索,在处理结果集时进行数据读取。 为了更好地掌握 mysqli_query() 函数的用法,下面通过代码进行演示。

    //连接数据库 $link = mysqli_connect('localhost', 'root', '123456'); mysqli_query($link, 'use `itcast`'); //选择数据库(SQL语句方式) mysqli_query($link, 'set names utf8'); //设置字符集(SQL语句方式) //执行SQL语句,并获取结果集 $result = mysqli_query($link, 'show databases'); if(!$result){ exit('执行失败。错误信息:'.mysqli_error($link)); } 上述代码演示了如何通过 mysqli_query() 函数执行 SQL 语句、获取结果集,以及通过 mysqli_error() 函数获取错误信息。当 SQL 语句执行失败时,$result的值为 false,因此通过判断就可以输出错误信息并停止脚本执行。

    处理结果集

    当通过 mysqli_query() 函数执行 SQL 语句后,返回的结果集并不能直接使用,需要使用函数从结果集中获取信息,保存为数组。MySQLi 扩展中常用的处理结果集的函数如表所示。 在表列举函数中,mysqli_fetch_all() 和 mysqli_fetch_array() 的返回值支持关联数组和索引数组两种形式,函数第 1 个参数表示结果集,第 2 个参数是可选参数,表示返回的数组形式,其值有 MYSQLI_ASSOC、MYSQLI_NUM、MYSQLI_BOTH 三种常量,分别表示关联数组、索引数组,或两者皆有,默认值为 MYSQLI_BOTH。 示例:连接并选择“内容管理系统”的数据库,查询“栏目”表中的所有记录。具体代码如下。

    /连接数据库,选择“itcast_cms”数据库 $link = mysqli_connect('localhost', 'root', '123456', 'itcast_cms'); //设置字符集 mysqli_set_charset($link, 'utf8'); //查询“cms_category”表中所有的数据 $result = mysqli_query($link, 'select * from `cms_category`');

    示例:当需要一次查询一行记录时,可以通过 mysqli_fetch_assoc()、mysqli_fetch_row() 或 mysqli_fetch_array() 来实现,以 mysqli_fetch_assoc()为例,具体代码如下

    /通过循环将结果集中所有的记录全部读取 while($row = mysqli_fetch_assoc($result)){ echo $row['name']; //输出“name”字段的值 } 上述代码中 mysqli_fetch_assoc() 函数用于获取结果集中的一行,因此与while 循环配合使用,可以将结果集中的数据全部取出来,直到该函数返回 false,跳出 while 循环。

    当需要一次查询出所有的记录时,可以通过 mysqli_fetch_all() 函数来实现,具体代码如下。

    //查询所有记录,获取关联数组结果 $data = mysqli_fetch_all($result, MYSQLI_ASSOC); //打印数组结构 var_dump($data); //每行记录是一个数组,所有的行组成了$data数组

    预处理语句

    MySQLi 扩展中有一种预处理语句的机制,其原理是预先编译 SQL 语句的模板,当执行时只传输有变化的数据。下图演示了预处理语句和传统方式的区别。 什么是预处理语句? 从图中可以看出,当 PHP 需要执行 SQL 时,传统方式是将发送的数据和 SQL 写在一起,这种方式每条 SQL 都需要经过分析、编译和优化的周期;而预处理语句只需要编译一次用户提交的 SQL 模板,在操作时,发送相关数据即可完成更新操作,这极大地提高了运行效率,而且无需考虑数据中包含特殊字符(如单引号)导致的语法问题。

    mysqi_prepare()函数用于预处理一个待执行的 SQL 语句,函数声明如下

    mysqli_stmt mysqli_prepare ( mysqli $link , string $query )

    在上述声明中,参数 l i n k 表 示 数 据 库 连 接 , link 表示数据库连接, linkquery 表示 SQL 语句模板。当函数执行后,成功返回预处理对象,失败返回 false。

    在编写SQL语句模板时,其语法是将数据部分使用“?”占位符代替。示例代码如下:

    # SQL正常语法 UPDATE `user` SET `name`='aa' WHERE `id`=1 # SQL模板语法 UPDATE `user` SET `name`=? WHERE `id`=?

    mysqli_stmt_bind_param() 函数用于将变量作为参数绑定到预处理语句中。函数的声明如下:

    bool mysqli_stmt_bind_param ( mysqli_stmt $stmt, //预处理对象 string $types, //数据类型 mixed &$var1, //绑定变量1(引用传参) [, mixed&$... ] //绑定变量n...(可选参数,可绑定多个,引用传参) ) 在上述代码中,参数 $stmt 表示由 mysqli_prepare() 返回的预处理对象;$types 用于指定被绑定变量的数据类型,它是由一个或多个字符组成的字符串;后面的 $var(可以是多个参数)表示需要绑定的变量,且其个数必须与 $types 字符串的长度一致。该函数执行成功时返回 true,失败时返回 false。

    mysqli_stmt_bind_param()

    //连接数据库、预处理SQL模板 $link = mysqli_connect('localhost', 'root', '123456', 'itcast'); $stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?'); //参数绑定(将变量$name、$id按顺序绑定到SQL语句“?”占位符上) mysqli_stmt_bind_param($stmt, 'si', $name, $id); 在上述代码中,SQL语句中有两个“?”占位符,分别表示 name 字段和id 字段,name 字段是字符串类型,id 字段是整型,因此mysqli_stmt_bind_param() 的第二个参数为“si”。当代码执行后,变量$name 和 $id 就已经通过引用传参的方式进行了参数绑定。

    在完成参数绑定后,接下来应该将数据内容发送给 MySQL 执行。mysqli_stmt_execute() 函数用于执行预处理,其声明如下。

    bool mysqli_stmt_execute ( mysqli_stmt $stmt )

    在上述声明中,$stmt 参数表示由 mysqli_prepare() 函数返回的预处理对象。当函数执行成功后,返回 true,执行失败返回 false。

    接下来通过代码演示 mysqli_stmt_execute() 函数的使用,具体如下

    //连接数据库、预处理SQL模板 $link = mysqli_connect('localhost', 'root', '123456', 'itcast'); $stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?'); //参数绑定,并为已经绑定的变量赋值 mysqli_stmt_bind_param($stmt, 'si', $name, $id); $name = 'aa'; $id = 1;

    接下来通过代码演示 mysqli_stmt_execute() 函数的使用,具体如下。

    //执行预处理(第一次执行) mysqli_stmt_execute($stmt); //为第二次执行重新赋值 $name = 'bb'; $id = 2; //执行预处理(第二次执行) mysqli_stmt_execute($stmt); 通过上述代码可以看出,MySQLi 扩展提供的预处理方式,实现了数据与SQL 的分离。这种方式不仅提高了执行效率,也解决了直接用字符串拼接SQL 语句带来的安全问题。 连接数据库代码 //连接数据库、设置字符集 2 $link = mysqli_connect('localhost', 'root', '123456', 'itcast'); 3 mysqli_set_charset($link, 'utf8'); 4 // ① 执行查询操作、处理结果集 5 if(!$result = mysqli_query($link, 'SELECT * FROM `user`')){ 6 exit('执行失败。错误信息:'.mysqli_error($link)); //获取错误信息 7 } 8 $data = mysqli_fetch_all($result, MYSQLI_ASSOC); 9// ② 用完后,释放结果集 10 mysqli_free_result($result); 11 // ③ 执行插入操作,拼接SQL语句 12 //转义特殊符号 $name = mysqli_real_escape_string($link, "单引号'测试'文本"); 13 if(!mysqli_query($link, "INSERT INTO `user` (`name`) VALUES ('".$name."')")){ 14 exit('执行失败。错误信息:'.mysqli_error($link)); 15 } 16 // ④ 获取最后插入的ID 17 $id = mysqli_insert_id($link); //获取AUTO_INCREMENT字段的自增值 18 // ⑤ 执行修改操作 19if(!mysqli_query($link, "UPDATE `user` SET `name`='aa' WHERE `id`>2")){ 20 exit('执行失败。错误信息:'.mysqli_error($link)); 21 } 22 // ⑥ 获取受影响的行数 23$num = mysqli_affected_rows($link); //可获取UPDATE、 //DELETE等操作影响的行数 24 // ⑦ 关闭连接 25 mysqli_close($link);

    在上述代码中,第 4~10 行演示了 mysqli_error()、mysqli_free_result()函数的使用,第 12 行演示了 mysqli_real_escape_string() 函数的使用,第17~25行演示了 mysqli_insert_id()、mysqli_affected_rows()、mysqli_close()函数的使用。其中第 8 行 d a t a 保 存 了 查 询 出 的 数 据 , 因 此 在 第 10 行 释 放 了 data 保存了查询出的数据,因此在第 10 行释放了 data10result 结果集。第 25 行关闭 l i n k 连 接 后 , link 连接后, linklink 将不能继续使用。

    最新回复(0)