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()方法
预处理语句,下一篇将会详细写到。