13. php数据库抽象层PDO(二)

1. 使用PDO对象

1.2 调整PDO的行为属性

在创建PDO对象时,没有在构造方法中最后一个参数设置过的属性选项,也可以在对象创建完成以后,通过PDO对象中的setAttribute()和getAttribute()方法设置和获取这些属性的值

1.2.1 getAttribute()

该方法只需要提供一个参数,传递一个特定的属性名称,如果执行成功,则返回该属性所指定的值,否则返回null

<?php
$opt = array(PDO::ATTR_PERSISTENT=>TRUE);
try{
    $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd', $opt);
}catch(PDOException $e){
    echo '数据库连接失败:'. $e->getMessage();
    exit;   //如果有异常发生则退出程序
}

    echo "<br/>PDO是否关闭自动提交功能:". $dbh->getAttribute(PDO::ATTR_AUTOCOMMIT);
    echo "<br/>当前PDO的错误处理模式:".$dbh->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br/>表字段字符的大小写转换:".$dbh->getAttribute(PDO::ATTR_CASE);
    echo "<br/>与连接状态相关特有信息:". $dbh->getAttribute(PDO::CONNECTION_STATUS);
    echo "<br/>空字符串转换为SQL的null".$dbh->getAttribute(PDO::ORACLE_NULLS);

1.2.2 setAttribute()

需要两个参数,第一个参数提供PDO对象的特定的属性名,第二个参数则是为这个指定的属性赋值。例如设置PDO的错误模式,需要如下设置PDO对象中ATR_ERROMODE属性的值

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //设置抛出异常处理错误


2. PDO处理PHP程序和数据库之间的数据类型转换

PDO在某种程度上是对类型不可知的,因此它将任何类型数据都表示为字符串。若把PDO::ATTR_ORACLE_NULLS设置为true,默认情况下该属性值为FALSE

$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS,true);

该属性设置以后,通过$dbh对象打开的任何语句中的空字符串都将被转换为NULL


3. PDO的错误处理模式

POD一共提供三种不同的错误处理模式

3.1 PDO::ERRMODE_SILENT

默认模式,在错误发生时不进行任何操作,PDO将只设置错误代码。开发人员可以通过PDO对象中的errorCode()和errorInfo()方法对语句和数据库对象进行检查。如果错误是由于对语句对象的调用而产生的,那么可以在那个语句对象上调用errorCode()或errorInfo()方法。如果错误是由于调用数据库对象而产生的,那么可以在那个数据库对象上调用上述两个方法

3.2 PDO::ERRMODE_WARNING

除了设置错误代码外,PDO还将发出一条PHP传统的E_WARNING消息,可以使用常规的PHP错误处理程序捕获该警告。

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)//设置警告模式处理错误报告

3.3 PDO::ERRMODE_EXCEPTION

除了设置错误代码外,PDO还将抛出一个PDOException,并设置其属性,以反应错误代码和错误信息

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置抛出异常模式处理错误


4. 使用PDO执行SQL语句

4.1 使用PDO::exec()方法

当执行INSERT,UPDATE和DELETE等没有结果集的查询时,使用PDO对象中的exec()方法去执行。该方法成功执行后,将返回受影响的行数。注意,该方法不能用于SELECT查询。

<?php
try{
    $dbh = new PDO('mysql:dbname=testdb;host=localhost','mysql_user', 'mysql_pwd');
}catch(PDOException $e){
    echo '数据库连接失败:'.$e->getMessage();
    exit;
}

$query = "UPDATE contactInfo SET phone='18644444444' where name='chrischang'";
//使用exec()方法执行insert,update和delete
$affected = $dbh->exec($query);
if($affected){
    echo '数据表contactInfo中受影响的行数为:'.$affected;
}else{
    print_r($dbh->errorInfo());
}

4.2 使用PDO::query()方法

当执行SELECT查询时,或者所影响的行数无关紧要时,应当使用PDO对象中的query()方法。如果该方法成功执行指定的查询。则返回一个PDOSatement对象。如果使用了query()方法。并想了解获取的数据行总数。可以使用PDOStatement对象中的rowCount()方法获取。

<?php
$dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = "SELECT name, phone, email FROM contactInfo WHERE departmentId='303'";
try{
    //执行select查询,并返回PDOstatement对象
    $pdostatement = $dbh->query($query);
    echo '一共从表中获取到'.$pdostatement->rowCount()."条记录:\n";
    foreach($pdostatement as $row){
    echo $row['name']."\t"; //从PDOstatement对象中遍历结果
    echo $row['phone']."\t";//输出从表中获取到的联系人的名字
    }
}catch(PDOException $e){
    echo $e->getMessage();
}

可以使用PDO过滤一些特殊字符,防止一些能引起SQL注入的代码。在PDO中使用quote()方法实现

$query = "select * from users where login=".$dbh->quote($_POST['login'])." AND passwd=".$db->quote($_POST['pass']);

4.3 使用PDO:prepare()和PDOStatement::execute()方法

预处理语句,下一篇将会详细写到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值