pdo 的错误处理

用 pdo
插入一条记下老是失误,又不象其余函数这样自动的会输出错误,查了刹那间才精通它的错误处理确实相比特别.


http://www.osedu.net/article/php/2011-05-16/223.html

PHP中PDO快速入门教程

时间:2011-05-16 11:24:35  来源:  作者:

咱俩起先社团第一个PDO应用,建立一个pdo.php文件在Web文档目录下:

<?php
 $dsn = "mysql:host=localhost;dbname=test";
 $db = new PDO($dsn, ‘root’, ”);
 $count = $db->exec("INSERT INTO foo SET name = ‘heiyeluren’,gender=’男’,time=NOW()");
 echo $count;
 $db = null;
?>

  不精晓啥意思,俺们来逐步讲讲。那行:

$dsn = "mysql:host=localhost;dbname=test";

  就是布局我们的DSN(数据源),看看其中的消息包括:数据库类型是mysql,主机地址是localhost,数据库名称是test,就如此几个消息。不同数据库的数据源构造模式是不等同的。

$db = new PDO($dsn, ‘root’, ”);

  起首化一个PDO对象,构造函数的参数第一个就是大家的数据源,第二个是连连数据库服务器的用户,第两个参数是密码。我们无法担保连接成功,前边咱们会讲到十分处境,这里大家暂且认为它是连接成功的。

$count = $db->exec("INSERT INTO foo SET name = ‘heiyeluren’,gender=’男’,time=NOW()");
echo $count;

  调用我们连年成功的PDO对象来推行一个查询,那多少个查询是一个插入一条记下的操作,使用PDO::exec()方法会再次来到一个影响记录的结果,所以我们输出这些结果。最后如故需要收尾对象资源:

$db = null;

  默认这多少个不是长连接,如果急需多少库长连接,需要最终加一个参数:array(PDO::ATTR_PERSISTENT
=> true) 变成这样:

$db = new PDO($dsn, ‘root’, ”, array(PDO::ATTR_PERSISTENT => true));

  两次操作就如此简单,也许跟以前的没有太大分别,跟ADOdb倒是有几分相似。
**继续探听】

**  假如我们想提取数额的话,那么就应该接纳数据得到功效。(下边用到的$db都是地点已经连续好的目的)

<?php
 foreach($db->query("SELECT * FROM foo")){
  print_r($row);
 }
?>

  大家也可以使用这种获取格局:

<?php
 $rs = $db->query("SELECT * FROM foo");
 while($row = $rs->fetch()){
  print_r($row);
 }
?>

  假如想一回把数量都赢得到数组里可以这么:

<?php
$rs = $db->query("SELECT * FROM foo");
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>

Array
([0] => Array(
 [id] => 1
 [0] => 1
 [name] => heiyeluren
 [1] => heiyeluren
 [gender] => 男
 [2] => 男
 [time] => 2006-10-28 23:14:23
 [3] => 2006-10-28 23:14:23
)
}

  我们看其中的笔录,数字索引和关联索引都有,浪费资源,我们只需要关联索引的:

<?php
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>

  看上边的代码,setAttribute()方法是安装有些属性,重要性能有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等等,大家这里需要安装的是
PDO::ATTR_CASE,就是我们应用关联索引获取数据集的时候,关联索引是大写仍旧小写,有多少个挑选:

  PDO::CASE_LOWER — 强制列名是小写
  PDO::CASE_NATURAL — 列名按照原有的不二法门
  PDO::CASE_UPPER — 强制列名为大写

  大家拔取setFetchMode方法来安装获取结果集的重返值的花色,同样类型还有:

  PDO::FETCH_ASSOC — 关联数组情势
  PDO::FETCH_NUM — 数字索引数组形式
  PDO::FETCH_BOTH — 两者数组形式都有,这是缺省的
  PDO::FETCH_OBJ — 遵照目标的款式,类似于往日的
mysql_fetch_object()

  当然,一般景观下我们是应用PDO::FETCH_ASSOC,具体行使什么,遵照你自己的需要,其他获取项目参考手册。

  除了上边这种获取数据的模式,还有那种:

<?php
$rs = $db->prepare("SELECT * FROM foo");
$rs->execute();
while($row = $rs->fetch()){
 print_r($row);
}
?>

  其实差不多啦。假若你想博得指定记录里一个字段结果的话,可以动用
PDOStatement::fetchColumn():

