1、简介:(PDO数据库访问抽象层,统一各种 数据库的访问接口 )

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

 
3、开启PDO
     在 php.ini 中的 php_pdo.dll后面启用。例如:
  1. extension=php_pdo_mysql.dll
  2. extension=php_pdo_pgsql.dll
     DLL 文件应该在系统的extension_dir 中存在。更改 php.ini 文件后需要重启 PHP 服务才能使新的配置指令生效。

 
4、PDO连接数据库
            
       更加详细的信息:http://php.net/manual/zh/pdo.construct.php
        
      4.1、通过参数形式
  1. 1<?php
  2. 2// 通过参数形式连接数据库
  3. 3try{
  4. 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  5. 5 $name ='root';
  6. 6 $passwd ='root';
  7. 7 $pdo =new PDO($dsn, $name, $passwd);
  8. 8 var_dump($pdo);
  9. 9}catch(PDOException $e){
  10. 10 echo $e->getMessage();
  11. 11}
  12. 12
      4.2、通过URI形式
              创建pdo_uri_conn.txt文件
  1. mysql:dbname=pdotest;host=localhost;
             Uri连接数据库
  1. <?php
  2. // 通过参数形式连接数据库
  3. try{
  4. $dsn ='uri:/var/www/html/php-code/pdo/pdo_uri_conn.txt';
  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. }
      4.3、通过配置php.ini文件的形式连接数据库
              
             在你的php.ini文件的加入这一句; 注意重启Apache服务器
             链接数据库
             
        注意:
                连接数据成功后,返回一个 PDO 类的实例给脚本,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。
  1. <?php
  2. ......
  3. // 现在运行完成,在此关闭连接
  4. $dbh =null;
        
5、PDO对象使用
    
    
    5.1、exec()方法
            exec()方法执行一条sql语句,返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则 PDO::exec() 返回 0
            注意:PDO::exec() 不会从一条 SELECT 语句中返回结果。对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
            5.1.1、 使用 exec() 方法完成建表
  1. 1<?php
  2. 2// 通过参数形式连接数据库
  3. 3try{
  4. 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  5. 5 $name ='root';
  6. 6 $passwd ='root';
  7. 7 $pdo =new PDO($dsn, $name, $passwd);
  8. 8 $sql =<<<EOF
  9. 9 CREATE TABLE IF NOT EXISTS user(
  10. 10 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  11. 11 name VARCHAR(20) NOT NULL UNIQUE,
  12. 12 passwd VARCHAR(32) NOT NULL,
  13. 13 email VARCHAR(30) NOT NULL
  14. 14);
  15. 15 EOF;
  16. 16// exec 对于没有受影响的行数将返回0
  17. 17 $res = $pdo->exec($sql);
  18. 18 var_dump($res);
  19. 19// 现在运行完成,在此关闭连接
  20. 20 $pdo =null;
  21. 21}catch(PDOException $e){
  22. 22 echo $e->getMessage();
  23. 23}
  24. 24
  25. 25
            5.1.2、使用exec() 插入数据
  1. 1<?php
  2. 2// 通过参数形式连接数据库
  3. 3try{
  4. 4 $dsn ='mysql:host=localhost;dbname=pdotest';
  5. 5 $name ='root';
  6. 6 $passwd ='root';
  7. 7 $pdo =new PDO($dsn, $name, $passwd);
  8. 8 $sql ="
  9. 9 INSERT INTO user (name, passwd, email)
  10. 10 VALUES('wangxb', MD5('123'), 'wangxb@mail.com'),
  11. 11 ('wangxb1', MD5('123'), 'wangxb@mail.com'),
  12. 12 ('wangxb2', MD5('123'), 'wangxb@mail.com')
  13. 13 ";
  14. 14// exec 对于没有受影响的行数将返回0
  15. 15 $res = $pdo->exec($sql);
  16. 16 var_dump($res);
  17. 17// 返回最后插入行的ID或序列值
  18. 18 echo $pdo->lastInsertId();
  19. 19// 现在运行完成,在此关闭连接
  20. 20 $pdo =null;
  21. 21}catch(PDOException $e){
  22. 22 echo $e->getMessage();
  23. 23}
  24. 24
            返回:
                    
        
        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. 1<?php
  2. 2/*
  3. 3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
  4. 1 <?php
  5. 2 /*
  6. 3 * 使用errorCode 和 errorInfo 两个方法显示错误信息
  7. 4 */
  8. 5try{
  9. 6 $dsn ='mysql:host=localhost;dbname=pdotest';
  10. 7 $name ='root';
  11. 8 $passwd ='root';
  12. 9 $pdo =new PDO($dsn, $name, $passwd);
  13. 10// 我们这里插入的一个没有的表 user123 中
  14. 11 $sql ="
  15. 12 INSERT INTO user123 (name, passwd, email)
  16. 13 VALUES('wangxb', MD5('123'), 'wangxb@mail.com')
  17. 14 ";
  18. 15//
  19. 16 $res = $pdo->exec($sql);
  20. 17if(false=== $res){
  21. 18// errorCode 获取跟数据库句柄上一次操作相关的 SQLSTATE
  22. 19 echo $pdo->errorCode();
  23. 20print"\n";
  24. 21// errorInfo 返回一个错误信息数据:
  25. 22// 0: SQLSTATE error code
  26. 23// 1: specific error code.
  27. 24// 2: specific error message
  28. 25 print_r($pdo->errorInfo());
  29. 26returnfalse;
  30. 27}
  31. 28 var_dump($res);
  32. 29// 返回最后插入行的ID或序列值
  33. 30 echo "最后一天插入的信息ID:".$pdo->lastInsertId();
  34. 31// 现在运行完成,在此关闭连接
  35. 32 $pdo =null;
  36. 33}catch(PDOException $e){
  37. 34 echo $e->getMessage();
  38. 35}
  39. 36
