从 PHP 5.1 开始附带了 PDO,PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库(比如mysql,oracle,mssql…),都可以用相同的函数(方法)来查询和获取数据。

1.创建PDO对象

使用PDO扩展必须在php.ini文件中打开相应的扩展,下图打开了pdo_mysql的扩展:

那怎么创建一个pdo对象呢?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code class = "hljs xml" ><!--?php
//$dsn = "mysql:host=服务器地址/名称; port=端口号; dbname=数据库名";
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
//输出: object(PDO)#1 (0) { }, 拿到pdo对象表示连接成功了
var_dump($dbh);</code>

2.PDO对象主要方法

PDO::beginTransaction — 启动一个事务 PDO::commit — 提交一个事务 PDO::__construct — 创建一个表示数据库连接的 PDO 实例 PDO::errorCode — 获取跟数据库句柄上一次操作相关的 PDO::errorInfo — 获取最后操作关联的错误信息,返回一个数组 PDO::exec — 执行一条 SQL 语句(insert ,delete,update),并返回受影响的行数,失败则为false PDO::getAttribute — 取回一个数据库连接的属性 PDO::getAvailableDrivers — 返回一个可用驱动的数组 PDO::inTransaction — 检查是否在一个事务内 PDO::lastInsertId — 返回最后插入行的ID或序列值 PDO::prepare — 预处理语句返回一个PDOStatement 对象 PDO::query — 执行查询语句,返回一个结果集对象PDOStatement PDO::quote — 给字符串加引号,如:’string’ 用于查询 PDO::rollBack — 回滚一个事务 PDO::setAttribute — 设置属性

更多详见:

<h2 id="3p dostatement对象主要方法">3.PDOStatement对象主要方法

在拿到PDO对象后,执行sql语句:

?
1
2
<code class = "hljs lasso" > $sql = "select * from product" ;
  $stmt =  $dbh -> query($sql);</code>

上述代码的 $stmt 就是PDOStatement对象,它是执行sql语句后返回的结果集。

PDOStatement对象主要方法:
1. PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
2. PDOStatement::bindParam — 绑定一个参数到指定的变量名
3. PDOStatement::bindValue — 把一个值绑定到一个参数
4. PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
5. PDOStatement::columnCount — 返回结果集中的列数
6. PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
7. PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
8. PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
9. PDOStatement::execute — 执行一条预处理语句
10. PDOStatement::fetch — 从结果集中获取下一行
11. PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
12. PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
13. PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
14. PDOStatement::getAttribute — 检索一个语句属性
15. PDOStatement::getColumnMeta — 返回结果集中一列的元数据
16. PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
17. PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
18. PDOStatement::setAttribute — 设置一个语句属性
19. PDOStatement::setFetchMode — 为语句设置默认的获取模式。

