pdo的使用

 

 前言:

  PDO:PHP Data Object 一种PHP的数据对象,使用一个针对特定的数据库的PDO驱动

  PHP5以前都是用mysql函数去驱动mysql数据库,本来是打算在PHP6废除PHP中的mysql扩展,之后夭折,PHP5以后用对象方式的操作去驱动数据库,目的是为了提供一种轻型、清晰、方便的API统一各种不同RDBMS库的共有特征。

  优点:1.支持永久性连接,mysql多次连接数据将会使用用一个进程,减少服务器开销。

     2.对象方式编程

     3.PDO的单次执行效率可能不如mysql,但是大吞吐量下稳定性优于mysqli

     4.切换平台的兼容性更好

 


 

pdo的安装

 

  windows下:打开extension=php_pdo.dll extension_php_mysql.dll,重启服务器即可。

  linux下:详情查找相关资料。

 


 

手册里的pdo

pdo的使用


创建连接对象

pdo的使用


pdo的错误处理机制

  pdo和mysql一样,默认是”静默模式“,不显示mysql执行中的错误,pdo中分成三成错误模式:

  静默模式:错误不显示在页面;

  警告模式:对错误的处理是输出页面,可以自定义处理函数

  异常模式:Exception异常类,通过try监听,catch捕获,throw抛出

pdo的使用

 

 


pdo操作sql常用函数

 

 第一类:执行语句

  int exec ( string $statement )       #  无结果集 返回影响行数Int类型   例如:insert, uodate,  set names utf8等
  PDOStatement query ( string $statement ) #  有结果集 返回PDOStatement对象 例如:select, show等
  
 1 <?php
 2 
 3     header('Content-Type:text/html; charset=utf-8');
 4     $dsn  = 'mysql:host=localhost;dbname=demo;';
 5     $opts = array(PDO::ATTR_AUTOCOMMIT=>1, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
 6     try{
 7 
 8         $db   = new PDO($dsn, 'root', '', $opts);
 9 
10         /**
11          * exec()和query()的区别
12          */
13         $sql_insert  = "INSERT INTO pdo(name) VALUES('dishui')";
14         var_dump($db ->exec($sql_insert));echo '<br />';               #  返回结果是int 1
15         var_dump($db ->query($sql_insert));echo '<br />';              #  query没有结果集返回,返回的是PDOStatement对象,可以打印下看看
16         
17         $sql_select  = "SELECT id,name FROM pdo";
18         var_dump($db ->exec($sql_select));echo '<br />';               #  返回结果报错,合情合理。报错后为了测试注释掉
19         var_dump($result = $db ->query($sql_select));echo '<br />';    #  返回结果 同上个query。
20         /**
21          * query后得到是一个对象
22          * 然后通过三种方式:foreach循环(不建议使用)、
23          * PDOStatement::fetch()或者PDOStatement::fetchALL()获取数据
24          */
25         foreach ($result as $arr) {                                 #  返回关联数组和索引数组
26             print_r($arr);
echo '<br />';
27  } 28 $result ->setFetchMode(PDO::FETCH_ASSOC); # 设置取出数组的格式 ASSOC是关联数组 NUM索引数组 29 while($row = $result->fetch()){ 30 print_r($row);echo '<br />'; 31  } 32 var_dump($result->fetchALL()); 33 34 }catch(PDOException $e){ 35 echo $e->getMessage(); 36 }

 

 第二类:事务处理

  PDO::beginTransaction();
  PDO::commit();
  PDO::rollback();

 第三类:预处理

  预处理是PDO中运用最多的地方,上面的执行语句exec和query在实际的开发中应用的并不多,而且也不推荐使用。

  预处理是先将客户端准备好的sql语句发送到数据库服务器端进行编译,只编译一次,减少服务器开销,然后等待数据或者开始执行

  预处理的步骤:

 1 <?php
 2 
 3     header('Content-Type:text/html;charset=utf-8');
 4     $opts = array(
 5             PDO::ATTR_AUTOCOMMIT=>1,
 6             PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
 7             PDO::ATTR_PERSISTENT=>TRUE,
 8         );
 9     $db = new PDO('mysql:host=localhost;dbname=demo', 'root', '' ,$opts);
10     #  无结果集
11     $dbm = $db->prepare("INSERT INTO pdo(name,sex) VALUES(?,?)");//?是占位符
12     $dbm->bindParam(1,$name);//bindParam()绑定一个参数到指定的变量名。bindValue绑定一个值
13     $dbm->bindParam(2,$sex);
14     $dbn = $db->prepare("INSERT INTO pdo(name,sex) VALUES(:name,sex)");//:name同样是占位符
15     $dbn->bindParam(':name',$name);//绑定一个参数到指定的变量名。bindValue绑定一个值
16     $dbn->bindValue(':sex','man');
17     $name = 'xiaoli';
18     $sex = 'man';
19 
20     $dbm->execute();
21     echo $dbm->rowCount().'<br />';//影响行数,或者总行数
22     #  有结果集
23     $dbl = $db->prepare("SELECT * FROM pdo where sex=:sex");
24     $dbl->execute(array('sex'=>'man'));
25     echo '绑定列输出结果:';
26     $dbl->bindColumn(1,$id);
27     $dbl->bindColumn(2,$name);
28     $dbl->bindColumn(3,$sex);
29     while($dbl->fetch(PDO::FETCH_BOUND)){
30         echo '姓名:'. $name . ',性别:' . $sex . '<br />';
31     }
32     echo '<hr />';
33     die;
34     print_r($dbl->fetchAll(PDO::FETCH_ASSOC));

  

 其他:

    PDO::lastInsertId()获得上一次插入的ID

  PDO::errorCode()错误码

  PDO::errorInfo()错误信息

  PDO::quote()返回一个添加引号的字符串