一.MySQLi面向对象中的查询操作
mysqli查询实例
<?php /** 预处理查询数据 */ require 'demo1.php'; //sql语句 $sql = "SELECT `id`,`name`,`age`,`salary` FROM `staff` WHERE salary> ? ;"; //创建预处理对象 方法一 //$stmt = $mysqli->prepare($sql); //创建预处理对象 方法二 $stmt = $mysqli->stmt_init(); if($stmt->prepare($sql)){ //绑定参数 $stmt->bind_param('i',$salary); //设置参数 $salary=900; //执行查询 if($stmt->execute()){ //将结果集放入缓存区 $stmt->store_result(); //把结果集中的列绑定到变量中 $stmt->bind_result($id,$name,$age,$salary); //结果集不为空时遍历数据 if($stmt->affected_rows >0){ $count = $stmt->affected_rows; echo '返回数据'.$count.'条'; //循环遍历结果集 //fetch()每次获取一条记录,并将指针自动下移 while ($stmt->fetch()){ echo '<p>id:'.$id.'name:'.$name.'age:'.$age.'salary:'.$salary.'</p>'; } }else{ die('没有返回数据'); } //释放结果集 $stmt->free_result(); }else{ //执行错误 die($stmt->error.':'.$stmt->error); } }else{ die($stmt->errno.':'.$stmt->error); } //注销对象资源 $stmt->close(); //关闭mysql连接 $mysqli->close();
运行实例 »
点击 "运行实例" 按钮查看在线实例
demo1.php
<?php /**连接数据库 */ require ('config.php'); $mysqli = new mysqli($db['host'],$db['user'],$db['pass'],$db['name']); if($mysqli->connect_errno){ die('数据库连接出错'.$mysqli->connect_errno.$mysqli->connect_error); } //echo '<h1>连接成功</h1>'; //$mysqli=>select_db($db['name']); $mysqli->set_charset($db['charset']);
运行实例 »
点击 "运行实例" 按钮查看在线实例
config.php
<?php /** * 数据库配置 */ error_reporting(E_ALL); $db=[ 'host'=>'127.0.0.1', 'user'=>'root', 'pass'=>'admin', 'name'=>'php', 'charset'=>'utf8', ];
运行实例 »
点击 "运行实例" 按钮查看在线实例
二.PDO 的优势
1.兼容各类不同类型的数据库,相同的代码可操作不同的数据库很灵活.
2.通过预处理对象来执行SQL可以有效提高安全问题.
(1).数据库连接实例
<?php /**PDO PHP数据对象,是php操作所有数据库的抽象层,提供了一个统一的访问接口 */ //数据源:设置数据库的类型,以及数据库服务器和默认数据库 $dsn = 'mysql:host=127.0.0.1; dbname=php'; $user = 'root'; $pass = 'admin'; //实例化PDO类,创建pdo对象,并完成了数据库的连接 try{ $pdo = new PDO($dsn, $user, $pass); echo '<h1>连接成功</h1>'; } catch (PDOException $e) { die('connect ERROR!:'. $e->getMessage()); } //关闭连接 //$pdo = null; //unset($pdo);
运行实例 »
点击 "运行实例" 按钮查看在线实例
(2)PDO添加数据实例
<?php /**PDO新增操作 */ //1.连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin'); //2.准备SQL语句,占位符不用? 用"命名点位符" $sql = "INSERT IGNORE `user` SET `name`= :name ,`email`= :email, `password`=sha1(:password); "; //3.创建预处理对象 $stmt = $pdo->prepare($sql); //echo $stmt->queryString;exit; 查看当前语句 //4.设置参数 //$data=['name'=>'天地','email'=>'td@php.cn','password'=>'123']; //4.执行增加 $stmt->execute(['name'=>'天地','email'=>'td@php.cn','password'=>'123']); echo '<h3>成功添加了'.$stmt->rowCount().'条记录</h3>'; /* if($stmt->execute()){ //rowCount:返回受影响的记录数 if($stmt->rowCount() > 0){ echo '<h3>成功添加了'.$stmt->rowCount().'条记录</h3>'; }else{ echo '没有数据添加'; } }else{ echo '<h2>增加失败</h2>'; print_r($stmt->errorInfo()); exit(); }*/ //注销对象 $stmt=null; //关闭pdo连接 $pdo= null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
(3)pdo更新
<?php /**更新操作 */ //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin'); $sql = "UPDATE `user` SET `email`=:email WHERE `id`=:id;"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行 if($stmt->execute(['email'=>'11s1@qq.com','id'=>5])){ if($stmt->rowCount() > 0){ echo '更新成功'.$stmt->rowCount().'条记录'; }else{ echo '没有数据更新'; } }else{ echo '执行错误<pre>'.print_r($stmt->errorInfo(),true); } //关闭对象 $stmt=null; //关闭连接 $pdo=null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
(4)删除实例
<?php /**删除操作 */ //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin'); $sql = "DELETE FROM `user` WHERE `id`=:id;"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行 if($stmt->execute(['id'=>'3'])){ if($stmt->rowCount() > 0){ echo '删除成功'.$stmt->rowCount().'条记录'; }else{ echo '没有数据删除'; } }else{ echo '执行错误<pre>'.print_r($stmt->errorInfo(),true); } //关闭对象 $stmt=null; //关闭连接 $pdo=null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
(5)PDO查询实例
<?php /**查询操作 */ //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin'); //sql语句 $sql = "SELECT `name`,`email` FROM `user` WHERE `id` > :id;"; //创建预处理对象 $stmt=$pdo->prepare($sql); //执行查询 $stmt->execute(['id'=>5]); //一次性取出 弊端是数据量大时会导致崩溃 爆仓 除非可确定取出多少数据 //$rows = $stmt->fetchAll(); //var_dump($rows); /*foreach($rows as $row){ echo 'name:'.$row['name'].'--email:'.$row['email'].'<br>'; } echo '<hr>'; while(list($a,$b) = each($rows)){ echo 'name:'.$b['name'].'--email:'.$b['email'].'<br>'; }*/ while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ //PDO::FETCH_ASSOC 只读取关联部分 echo var_export($row),'<br>'; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
(6)正确的获取结果集记录数量是用 COUNT(*)然后再用 $stmt->fetchColumn()来进行获取而$stmt->rowCount()不是准确的,有时会出问题.如下:
获取结果集记录数实例
<?php /**查询操作 */ //连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','admin'); //sql语句 $sql = "SELECT `id`,`name`,`email` FROM `user` WHERE `id` < :id;"; //创建预处理对象 $stmt=$pdo->prepare($sql); //执行查询 $stmt->execute(['id'=>5]); //获取第一行一列,无法获取同一行的其他列 //echo $stmt->fetchColumn(0),'<br>'; //指针自动下移,第二行第二列 //echo $stmt->fetchColumn(1),'<br>'; //$stmt->rowCount() $stmt = $pdo->prepare("SELECT * FROM `staff` WHERE `salary`>:salary;"); $stmt->execute(['salary'=>500]); echo'工资大于一千的人数'.$stmt->rowCount(); //$stmt->rowCount(); 结果看似正确,但有时会出错,统计不到数据 echo '<hr>'; //确实获取方式应该用下面方法 $stmt = $pdo->prepare("SELECT COUNT(*) FROM `staff` WHERE `salary`>:salary;"); $stmt->execute(['salary'=>500]); echo'工资大于一千的人数'.$stmt->fetchColumn();
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:主要学习通过mysqli的实例化对象对数据库进行操作,PDO与之相比感觉更容易学习,解理起来更快速.