mysqli面向对象的查询操作
<?php /** * Created by PhpStorm. * User: 714326675 * Date: 2018/9/1 * Time: 15:07 */ //mysqli数据库预处理查询 //设置数据库连接需要的信息 $db=['host'=>'127.0.0.1','username'=>'root','password'=>'','dbname'=>'test']; //报告除了警告外的所有错误 error_reporting(E_ALL ^E_WARNING); //连接数据库 $mysqli = new mysqli($db['host'],$db['username'],$db['password'],$db['dbname']); //判断连接结果 if($mysqli->connect_errno){ die('连接错误'.$mysqli->connect_errno.':'.$mysqli->connect_error); } //设置字符集 $mysqli->set_charset('utf8'); //sql语句 $sql="SELECT `id`,`name`,`salary` FROM `user` WHERE `salary`>?"; //初始化声明并返回 mysqli_stmt_prepare() 使用的对象。 $stmt=$mysqli->stmt_init(); //准备执行一个 SQL 语句 if($stmt->prepare($sql)){ //参数绑定 $stmt->bind_param('i',$salary); //设置参数 $salary=5000; //判断执行是否成功 //执行 if($stmt->execute()){ //获取结果集并放到缓存区 $stmt->store_result(); //将结果集中的列绑定到变量上 $stmt->bind_result($id,$name,$salary); //查询结果集是否不为空 if($stmt->num_rows >0){ //循环遍历结果集 //fetch()没错获取一条记录,并将指针自动下移 while($stmt->fetch()){ echo 'id====>',$id,'|姓名====>',$name,'|工资====>',$salary,'<br>'; } }else{ die('无数据'); } //释放结果集 $stmt->free_result(); }else{ //返回执行阶段的出错信息 exit($stmt->errno.':'.$stmt->error); } }else{ //返回sql检测阶段的出错信息 exit($stmt->errno.':'.$stmt->error); } //注销stmt对象 $stmt->close(); //关闭连接 $mysqli->close();
点击 "运行实例" 按钮查看在线实例
问答:PDO的优势?
PDO有非常多的操作却是MySQL扩展库所不具备的:
1:PDO真正的以底层实现的统一接口数库操作接口,不管后端使用的是何种数据库,如果代码封装好了以后,应用层调用基本上差不多的,当后端数据库更换了以后,应用层代码基本不用修改.
2:PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3:PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级.
4:PDO可以防止SQL注入,确保数据库更加安全
三.PDO连接数据库
<?php /** * Created by PhpStorm. * User: 714326675 * Date: 2018/9/1 * Time: 19:07 */ //PDO PHP数据对象,是PHP操作所有数据库的抽象层,提供了一个统一的访问接口 //连接pdo //设置数据源 $dsn='mysql:host=127.0.0.1;dbname=test'; $user='root'; $passwd=''; //实例化PDO类,创建PDO对象,并完成对数据库的连接 try{ $pdo = new PDO($dsn,$user,$passwd); echo '<h2>连接成功啦</h2>'; }catch (PDOException $e){ exit('connect ERROR!:'.$e->getMessage()); } //关闭连接方式 //方式1 //$pdo=null; //方式2 //unset($pdo);
点击 "运行实例" 按钮查看在线实例
四.数据库新增数据
<?php /** * PDO * 数据的录入 */ //设置数据源 $dsn='mysql:host=127.0.0.1;dbname=test'; //设置用户名 $user='root'; //设置密码 $passwd=''; //连接数据库,新建pdo $pdo=new PDO($dsn,$user,$passwd); //sql语句 $sql="INSERT `user` SET `name`=:name,`salary`=:salary,`email`=:email,`passwd`=sha1(:passwd); "; //创建预处理对象 $stmt=$pdo->prepare($sql); //设置需要录入的数据信息 $data=['name'=>'赵大','salary'=>12435,'email'=>'zd@qq.com','passwd'=>'abc']; //绑定参数 $stmt->bindParam(':name',$data['name'],PDO::PARAM_STR); $stmt->bindparam(':salary',$data['salary'],PDO::PARAM_INT); $stmt->bindParam(':email',$data['email'],2); $stmt->bindParam(':passwd',$data['passwd'],2); //执行语句与判断执行结果 if($stmt->execute()){ echo '<h3>成功添加了',$stmt->rowCount(),'条记录</h3>'; }else{ echo '<h3>添加失败</h3>>'; print_r($stmt->errorInfo()); exit(); } //关闭 $stmt=null; //关闭连接 $pdo=null;
点击 "运行实例" 按钮查看在线实例
五.PDO更新数据
<?php /** * 更新数据 */ //连接数据库 $pdo= new PDO('mysql:host=127.0.0.1;dbname=test','root',''); //sql语句 $sql="UPDATE `user` SET `salary`=:salary WHERE `id`=:id;"; //创建预处理对象 $stmt=$pdo->prepare($sql); //执行 $stmt->execute(['salary'=>3,'id'=>5]); //输出执行成功记录行数 echo '<h3>成功更新了',$stmt->rowCount(),'条数据</h3>'; //关闭$stmt $stmt=null; //关闭连接 $pdo=null;
点击 "运行实例" 按钮查看在线实例
六.PDO删除数据
<?php /** * 删除记录 */ $pdo= new PDO('mysql:host=127.0.0.1;dbname=test','root',''); //sql语句 $sql="DELETE FROM `user` WHERE `id`=:id;"; //创建预处理对象 $stmt=$pdo->prepare($sql); //执行 $stmt->execute(['id'=>4]); //输出执行成功记录行数 echo '<h3>成功删除了',$stmt->rowCount(),'条数据</h3>'; //关闭$stmt $stmt=null; //关闭连接 $pdo=null;
点击 "运行实例" 按钮查看在线实例
七.PDO查询数据
<?php /** * Created by PhpStorm. * User: 714326675 * Date: 2018/9/1 * Time: 22:34 */ $pdo= new PDO('mysql:host=127.0.0.1;dbname=test','root',''); //sql语句 //$sql="SELECT * FROM `user` WHERE `id`<>:id;";//不等于 //$sql="SELECT * FROM `user` WHERE `id`<=:id;";//小于等于 //$sql="SELECT * FROM `user` WHERE `id`=:id;";//等于 //$sql="SELECT * FROM `user` WHERE `id`>:id;";//大于 $sql="SELECT * FROM `user` WHERE `id`<:id;";//小于 //创建预处理对象 $stmt=$pdo->prepare($sql); //执行 $stmt->execute(['id'=>5]); //输出执行成功记录行数 echo '<h3>成功查询了',$stmt->rowCount(),'条数据</h3>'; //遍历数据 while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ echo var_export($row),'<br>'; } //关闭$stmt $stmt=null; //关闭连接 $pdo=null;
点击 "运行实例" 按钮查看在线实例
<?php /** * Created by PhpStorm. * User: 714326675 * Date: 2018/9/2 * Time: 10:39 */ //连接数据库 $pdo=new PDO('mysql:host=127.0.0.1;dbname=test','root',''); //sql语句 $sql="SELECT `id`AS 序号,`name` AS 名字,`salary` AS 工资 FROM `user` WHERE `id` < :id;"; //创建预处理 $stmt=$pdo->prepare($sql); //设置参数 $data=['id'=>56]; //绑定参数:可省略 //$stmt->bindParam(':salary',$data['id'],PDO::PARAM_INT); //执行 $stmt->execute($data); //将结果集中的列绑定到变量上 //$stmt->bindColumn('序号',$id); //$stmt->bindColumn('名字',$name); //$stmt->bindColumn('工资',$salary); //用列变量遍历结果集 //while ($stmt->fetch(PDO::FETCH_BOUND)) { // echo 'id:',$id,'姓名: ',$name, ', 工资: ', $salary, '<br>'; //} //遍历结果集 //while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ // echo var_export($row),'<br>'; //} //获取一行一列,无法获取同一行其它列 //echo $stmt->fetchColumn(0),'<br>'; //指针自动下移,获取二行2列 //echo $stmt->fetchColumn(1),'<br>'; $stmt=$pdo->prepare("SELECT * FROM `user` WHERE `salary` > :salary;"); $stmt->execute(['salary'=>10000]); //结果看起来正确,但其实是有问题的,不要这样做 echo '工资大于10000的人数',$stmt->rowCount(); echo '<hr>'; //这才是正确方法 //count(*) //$stmt->fetchColumn() $stmt=$pdo->prepare("SELECT count(*) FROM `user` WHERE `salary` > :salary;"); $stmt->execute(['salary'=>10000]); echo '工资大于10000的人数',$stmt->fetchColumn();
点击 "运行实例" 按钮查看在线实例
<?php /** * Created by PhpStorm. * User: 714326675 * Date: 2018/9/2 * Time: 11:05 */ //连接数据库 $pdo=new PDO('mysql:host=127.0.0.1;dbname=test','root',''); //sql语句 $sql="SELECT `name`,`email` FROM `user` WHERE `id` < :id;"; //创建预处理 $stmt=$pdo->prepare($sql); //执行 $stmt->execute(['id'=>5]); //将结果列绑定到变量中 $stmt->bindColumn('name',$name); $stmt->bindColumn('email',$email); //遍历结果集中的数据 while($stmt->fetch(PDO::FETCH_ASSOC)){ echo '姓名:',$name,',邮箱:',$email,'<hr>'; } //注销 $stmt=null; //关闭连接 $pdo=null;
点击 "运行实例" 按钮查看在线实例
八.问答: 获取结果集记录数量的正确方式是什么?
查询中使用count(*) 把结果整合成一列
然后使用$stmt->fetchColumn();获取记录数量
九.总结:
PDO中的dsn为数据源,格式:'mysql:host=127.0.0.1;dbname=test'
连接数据库为new PDO(参数dsn,参数username,参数passwd)
还需要一条sql语句
需要创建预处理对象$stmt=$pdo->prepare($sql);
再弄参数$data=['name'=>'郭靖'] 参数弄成数组
参数绑定,这部分其实可以省略:$stmt->bindParam(':name',$data['name'],PDO::PARAM_STR);
执行:$stmt->execute();,如果第六部分省略就要这样写:$stmt->exexute($data);
执行完后需要注销$stmt和关闭$pdo:$stmt=null;$pdo=null; 当然也可以不写,不写的话关闭脚本会自动注销关闭