运行:

我们在mysql客户端执行相同语句

可以看到 errorInfo()返回的信息其实是将mysql错误信息以数组的形式返回

 
    5.3、query()方法执行查询
            query()方法虽然可以执行任何sql语句,但是更多的时候是执行select,对于insert、update、delete等使用exec()方法       
  1. 1<?php
  2. 2/*
  3. 3 * 使用exec方法执行插入语句
  4. 4 */
  5. 5// 通过参数形式连接数据库
  6. 6try{
  7. 7 $dsn ='mysql:host=localhost;dbname=pdotest';
  8. 8 $name ='root';
  9. 9 $passwd ='root';
  10. 10 $pdo =new PDO($dsn, $name, $passwd);
  11. 11//$sql = "SELECT * FROM user WHERE id=12";
  12. 12 $sql ="SELECT * FROM user";
  13. 13// query 方法执行将返回一个PDOStatment对象
  14. 14 $stmt = $pdo->query($sql);
  15. 15if(!$pdo &&!$stmt){
  16. 16 var_dump($pdo->errorInof());
  17. 17}
  18. 18// 对于query返回的PDOStatment对象,我们同样可是使用foreach方法来遍历数据其中的数据
  19. 19foreach($stmt as $row){
  20. 20 var_dump($row);
  21. 21 echo '<hr>';
  22. 22}
  23. 23
  24. 24//
  25. 25 echo '-------------------<br>';
  26. 26 var_dump($stmt->fetch());
  27. 27 echo '-------------------<br>';
  28. 28
  29. 29// prepare方法是为execute准备一个statmentObj
  30. 30 $sth = $pdo -> prepare ("SELECT name, id FROM user");
  31. 31 $sth -> execute ();
  32. 32 echo '++++++++++++++++++++++++';
  33. 33 var_dump($sth->fetch());
  34. 34 echo '++++++++++++++++++++++++';
  35. 35 var_dump($stmt);
  36. 36// 现在运行完成,在此关闭连接
  37. 37 $pdo =null;
  38. 38}catch(PDOException $e){
  39. 39 echo $e->getMessage();
  40. 40}
  41. 41
  42. 42
  43. 43
 
 
    5.4、prepare()和execute()方法
  1. 1<?php
  2. 2/*
  3. 3 * 使用exec方法执行插入语句
  4. 4 */
  5. 5// 通过参数形式连接数据库
  6. 6try{
  7. 7 $dsn ='mysql:host=localhost;dbname=pdotest';
  8. 8 $name ='root';
  9. 9 $passwd ='root';
  10. 10 $pdo =new PDO($dsn, $name, $passwd);
  11. 11
  12. 12/*
  13. 13 * 使用prepare和execute方法形式
  14. 14 */
  15. 15 $id1 =12;
  16. 16 $id2 =13;
  17. 17// 利用占位符形式
  18. 18 $sql ="SELECT * FROM user WHERE id=? OR id=?";
  19. 19 $sth = $pdo -> prepare ($sql);
  20. 20 $sth -> execute(array($id1, $id2));
  21. 21 var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
  22. 22
  23. 23 echo '<hr>';
  24. 24// 使用参数形式
  25. 25 $sql_1 ="SELECT id, name FROM user WHERE id= :id";
  26. 26 $sth_1 = $pdo -> prepare ($sql_1);
  27. 27 $sth_1 -> execute(array('id'=>$id1));
  28. 28 var_dump($sth_1->fetchAll(PDO::FETCH_ASSOC));
  29. 29
  30. 30 echo '<hr>';
  31. 31// 使用bindParam方式
  32. 32 $sql_2 ="SELECT * FROM user WHERE id=? OR id=?";
  33. 33 $sth_2 = $pdo -> prepare ($sql_2);
  34. 34 $sth_2->bindParam(1, $id1, PDO::PARAM_INT);
  35. 35 $sth_2->bindParam(2, $id2, PDO::PARAM_INT);
  36. 36 $sth_2 -> execute();
  37. 37 var_dump($sth_2->fetchAll(PDO::FETCH_ASSOC));
  38. 38
  39. 39// 现在运行完成,在此关闭连接
  40. 40 $pdo =null;
  41. 41}catch(PDOException $e){
  42. 42 echo $e->getMessage();
  43. 43}
  44. 44
            
 
    5.5、getAttribute ( int $attribute ) 和 setAttribute ( int $attribute , mixed $value )  方法
  1. 1<?php
  2. 2/*
  3. 3 * 使用exec方法执行插入语句
  4. 4 */
  5. 5// 通过参数形式连接数据库
  6. 6try{
  7. 7 $dsn ='mysql:host=localhost;dbname=pdotest';
  8. 8 $name ='root';
  9. 9 $passwd ='root';
  10. 10 $pdo =new PDO($dsn, $name, $passwd);
  11. 11 $sql ="SELECT * FROM user";
  12. 12 echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  13. 13 echo '<br/>';
  14. 14 echo 'PDO默认的错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
  15. 15
  16. 16 echo '<br/>';
  17. 17//现在我们重设自动提交
  18. 18 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
  19. 19 echo "重设后的自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  20. 20
  21. 21// 现在运行完成,在此关闭连接
  22. 22 $pdo =null;
  23. 23
  24. 24// 我们也可以在new一个PDO对象时,利用传递参数中的第四个参数(可省略)来设置我们此次连接数据库时的各项参数
  25. 25// (我们可以在这里找到所有的设置项:http://php.net/manual/zh/pdo.constants.php)
  26. 26// 就像下面这样
  27. 27 $dsn ='mysql:host=localhost;dbname=pdotest';
  28. 28 $name ='root';
  29. 29 $passwd ='root';
  30. 30 $option = array(
  31. 31 PDO::ATTR_AUTOCOMMIT => O,
  32. 32 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  33. 33);
  34. 34 $pdo =new PDO($dsn, $name, $passwd, $option);
  35. 35 echo '<hr/>';
  36. 36 echo '使用option设置后';
  37. 37 echo '<br/>';
  38. 38 echo "自动提交:".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
  39. 39 echo '<br/>';
  40. 40 echo 'PDO错误处理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
  41. 41}catch(PDOException $e){
  42. 42 echo $e->getMessage();
  43. 43}
  44. 44
                          
                        

 
 