<?php
$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
echo $col;
?>

  一般采纳fetchColumn()来开展count总计或者某些只需要单字段的记录很好操作。

  简单的总括一下下面的操作:

  查询操作首假设PDO::query()、PDO::exec()、PDO::prepare()。PDO::query()重倘使用于有记录结果再次回到的操作,特别是SELECT操作,PDO::exec()重要是本着没有结果集合再次来到的操作,比如INSERT、UPDATE、DELETE等操作,它
再次来到的结果是时下操作影响的列数。PDO::prepare()紧假设预处理操作,需要通过$rs->execute()来执行预处理之中的SQL语句,
这些主意能够绑定参数,功能相比较强硬,不是本文可以简单说精通的,我们可以参考手册和其它文档。
获取结果集操作重倘若:PDOStatement::fetchColumn()、PDOStatement::fetch()、
PDOStatement::fetchALL()。PDOStatement::fetchColumn()是取得结果指定第一条记下的某部字段,缺省是第一个字段。PDOStatement::fetch()是用来获取一条记下,PDOStatement::fetchAll()是获取具有记录集到一个中,获取结果可以通过
PDOStatement::setFetchMode来设置需要结果集合的系列。

  此外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。
PDO::lastInsertId()是回到上次安插操作,主键列类型是自增的最终的自增ID。PDOStatement::rowCount()主假设用于PDO::query()和PDO::prepare()举行DELETE、INSERT、UPDATE操作影响的结果集,对
PDO::exec()方法和SELECT操作无效。

  【错误处理】

  若是程序中遭逢错误如何是好?我们这里描述PDO类的错误新闻和这些处理。

  1. 面向对象的法门

  先看看倘若老是错误等的拍卖,使用面向对象的艺术来拍卖:

<?php
try {
 $db = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
 $db = null;
} catch (PDOException $e) {
 print "Error: " . $e->getMessage() . "<br/>";
 die();
}
?>

  这里运用我们PHP
5面向对象的卓殊处理特征,如果中间有十分的话就起先化调用PDOException来起始化一个老大类。

  PDOException相当类的特性结构:

<?php
class PDOException extends Exception
{
 public $errorInfo = null; // 错误信息,可以调用 PDO::errorInfo() 或 PDOStatement::errorInfo()来访问
 protected $message; // 异常信息,可以试用 Exception::getMessage() 来访问
 protected $code; // SQL状态错误代码,可以使用 Exception::getCode() 来访问
}
?>

  这么些可怜处理类是集成PHP 5内置的不行处理类,我们大概的看一下PHP
5内置的可怜处理类协会:

<?php
class Exception
{
 // 属性
 protected $message = ‘Unknown exception’; // 异常信息
 protected $code = 0; // 用户自定义异常代码
 protected $file; // 发生异常的文件名
 protected $line; // 发生异常的代码行号

 // 方法
 final function getMessage(); // 返回异常信息
 final function getCode(); // 返回异常代码
 final function getFile(); // 返回发生异常的文件名
 final function getLine(); // 返回发生异常的代码行号
 final function getTrace(); // backtrace() 数组
 final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
}
?>

  相应的,在代码中可以适度的调用 getFile() 和 getLine()来进展不当定位,更有益的开展调试。

  2. 选用面向过程的措施

  先看代码:

<?
$db = new PDO(‘mysql:host=localhost;dbname=test’, $user, $pass);
$rs = $db->query("SELECT aa,bb,cc FROM foo");
if ($db->errorCode() != ‘00000’){
 print_r($db->errorInfo());
 exit;
}
$arr = $rs->fetchAll();
print_r($arr);
$db = null;
?>

  PDO和PDOStatement对象有errorCode() 和 errorInfo()方法,即使没有其它错误, errorCode() 重回的是: 00000
,否则就会回来一些错误代码。errorInfo()重回的一个数组,包括PHP定义的错误代码和MySQL的错误代码和错误音信,数组结构如下:

Array
(
 [0] => 42S22
 [1] => 1054
 [2] => Unknown column ‘aaa’ in ‘field list’
)

  每趟执行查询之后,errorCode()的结果都是新型的,所以我们得以很容易自己主宰错误音信显示。

  【简单总计】MySQL,

  从下面的应用看出,PDO效能确实强大,其余还有部分内容本身从未讲到,比如绑定参数、预处理、存储过程、事务处理等等效率。其余还有不同数额扩
DSN的协会,Oracle数据库自己许多特其余东西,都亟待深切去学习精通,这篇著作就只是简短的叙说了有的入门知识,算是对PDO一个简练的问询呢。

网站地图xml地图