4.使用PDO操作mysql

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code class = "hljs xml" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$sql = "update product set price = 1998 where pro_id = 1" ;
#执行更新语句
$result = $dbh->exec($sql);
if ($result){
     echo "执行成功,受此语句影响的行数=" .$result;
} else {
    echo "
错误码:". $dbh->errorCode();
    echo "</code>

?
1
<code class = "hljs xml" >"; var_dump( $dbh->errorInfo()); } ?> </code>

运行结果:

现在故意把sql写错:

$sql = “update productxx set price = 1998 where pro_id = 1”;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<code class = "hljs xml" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
//故意写错sql--------------------
$sql = "update productxx set price = 1998 where pro_id = 1" ;
$result = $dbh->exec($sql);
if ($result){
     echo "执行成功,受此语句影响的行数=" .$result;
} else {
    echo "
错误码:". $dbh->errorCode();
    echo "</code>

?
1
<code class = "hljs xml" >"; var_dump( $dbh->errorInfo()); } ?></code>

运行结果:

使用事务:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code class = "hljs lasso" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh->beginTransaction(); //开启事务
$sql = "update product set price = 1998 where pro_id = 1" ;
$result = $dbh->exec($sql);
$intrans = $dbh->inTransaction();
var_dump($intrans); //bool(true)
if ($result !== false ){
     $dbh->commit(); //事务提交
} else {
    $dbh->rollBack(); //事务回滚
    echo "
错误码:". $dbh->errorCode();
    echo "</code>

?
1
<code class = "hljs lasso" >"; var_dump( $dbh->errorInfo()); } $intrans = $dbh->inTransaction(); var_dump($intrans); //bool(false) ?></code>

获取不同形式的结果集:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<code class = "hljs lasso" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$sql = "select pro_id,pinpai from product" ;
$stmt = $dbh->query($sql);
//返回的结果以字段名为key
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
echo '</code>


'; //返回的结果以数字下标为key $row = $stmt->fetch(PDO::FETCH_NUM); print_r($row); echo '


'; //PDO::FETCH_ASSOC + PDO::FETCH_NUM $row = $stmt->fetch(PDO::FETCH_BOTH);//默认就是PDO::FETCH_BOTH print_r($row); echo '


'; //返回结果是内置标准类stdClass ,数据库字段名作为属性名 $row = $stmt->fetch(PDO::FETCH_OBJ);//默认就是PDO::FETCH_BOTH print_r($row); echo '


'; class Row{} //返回结果是指定类对象 ,数据库字段名作为属性名 $stmt->setFetchMode(PDO::FETCH_CLASS,'Row'); $row = $stmt->fetch();//默认就是PDO::FETCH_BOTH print_r($row); echo '


'; //获取所有的结果集 $sql = "select pro_id,pinpai from product limit 2"; $stmt = $dbh->query($sql); //这里得到的结果是二维数组 $rows = $stmt->fetchAll();//fetchAll([PDO::FETCH_BOTH]) 默认是PDO::FETCH_BOTH echo "

?
1
2
3
4
5
<code class = "hljs lasso" >";
print_r($rows);
?>
</code>

5.PDO错误处理方式

PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发:
1.PDO::ERRMODE_SILENT
此为默认模式。 PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象。如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用上述两个方法。

2.PDO::ERRMODE_WARNING
除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。如果只是想看看发生了什么问题且不中断应用程序的流程,那么此设置在调试/测试期间非常有用。

3.PDO::ERRMODE_EXCEPTION
除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。此设置在调试期间也非常有用,因为它会有效地放大脚本中产生错误的点,从而可以非常快速地指出代码中有问题的潜在区域(记住:如果异常导致脚本终止,则事务被自动回滚)。

异常模式另一个非常有用的是,相比传统 PHP 风格的警告,可以更清晰地构建自己的错误处理,而且比起静默模式和显式地检查每种数据库调用的返回值,异常模式需要的代码/嵌套更少。

?
1
2
3
<code class = "hljs lasso" >#pdo设置异常模式
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_EXCEPTION );
</code>

注意:不管当前是否设置了 PDO::ATTR_ERRMODE ,如果连接失败, PDO::__construct() 将总是抛出一个 PDOException 异常。未捕获异常是致命的。

PDO错误静默模式: PDO :: ERRMODE_SILENT

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code class = "hljs xml" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_SILENT );
//这是一句错误的sql
$sql = "select pro_id,pinpai from productxxxx" ;
$stmt = $dbh->query($sql);
if (!$stmt){
     $errArray = $dbh->errorInfo();
     var_dump($errArray);
}
?>
</code>

PDO错误警告模式: PDO :: ERRMODE_WARNING

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code class = "hljs lasso" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_WARNING );
//这是一句错误的sql
$sql = "select pro_id,pinpai from productxxxx" ;
$stmt = $dbh->query($sql);</code>

PDO错误异常模式: PDO :: ERRMODE_EXCEPTION

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code class = "hljs xml" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_EXCEPTION );
//这是一句错误的sql
$sql = "select pro_id,pinpai from productxxxx" ;
try {
     $stmt = $dbh->query($sql);
} catch (PDOException $e) {
    echo  $e->getMessage();
}</code>

6.PDO预处理语句

预处理的意思是先提交sql语句到mysql服务端,执行预编译,客户端执行多条结构相同的sql语句时,只需上传输入参数即可,这点和存储过程有点相似。

有两种语法形式:

?
1
2
3
4
<code class = "hljs sql" >#问号占位符形式
select pro_id,pinpai from product WHERE protype_id > ? and pinpai = ?;
#命名占位符形式
select pro_id,pinpai from product WHERE protype_id > :v1  and pinpai = :v2;</code>