PHP数据库抽象层--PDO(PHP Data Object) [一]的更多相关文章

  1. 数据库抽象层PDO

    通过数据库抽象层PDO可以访问多个数据库 //数据库抽象层PDO //造DSN:驱动名:dbname=数据库名:host=服务器地址 $dsn = "mysql:dbname=mydb;ho ...

  2. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 2

    18.2  PDO所支持的数据库 使用PHP可以处理各种数据库系统,包括MySQL.PostgreSQL.Oracle.MsSQL等.但访问不同的数据库系统时,其所使用的PHP扩展函数也是不同的.例如 ...

  3. PHP 数据库抽象层pdo

    PDO是PHP数据对象(PHP Data Object)的缩写. pdo就是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,能够轻松地在不同数据库之间进行切换,使得数据库 ...

  4. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1

    现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...

  5. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 5

    18.5  使用PDO对象 PDO扩展类库为PHP访问数据库定义了一个轻量级.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据 ...

  6. 【代码总结】数据库抽象层PDO

    一.概述 PDO就是一个"数据库访问抽象层",起作用是统一各种数据库的访问接口,能够轻松的在不同数据库之间进行切换. 二.PDO的安装 编辑php.ini文件 添加 extensi ...

  7. 数据库抽象层 pdo

    一 . PDO的连接 $host = "localhost"; $dbname = "hejuntest"; $username = "root&qu ...

  8. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9  管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...

  9. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9

    18.7  PDO的事务处理 事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作.如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所 ...

