PHPpdo 的错误处理

用 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()的结果都是新型的,所以大家可以很容易自己决定错误音信彰显。

  【简单总计】

  从下面的运用看出,PDO效用确实强大,此外还有一对内容本身一向不讲到,比如绑定参数、预处理、存储过程、事务处理等等效能。此外还有不同数量扩
DSN的构造,Oracle数据库自己许多非凡的东西,都急需深远去上学明白,这篇文章就只是简短的描述了一部分入门知识,算是对PDO一个简便的询问吗。

相关文章