结果集中的记录指针与遍历操作
实例
<?php require 'mysql_connect.php'; if ($res = mysqli_query($db, "select * from staff limit 5")) { while($row = mysqli_fetch_assoc($res)){ print_r($row); echo '<br>'; } echo '<hr>'; //将结果集中的记录指针定位到0,即第1条记录 mysqli_data_seek($res,0); print_r(mysqli_fetch_assoc($res)); echo '<br>'; //将结果集中的记录指针定位到2,即第3条记录 mysqli_data_seek($res,2); print_r(mysqli_fetch_assoc($res)); echo '<br>'; //那么最后一条记录的指针是多少呢?对,行数-1 mysqli_data_seek($res,mysqli_num_rows($res)-1); print_r(mysqli_fetch_assoc($res)); echo '<br>'; //知道规律了,下面我们用for循环来遍历这个这个结果集 echo '<hr color="red">'; for($i=0; $i<mysqli_num_rows($res); $i++) { mysqli_data_seek($res,$i); print_r(mysqli_fetch_assoc($res)); echo '<br>'; } //恭喜大家又学到了一种遍历结果集的方法 } mysqli_close($db);
运行实例 »
点击 "运行实例" 按钮查看在线实例
预处理结果集操作
实例
//过程化风格 /* * SELECT 语句和其他的SQL查询命令不同,它需要处理查询结果。SQL语句的执行也需要使用 * mysqli_stmt对象中的execute方法,但与mysqli对象中的query方法不同,execute方法的饭 * 返回值并不是一个mysqli_result对象。mysqli_stmt对象提供了一种更为精巧的办法来处理 * select语句查询结果:在使用execute方法执行SQL语句完成查询之后,使用mysqli_stmt对象 * 中的bind_result方法,把查询结果的各个数据列绑定到一些PHP变量上;然后使用mysqli_stmt * 对象中的fetch方法把下一条结果记录读取到这些变量里。如果成功地读入下一条记录fetch方法 * 返回true,否则返回false,或者已经读完所有的结果返回false * * * 默认情况下,select查询结果将留在MySQL服务器上,等待fetch方法把记录逐条取回到PHP程序中 * ,赋给使用bind_result方法绑定的PHP变量上。如果需要对所有记录而不只是一小部分进行处理 * ,可以调用mysqli_stmt对象中的store_result方法,把所有结果一次全部传回到PHP程序中 * 这样做不仅更有效率,而且能减轻服务器的负担。store_result方法是可选的,除了读取数据 * 不改变任何东西。 */ <?php //1.连接数据库 require 'mysql_connect.php'; //2.准备SQL语句 $sql = "SElECT name,salary FROM staff WHERE salary>? LIMIT 5;"; //3.创建stmt对象 $stmt = mysqli_stmt_init($db); //4.检测SQL语句 if (mysqli_stmt_prepare($stmt, $sql)) { //5.参数绑定 该方法把预处理语句各有关参数绑定到一些PHP变量上, mysqli_stmt_bind_param($stmt, 'i',$salary); //i 表示int类型 $salary = 3000; //6.执行查询 执行准备的预处理语句 mysqli_stmt_execute($stmt); //7.获取结果集 从预处理语句中获取结果集 mysqli_stmt_store_result($stmt); //8.将结果集中的列与变量进行绑定 mysqli_stmt_bind_result($stmt,$name,$salary); //9.检测结果集是否为空 if(mysqli_stmt_num_rows($stmt)>0){ //10.遍历结果集 获取预处理语句结果的每条记录,并将相应的字段赋给绑定结果 while (mysqli_stmt_fetch($stmt)) { echo "[{$name}] => {$salary}<br>"; } } else { echo '没有符合条件的记录'; } } else { //SQL语句错误 exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt)); } //11.注销stmt对象 mysqli_stmt_close($stmt); //12.关闭数据库连接 mysqli_close($db);
运行实例 »
点击 "运行实例" 按钮查看在线实例
*预处理
1.预处理技术,可以将动态变量,从SQL语句中的分离出来,单独操作
2.解决了SQL注入的安全问题
3.预处理操作是通过一个叫预处理对象的工具来操作的: STMT
基本步骤:
1.创建stmt预处理对象
2.检测SQL语句
3.参数绑定
4.执行查询
5.注销stmt预处理对象
6.关闭数据库连接
//更新操作
实例
<?php //1.连接数据库 require 'mysql_connect.php' //更新 $sql = "UPDATE staff SET salary=? WHERE name= ?"; $salary = 8000; $name = '小龙女'; $stmt = mysqli_stmt_init($db); //检测预处理语句是够正确,成功返回true,错误返回false if (mysqli_stmt_prepare($stmt,$sql)){ mysqli_stmt_bind_param($stmt,"is",$salary,$name); //执行SQL语句 if (mysqli_stmt_execute($stmt)){ //判断是否执行成功,受影响的数量 if (mysqli_stmt_affected_rows($stmt)>0){ echo '成功的更新了'.mysqli_stmt_affected_rows($stmt).'条记录'; }else{ echo '没有新增任何数据'; } }else{ //返回SQL执行阶段的错误 exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt)); } }else{ exit(mysqli_stmt_errno($stmt).":".mysqli_stmt_error($stmt)); } mysqli_stmt_close($stmt); mysqli_close($db);
运行实例 »
点击 "运行实例" 按钮查看在线实例
//删除操作
实例
<?php require 'mysql_connect.php'; $sql = "DELETE FROM staff WHERE staff_id=?"; $staff_id = 5; $stmt = mysqli_stmt_init($db); //检测预处理语句是够正确,成功返回true,错误返回false if (mysqli_stmt_prepare($stmt,$sql)){ mysqli_stmt_bind_param($stmt,"i",$staff_id); //执行SQL语句 if (mysqli_stmt_execute($stmt)){ //判断是否执行成功,受影响的数量 if (mysqli_stmt_affected_rows($stmt)>0){ echo '成功的更新了'.mysqli_stmt_affected_rows($stmt).'条记录'; }else{ echo '没有新增任何数据'; } }else{ //返回SQL执行阶段的错误 exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt)); } }else{ exit(mysqli_stmt_errno($stmt).":".mysqli_stmt_error($stmt)); } mysqli_stmt_close($stmt); mysqli_close($db);
运行实例 »
点击 "运行实例" 按钮查看在线实例
一次新增多条
实例
<?php //1.连接数据库 require 'mysql_connect.php'; //2.准备SQL语句 $sql = "INSERT IGNORE staff SET name=?;"; //3.创建stmt对象 $stmt = mysqli_stmt_init($db); //4.检测SQL语句 if (mysqli_stmt_prepare($stmt, $sql)) { /* 参数绑定 */ mysqli_stmt_bind_param($stmt, "s", $name); $name = '武松'; /* 执行SQL语句 */ mysqli_stmt_execute($stmt); echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt); //再次添加新数据,只需要给新变量并执行一下就可以了 $name = '西门庆'; /* 执行SQL语句 */ mysqli_stmt_execute($stmt); echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt); $name = '武大郎'; /* 执行SQL语句 */ mysqli_stmt_execute($stmt); echo '<br>新增了'.mysqli_stmt_affected_rows($stmt).'条记录,主键是:'.mysqli_stmt_insert_id($stmt); } else { exit(mysqli_stmt_errno($stmt).':'.mysqli_stmt_error($stmt)); } /* 注销stmt对象 */ mysqli_stmt_close($stmt); /* 关闭数据库连接 */ mysqli_close($db);
运行实例 »
点击 "运行实例" 按钮查看在线实例