Oraclepdo 的错误处理

用 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一个粗略的打听呢。

相关文章