随机推荐

  1. hibernate hql limit的实现方式

    query.setFirstResult(startIndex);//开始索引query.setMaxResults(maxSize);//取几条 如 limit 1,5HQL:query.setFi ...

  2. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  3. 迷你MVVM框架 avalonjs 学习教程10、样式操作

    一般情况下我们通过设置类名就可以改变元素的样式,但涉及到动画部分,就一定需要设置内联样式了,因此有了ms-css.*ms-css*的用法为ms-css-样式名="样式值", 如ms ...

  4. MongoDB 集合命令

    集合命令 创建语法如下 name是要创建的集合的名称 options是一个文档,用于指定集合的配置,选项​​参数是可选的,所以只需要到指定的集合名称 可以不手动创建集合,向不存在的集合中第一次加入数据 ...

  5. 线性判别分析LDA详解

    1 Linear Discriminant Analysis    相较于FLD(Fisher Linear Decriminant),LDA假设:1.样本数据服从正态分布,2.各类得协方差相等.虽然 ...

  6. Linux就业技术指导(一):简历撰写及面试筹备要领

    一,开场 二,模型 三,目标选材 3.1 什么是目标选材 简单说就是确定一个候选人是否符合某一个工作岗位要求的整个流程.这是对招聘方的一个培训,应聘方如果掌握了,就知道应该怎样正确的去应聘工作. 3. ...

  7. Structs配置文件 zg项目介绍

    Structs配置文件 1.以系统代码为名称 例:

  8. VMware-克隆机,网卡修改

    1.克隆 2.修改网卡eth1为eth0 -persistent-net.rules 3.配置ip vim /etc/sysconfig/network-scripts/ifcfg-etho 4.修改 ...

  9. in 和 exist 区别 (转)

    select * from Awhere id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B ...

  10. 获取RequestMapping注解中的属性

    参考:https://www.cnblogs.com/2013jiutian/p/7294053.html @RequestMapping("/value1") @Controll ...