0830作业
<?php echo '<h3> 0830作业第一题:mysqli预处理查询操作 </h3>'; echo '<h5> 查询:年龄大于25,工资大于8000</h5>'; //连接数据库 require 'demo1.php'; //准备SQL语句 $sql = "SELECT `id`,`name`,`age` ,`salary` FROM `staff` WHERE `age` > ? && `salary` > ?;"; // 创建预处理对象,mysqli_stmt_init() 函数初始化声明并返回 mysqli_stmt_prepare() 使用的对象。 $stmt = $mysqli->stmt_init(); if ($stmt->prepare($sql)) { //绑定参数,绑定一个参数到指定的变量名,将用户数组与sql语句的占位符进行绑定 $stmt->bind_param('ii', $age,$salary); //设置参数 $age =25; $salary=8000; if ($stmt->execute()) { //获取结果集并放到缓存区 $stmt->store_result(); //将结果集中的列绑定到变量上 $stmt->bind_result($id,$name,$age, $salary); //结果集是否不为空,只有不为空的时候才遍历 if ($stmt->num_rows > 0) { // 循环遍历结果集,fetch()每次获取一条记录,并将指针自动下移 while ($stmt->fetch()) { echo '<p>id:'.$id.'---姓名:' .$name.'---年龄:' .$age.'---工资:' .$salary.'</p>'.'<hr>'; } } else { exit('<p>当前表中没有数据</p>'); } // 释放结果集 $stmt->free_result(); } else { //返回执行阶段的出错信息,$stmt->errno出错代码,出错描述 exit($stmt->errno. ': ' . $stmt->error); } } else { //返回sql语句检测阶段的出错信息 exit($stmt->errno. ': ' . $stmt->error); } //注销stmt对象 $stmt->close(); //关闭连接 $mysqli->close();
点击 "运行实例" 按钮查看在线实例
2.问答:PDO的优势?
PDO有非常多的操作却是MySQL扩展库所不具备的:
1、PDO真正的以底层实现的统一接口数库操作接口,不管后端使用的是何种数据库,
如果代码封装好了以后,应用层调用基本上差不多的,当后端数据库更换了以后,应用层代码基本不用修改.
2、PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3、PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级.
4、PDO可以防止SQL注入,确保数据库更加安全使用语句预处理将帮助你免于SQL注入攻击。
总之就是,PDO应用的比mysqli较广泛,使用起来较方便,PDO可以使用相同的sql语句执行不同的数据库,
而mysqli只能执行mysql一种数据库。并且PDO有预处理,一条预处理语句是一条预编译的 SQL 语句,它可以被使用多次,
每次只需将数据传至服务器。而且可以对使用占位符的数据进行安全处理,防止SQL注入攻击。
<?php /** * PDO PHP数据对象,是PHP操作所有数据库的抽象层,提供了一个统一的访问接口 */ echo '<h4> 0830作业第3题:编程:PDO 连接数据库 </h4>'; // 数据源:设置数据库的类型,以及数据库服务器和默认的数据库 $dsn = 'mysql:host=127.0.0.1; dbname=php'; //用户名 $user = 'root'; //密码 $pass = 'root'; //实例化PDO类,创建pdo对象,并完成了数据库的连接 try { //代码区 $pdo = new PDO($dsn, $user, $pass); //echo '<h2>连接成功</h2>'; } catch (PDOException $e) { //异常处理 die('Connect ERROR! :'. $e->getMessage()); } // 关闭连接 //$pdo = null; //unset($pdo);
点击 "运行实例" 按钮查看在线实例
<?php /** * 新增记录 */ echo '<h4> 0830作业第4题:编程:PDO新增数据 </h4>'; //1连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root'); //2.准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "INSERT `user` SET `name`= :name , `email`= :email, `password`= sha1(:password)"; //3.创建预处理对象 $stmt = $pdo->prepare($sql); //4.执行添加 $stmt->execute(['name'=>'周芷若1','email'=>'zzr@php.cn','password'=>'66896']); $stmt->execute(['name'=>'周芷若2','email'=>'123@php.cn','password'=>'66698']); $stmt->execute(['name'=>'周芷若3','email'=>'345@php.cn','password'=>'80666']); $stmt->execute(['name'=>'周芷若4','email'=>'789@php.cn','password'=>'69780']); $stmt->execute(['name'=>'周芷若5','email'=>'r77@php.cn','password'=>'12676']); echo '<h3>成功添加了'.$stmt->rowCount().'条记录</h3>';
点击 "运行实例" 按钮查看在线实例
<?php echo '<h4> 0830作业第5题:编程:PDO更新数据 </h4>'; //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root'); //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "UPDATE `user` SET `name`= :name ,`email`= :email WHERE `id` = :id"; //创建预处理对象 $stmt = $pdo->prepare($sql); $stmt->execute(['name'=>'赵敏','email'=>'888@163.com','id'=>90]); echo '<h3>成功更新了'.$stmt->rowCount().'条记录</h3>'; $stmt = null; // 关闭连接 $pdo = null;
点击 "运行实例" 按钮查看在线实例
<?php /** * 删除记录 */ echo '<h4> 0830作业第6题:编程:PDO删除数据 </h4>'; //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root'); //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "DELETE FROM `user` WHERE `id`>:id"; //创建预处理对象 $stmt = $pdo->prepare($sql); if ($stmt->execute(['id'=>2])) { // rowCount(): 返回受影响的记录数量 echo '<h3>成功删除了'.$stmt->rowCount().'条记录</h3>'; } else { echo '<h3>无删除</h3>'; // errorInfo() 返回一个关于上一次语句句柄执行操作的错误信息的数组 // 0 SQLSTATE 错误码, 1具体驱动错误码, 2具体驱动错误信息。 print_r($stmt->errorInfo()); exit(); } $stmt = null; // 关闭连接 $pdo = null;
点击 "运行实例" 按钮查看在线实例
<?php echo '<h4> 0830作业第7题:编程:PDO查询数据 </h4>'; //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root'); //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "SELECT `name`,`email` FROM `user` WHERE `id`>:id"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行查询 $stmt->execute(['id'=>88]); // 一次性取出 //$rows = $stmt->fetchAll(); //foreach ($rows as $row) { // echo 'name: ',$row['name'],', email: ',$row['email'],'<br>'; //} //因为fetch()取出来的数据,包括索引数组和关联数组 //PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组,就是结果只显示关联数组部分 while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo var_export($row),'<br>'; }
点击 "运行实例" 按钮查看在线实例
8.问答:获取结果集记录数量的正确方式是什么?
方式1、使用count()来计算查询结果集转换为数组后的单元数再用fetchColumn()来获取结果集
方式2、rowCount()是返回SQL语句执行后影响的行数,结果看上去是正确的,但是是有问题的
总之,方式1 使用count()再用fetchColumn()来获取结果集记录数量的正确方式。