php操作MySQL数据库(二)

执行语句

在完成数据库的连接后,就可以通过 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值