1.问号占位符代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code class = "hljs lasso" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_EXCEPTION );
$sql = "select pro_id,pinpai from product WHERE pro_id > ? and pinpai = ?" ;
try {
     $stmt = $dbh->prepare($sql);
     //给占位符赋值形式1
     $stmt->bindValue( 1 , 5 );
     $stmt->bindValue( 2 , '索尼' );
     $stmt->execute();
     $resultSet = $stmt->fetchAll();
     $stmt->closeCursor();
     print_r($resultSet);
     echo "</code>


"; //给占位符赋值形式2 $stmt->execute(array(3,'索尼')); $resultSet = $stmt->fetchAll(); print_r($resultSet); } catch (PDOException $e) { echo $e->getMessage(); } ?>

2.命名占位符代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code class = "hljs lasso" ><!--?php
$dsn = "mysql:host=localhost; port=3306; dbname=db7" ; // =号两边最好不要有空格
$options =  array(PDO::MYSQL_ATTR_INIT_COMMAND =--> 'set names utf8' ); //可选参数
$username = "root" ; //用户名
$passwd = "root" ; //密码
try {
     $dbh = new PDO($dsn, $username, $passwd, $options);
} catch (PDOException $e) {
     echo 'Connection failed: ' . $e->getMessage();
}
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE ,  PDO :: ERRMODE_EXCEPTION );
$sql = "select pro_id,pinpai from product WHERE pro_id > :v1  and pinpai = :v2" ;
try {
     $stmt = $dbh->prepare($sql);
     //给占位符赋值形式1
     $stmt->bindValue( ":v1" , 5 );
     $stmt->bindValue( ":v2" , '索尼' );
     $stmt->execute();
     $resultSet = $stmt->fetchAll();
     $stmt->closeCursor();
     print_r($resultSet);
     echo "</code>


"; //给占位符赋值形式2 $stmt->execute(array(":v1"=>3,":v2"=>'索尼')); $resultSet = $stmt->fetchAll(); print_r($resultSet); } catch (PDOException $e) { echo $e->getMessage(); } ?> 

php之PDO (PHP DATA OBJECT)相关推荐

  1. CANopen 7.过程数据对象 PDO Process data object)

    学习:https://blog.csdn.net/iamplane/article/details/49931319 同步报文使用:https://blog.csdn.net/qq_40104597/ ...

  2. PHP5中PDO(PHP DATA OBJECT)模块基础详解

    PHP5自从2004年发布以来PDO就有了,但是现在纵观周边开发的情况还是4世代的mysql或者mysqli占据大部分江山,就像ie6一样.也许改革需要时间的推动,在即将发行的PHP6中PDO会作为默 ...

  3. PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决

    PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决 参考文章: (1)PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决 (2)ht ...

  4. JDO(Java Data Object )

    JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API. JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要 ...

  5. 使用ByteArray及AMF来提高Data Object的操作效率

    转自:http://xinsync.xju.edu.cn/index.php/archives/1743#more-1743 AS3的效率(注意,我说的是AS3,而不是AVM)直接而言就是对于设计模式 ...

  6. PEGA(Low-Code App Builder)Describing a data object

    Data types 应用程序数据模型中的数据类型 为了处理案例,Pega Platform应用程序使用许多不同的数据类型,这些数据类型是案例数据的集合.数据类型为开发人员提供了一种方法,可以将一组字 ...

  7. java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...

    补充资料:对象化 标志人类有目的的对象性活动的过程及其结果的哲学范畴.马克思用这个范畴揭示劳动的实现.劳动物化为对象的事实.劳动的实现意味着创造一定的产品,而劳动的产品就是固定在某个对象中物化为对象的 ...

  8. php使用pdo操作mysql数据库实例_php5使用pdo连接数据库实例

    本文为大家介绍下php pdo的用法. 一,pdo简介 pdo(php data object) 是php 5 中加入的东西,是php 5新加入的一个重大功能,因为在php 5以前的php4/php3 ...

  9. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

最新文章

  1. BS-GX-017基于SSM实现的在线考试管理系统
  2. CF981H K Paths
  3. TurboMail邮件系统: IP进黑名单,仍可收发邮件
  4. java类和对象数组传参_Java 练习(替换数组元素, 将对象作为参数传递给方法)
  5. 阿里云linux主机更新hostname
  6. redis统计用户日活量_【赵强老师】Redis案例分析:用setbit统计活跃用户
  7. jQuery(一个JavaScript库)
  8. 微信小程序不支持使用本地图片设置背景图片解决方法
  9. 攻防世界WEB题练习
  10. steam好玩的免费游戏
  11. srs linux开机启动,SRS之安装与使用
  12. 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点
  13. BERT和ERNIE中[PAD],[CLS],[SEP],[MASK],[UNK]所代表的含义
  14. IEC104协议学习遥测、遥信、电度
  15. mysql compact_MySQL基本操作
  16. InfoSphere Guardium在医疗保健行业中对System Z的好处
  17. SINS/GNSS组合导航仿真应用详细版(基于PSINS工具箱 )
  18. css根据手机屏幕宽度调整样式
  19. 【程序设计与算法(三)第7周测验(2019秋季)】005:山寨版istream_iterator
  20. 谢处方电磁场与电磁波第4版课后答案

热门文章

  1. 2021年12月中国A股石油加工贸易行业上市企业市值排行榜:中国石油位居榜首,宇新股份股价最高(附月榜TOP24详单)
  2. 损失次数模型-负二项分布
  3. 基于JAVA的二次元风格论坛
  4. 热点新闻管理系统设计与实现
  5. 清华大学06届 计算机王煜,2006年科研成果一览表
  6. uniapp-Speech语音识别(百度)
  7. 企业微信如何退出之前的公司
  8. 安装docker和docker的开机启动及容器的开机自启
  9. 基础算法--背包问题(01背包问题、完全背包问题、多重背包问题、分组背包问题)
  10. cvReleaseCapture函数说明