设为首页 收藏本站
查看: 749|回复: 0

[经验分享] PHP数据库抽象层--PDO(PHP Data Object) [一]

[复制链接]

尚未签到

发表于 2015-8-27 08:53:47 | 显示全部楼层 |阅读模式
  1、简介:(PDO数据库访问抽象层,统一各种 数据库的访问接口 )


  • PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。
  • PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。
  • (http://php.net/manual/zh/intro.pdo.php)

2、特点
DSC0000.png

3、开启PDO
     在 php.ini 中的 php_pdo.dll后面启用。例如:


  • extension=php_pdo_mysql.dll
  • extension=php_pdo_pgsql.dll

     DLL 文件应该在系统的extension_dir 中存在。更改 php.ini 文件后需要重启 PHP 服务才能使新的配置指令生效。
DSC0001.png

4、PDO连接数据库
             DSC0002.jpg
       更加详细的信息:http://php.net/manual/zh/pdo.construct.php
         DSC0003.png
      4.1、通过参数形式

  • 1<?php
  • 2// 通过参数形式连接数据库
  • 3try{
  • 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  • 5 $name ='root';
  • 6 $passwd ='root';
  • 7 $pdo =new PDO($dsn, $name, $passwd);
  • 8 var_dump($pdo);
  • 9}catch(PDOException $e){
  • 10 echo $e->getMessage();
  • 11}
  • 12

      4.2、通过URI形式
              创建pdo_uri_conn.txt文件

  • mysql:dbname=pdotest;host=localhost;

             Uri连接数据库

  • <?php
  • // 通过参数形式连接数据库
  • try{
  • $dsn ='uri:/var/www/html/php-code/pdo/pdo_uri_conn.txt';
  • $name ='root';
  • $passwd ='root';
  • $pdo =new PDO($dsn, $name, $passwd);
  • var_dump($pdo);
  • }catch(PDOException $e){
  • echo $e->getMessage();
  • }

      4.3、通过配置php.ini文件的形式连接数据库
               DSC0004.jpg
             在你的php.ini文件的加入这一句; 注意重启Apache服务器
             链接数据库
             DSC0005.jpg
        注意:
                连接数据成功后,返回一个 PDO 类的实例给脚本,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。

  • <?php

  • ......

  • // 现在运行完成,在此关闭连接
  • $dbh =null;

        
5、PDO对象使用
    DSC0006.jpg
   
    5.1、exec()方法
            exec()方法执行一条sql语句,返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则 PDO::exec() 返回 0
            注意:PDO::exec() 不会从一条 SELECT 语句中返回结果。对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
            5.1.1、 使用 exec() 方法完成建表

  • 1<?php
  • 2// 通过参数形式连接数据库
  • 3try{
  • 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  • 5 $name ='root';
  • 6 $passwd ='root';
  • 7 $pdo =new PDO($dsn, $name, $passwd);
  • 8 $sql =<<<EOF
  • 9 CREATE TABLE IF NOT EXISTS user(
  • 10 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  • 11 name VARCHAR(20) NOT NULL UNIQUE,
  • 12 passwd VARCHAR(32) NOT NULL,
  • 13 email VARCHAR(30) NOT NULL
  • 14);
  • 15 EOF;
  • 16// exec 对于没有受影响的行数将返回0
  • 17 $res = $pdo->exec($sql);
  • 18 var_dump($res);
  • 19// 现在运行完成,在此关闭连接
  • 20 $pdo =null;
  • 21}catch(PDOException $e){
  • 22 echo $e->getMessage();
  • 23}
  • 24
  • 25

            5.1.2、使用exec() 插入数据

  • 1<?php
  • 2// 通过参数形式连接数据库
  • 3try{
  • 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  • 5 $name ='root';
  • 6 $passwd ='root';
  • 7 $pdo =new PDO($dsn, $name, $passwd);
  • 8 $sql ="
  • 9 INSERT INTO user (name, passwd, email)
  • 10 VALUES('wangxb', MD5('123'), 'wangxb@mail.com'),
  • 11 ('wangxb1', MD5('123'), 'wangxb@mail.com'),
  • 12 ('wangxb2', MD5('123'), 'wangxb@mail.com')
  • 13 ";
  • 14// exec 对于没有受影响的行数将返回0
  • 15 $res = $pdo->exec($sql);
  • 16 var_dump($res);
  • 17// 返回最后插入行的ID或序列值
  • 18 echo $pdo->lastInsertId();
  • 19// 现在运行完成,在此关闭连接
  • 20 $pdo =null;
  • 21}catch(PDOException $e){
  • 22 echo $e->getMessage();
  • 23}
  • 24

            返回:
                     DSC0007.png
        
        5.1.3、exec()执行更新和删除与插入类似,这里不再赘述。

        5.1.4、exec()方法对select是没有作用的,因为没有受影响的行数,虽然这么做没有什么程序语法上的错误,但是执行select时将返回 int(0),取不出我们想要的任何东西,所以exec不适合执行select语句。
   
    5.2、errorCode()和errorInfo()方法返回错误信息
            PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
            PDO::errorInfo — 返回错误信息的一个数组

0: SQLSTATE error code

1: specific error code.

2: specific error message

  • 1<?php
  • 2/*
  • 3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
  • 1 <?php
  • 2 /*
  • 3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
  • 4 */
  • 5try{
  • 6 $dsn ='mysql:host=localhost;dbname=pdotest';
  • 7 $name ='root';
  • 8 $passwd ='root';
  • 9 $pdo =new PDO($dsn, $name, $passwd);
  • 10// 我们这里插入的一个没有的表 user123 中
  • 11 $sql ="
  • 12 INSERT INTO user123 (name, passwd, email)
  • 13 VALUES('wangxb', MD5('123'), 'wangxb@mail.com')
  • 14 ";
  • 15//
  • 16 $res = $pdo->exec($sql);
  • 17if(false=== $res){
  • 18// errorCode 获取跟数据库句柄上一次操作相关的 SQLSTATE
  • 19 echo $pdo->errorCode();
  • 20print"\n";
  • 21// errorInfo 返回一个错误信息数据:
  • 22// 0: SQLSTATE error code
  • 23// 1: specific error code.
  • 24// 2: specific error message
  • 25 print_r($pdo->errorInfo());
  • 26returnfalse;
  • 27}
  • 28 var_dump($res);
  • 29// 返回最后插入行的ID或序列值
  • 30 echo "最后一天插入的信息ID:".$pdo->lastInsertId();
  • 31// 现在运行完成,在此关闭连接
  • 32 $pdo =null;
  • 33}catch(PDOException $e){
  • 34 echo $e->getMessage();
  • 35}
  • 36

运行: DSC0008.png
我们在mysql客户端执行相同语句
DSC0009.png
可以看到 errorInfo()返回的信息其实是将mysql错误信息以数组的形式返回


    5.3、query()方法执行查询
            query()方法虽然可以执行任何sql语句,但是更多的时候是执行select,对于insert、update、delete等使用exec()方法      

  • 1<?php
  • 2/*
  •   3  * 使用exec方法执行插入语句
  •   4  */
  • 5// 通过参数形式连接数据库
  • 6try{
  • 7     $dsn ='mysql:host=localhost;dbname=pdotest';
  • 8     $name ='root';
  • 9     $passwd ='root';
  • 10     $pdo =new PDO($dsn, $name, $passwd);
  • 11//$sql = "SELECT * FROM user WHERE id=12";
  • 12     $sql ="SELECT * FROM user";
  • 13// query 方法执行将返回一个PDOStatment对象
  • 14     $stmt = $pdo->query($sql);
  • 15if(!$pdo &&!$stmt){
  • 16         var_dump($pdo->errorInof());
  • 17}
  • 18// 对于query返回的PDOStatment对象,我们同样可是使用foreach方法来遍历数据其中的数据
  • 19foreach($stmt as $row){
  • 20         var_dump($row);
  • 21         echo '<hr>';
  • 22}
  • 23
  • 24//
  • 25     echo '-------------------<br>';
  • 26     var_dump($stmt->fetch());
  • 27     echo '-------------------<br>';
  • 28
  • 29// prepare方法是为execute准备一个statmentObj
  • 30     $sth  =  $pdo -> prepare ("SELECT name, id FROM user");
  • 31     $sth -> execute ();
  • 32     echo '++++++++++++++++++++++++';
  • 33     var_dump($sth->fetch());
  • 34     echo '++++++++++++++++++++++++';
  • 35     var_dump($stmt);
  • 36// 现在运行完成,在此关闭连接
  • 37     $pdo =null;
  • 38}catch(PDOException $e){
  • 39     echo $e->getMessage();
  • 40}
  • 41
  • 42
  • 43



    5.4、prepare()和execute()方法

  • 1<?php
  • 2/*
  •   3  * 使用exec方法执行插入语句
  •   4  */
  • 5// 通过参数形式连接数据库
  • 6try{
  • 7     $dsn ='mysql:host=localhost;dbname=pdotest';
  • 8     $name ='root';
  • 9     $passwd ='root';
  • 10     $pdo =new PDO($dsn, $name, $passwd);
  • 11
  • 12/*
  • 13      * 使用prepare和execute方法形式
  • 14      */
  • 15     $id1 =12;
  • 16     $id2 =13;
  • 17// 利用占位符形式
  • 18     $sql ="SELECT * FROM user WHERE id=? OR id=?";
  • 19     $sth  =  $pdo -> prepare ($sql);
  • 20     $sth -> execute(array($id1, $id2));
  • 21     var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
  • 22
  • 23     echo '<hr>';
  • 24// 使用参数形式
  • 25     $sql_1 ="SELECT id, name FROM user WHERE id= :id";
  • 26     $sth_1  =  $pdo -> prepare ($sql_1);
  • 27     $sth_1 -> execute(array('id'=>$id1));
  • 28     var_dump($sth_1->fetchAll(PDO::FETCH_ASSOC));
  • 29
  • 30     echo '<hr>';
  • 31// 使用bindParam方式
  • 32     $sql_2 ="SELECT * FROM user WHERE id=? OR id=?";
  • 33     $sth_2  =  $pdo -> prepare ($sql_2);
  • 34     $sth_2->bindParam(1, $id1, PDO::PARAM_INT);
  • 35     $sth_2->bindParam(2, $id2, PDO::PARAM_INT);
  • 36     $sth_2 -> execute();
  • 37     var_dump($sth_2->fetchAll(PDO::FETCH_ASSOC));
  • 38
  • 39// 现在运行完成,在此关闭连接
  • 40     $pdo =null;
  • 41}catch(PDOException $e){
  • 42     echo $e->getMessage();
  • 43}
  • 44

             DSC00010.png

    5.5、getAttribute ( int $attribute ) 和 setAttribute ( int $attribute , mixed $value )  方法

  • 1<?php
  • 2/*
  •   3  * 使用exec方法执行插入语句
  •   4  */
  • 5// 通过参数形式连接数据库
  • 6try{
  • 7     $dsn ='mysql:host=localhost;dbname=pdotest';
  • 8     $name ='root';
  • 9     $passwd ='root';
  • 10     $pdo =new PDO($dsn, $name, $passwd);
  • 11     $sql ="SELECT * FROM user";
  • 12     echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  • 13     echo '<br/>';
  • 14     echo 'PDO默认的错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
  • 15
  • 16     echo '<br/>';
  • 17//现在我们重设自动提交
  • 18     $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
  • 19     echo "重设后的自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  • 20
  • 21// 现在运行完成,在此关闭连接
  • 22     $pdo =null;
  • 23
  • 24// 我们也可以在new一个PDO对象时,利用传递参数中的第四个参数(可省略)来设置我们此次连接数据库时的各项参数
  • 25// (我们可以在这里找到所有的设置项:http://php.net/manual/zh/pdo.constants.php)
  • 26// 就像下面这样
  • 27     $dsn ='mysql:host=localhost;dbname=pdotest';
  • 28     $name ='root';
  • 29     $passwd ='root';
  • 30     $option = array(
  • 31                     PDO::ATTR_AUTOCOMMIT => O,
  • 32                     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  • 33);
  • 34     $pdo =new PDO($dsn, $name, $passwd, $option);
  • 35     echo '<hr/>';
  • 36     echo '使用option设置后';
  • 37     echo '<br/>';
  • 38     echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  • 39     echo '<br/>';
  • 40     echo 'PDO错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
  • 41}catch(PDOException $e){
  • 42     echo $e->getMessage();
  • 43}
  • 44

                           DSC00011.png
                        

  


来自为知笔记(Wiz)  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104766-1-1.html 上篇帖子: {php 数组} 下篇帖子: 常量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表