计算机网络/计算机科学与应用/系统/运维/开发

PDO数据库抽象类库

一、安装PDO

在php.ini中 打开  extension=php_pdo_mysql.dll   extension=php_pdo.dll  重启服务器

查看当前环境中支持的pdo驱动程序:

print_r(pdo_drivers());


二、连接到数据库服务器并选择数据库

PDO ::__construct( string DSN [, string username [, string password [, array driver_opts]]] );

DSN数据源名称:参数由2项组成:需要的数据库驱动程序名和数据库连接变量  主机名/端口/数据库名 

DSN:'数据库服务器类型:host=数据库服务器地址;dbname=数据库名称'

username:数据库用户名

password :密码

driver_options选项:

PDO::ATTR_AUTOCOMMIT:此选项定义PDO在执行时是否注释每条请求
PDO::ATTR_CASE:通过此选项可以控制在数据库中取得的数据的字母大小写
PDO::ATTR_EMULATE_PREPARES:使用此选项可以利用MySQL的请求缓存功能
PDO::ATTR_ERRMODE:使用此选项定义PDO的错误报告模型
(3种模式分别为PDO::ERRMODE_EXCEPTION(例外模式)、PDO:: ERRMODE_SILENT(沉默模式)和PDO::ERRMODE_WARNING(警报模式))
PDO::ATTR_ORACLE_NULLS:使用此选项,在使用Oracle数据库时,会把空字符串转换为NULL值。一般情况下,此选项为默认关闭
PDO::ATTR_PERSISTENT:使用此选项来确定此数据库连接是否可持续。但是其默认值为false,不启用
PDO:: ATTR_PREFETCH:此选项确定是否要使用数据库prefetch功能
PDO:: ATTR_TIMEOUT:此选项设置超时时间为多少秒,但是MySQL不支持此功能
PDO::DEFAULT_FETCH_MODE:此选项可以设定默认的fetch模型,包括以联合数据的形式取得数据,或者以数字索引数组的形式取得数据,或者以对象的形式取得数据


$pdo = new PDO($dsn,$user,$pass,array(PDO::ATTR_CLIENT_VERSION=>false));

持久化连接:

<?php 
   $dbh = new PDO('mysql:host=localhost;dbname=testdb', $user, $pass, array(PDO::ATTR_PERSISTENT => true)); 
?>

三、多种方式调用构造函数

1、将参数嵌入到构造函数

$dbh = new PDO('mysql:host=localhost;dbname=test','root','root');


2、将参数放在文件中

把dsn字符串放在另一个本地或远程文件中,并在构造函数中引用这个文件

$dbh =new PDO('uri:file://usr/local/mysql.dsn');

注意:必须要确定该文件由负责执行php脚本的用户所拥有。

3、引用php.ini文件

把dsn信息赋给一个名为pdo.dsn.aliasname 的配置参数, aliasname是后面将提供构造函数的dsn别名

例如指定别名 mysqlpdo,在php.ini文件中添加一条配置信息

pdo.dsn.mysqlpdo = 'mysql:dbname=test;host=localhost'

通过pdo构造函数调用别名:

$dbh =new PDO('mysqlpdo','root','root');


4、使用pdo与连接有关的选项

pdo提供了几个与连接有关的选项,可以在传入driver_opts 数组中调整pdo的行为

PDO::ATTR_AUTOCOMMIT 确定pdo是每次查询执行时提交,还是等待commit()方法才生效

等等其他选项。

5、处理连接错误


try{
    $dbh = new PDO('mysql:host=localhost;dbname=test','root','root');
}catch(PDOException $exception){
    //Connectioin error:SQLSTATE[HY000] [1049] Unknown database 'tests'
    echo "Connectioin error:".$exception->getMessage();
}


四、错误处理

pdo提供了3种错误处理:

PDO::ERRMODE_EXCEPTION  使用PDOException 类抛出异常  立即停止脚本执行,提供与问题有关的信息
PDO::ERRMODE_SILENT 错误发生时不进行任何操作 让开发人员检查错误并确定如何处理  默认设置
PDO::ERRMODE_WARNING 发生与pdo相关的错误则生成一条php E_WARNING消息

设置错误模式,只需使用  setAttribute()

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


五、获取错误信息

1、获取sql错误码

errorCode()方法用于返回这个标准SQLSTATE码,可以存储这个SQLSTATE码来实现日志功能

语法形式如下: int  PDOStatement::errorCode()


try {
        $dbh = new PDO('mysql:host=localhost;dbname=test','root','root');
} catch (PDOException $exceptioin) {
        printf("Connection error: %s",$exception->getMessage());
}
$query ="INSERT INTO web_test(id,username) VALUES(null,'bb')";
$dbh->exec($query);

echo $dbh->errorCode();//42S02  表示mysql表不存在 成功返回00000

2、获取sql错误消息

errorInfo() 方法可以生成一组数组 其中包括最近执行的数据库操作相关错误信息

语法如下:array  PDOStatement::errorInfo()

该数组包括3个值,各个值由一个数字索引值(0~2)引用

0 存储sql标准中定义的sqlstate码
1 存储特定于数据库驱动程序的错误码
2 存储特定于数据库驱动的错误消息

try {
        $dbh = new PDO('mysql:host=localhost;dbname=test','root','root');
} catch (PDOException $exceptioin) {
        printf("Connection error: %s",$exceptioin->getMessage());
}
$query ="INSERT INTO web_test(id,username) VALUES(null,'bb')";
$dbh->exec($query);
//echo $dbh->errorCode();//42S02  表示mysql表不存在 成功返回00000
//Array ( [0] => 42S02 [1] => 1146 [2] => Table 'test.web_tests' doesn't exist )
print_r($dbh->errorInfo());


六、获取和设置属性

1、获取属性  getAttribute() 获取所指定的属性的值

mixed PDOStatement::getAttribute(int attribute)

getAttribute() 获取属性

//mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $
echo $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION);

2、设置属性  setAttribute()

boolean PDOStatement::setAttribute(int attribute,mixed value)


//强制列名小写
 $dbh ->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);

七、案例

<?php
    // PDO 执行SQL选择语句
    $dbms = 'mysql';
    $host = 'localhost';
    $dbName = 'mytest';
    $user = 'root';
    $password = '123456';
    $dsn = "$dbms:host=$host;dbname=$dbName";
    
    try{
        $dbh = new PDO($dsn,$user,$password);
    }catch(PDOException $exception){
        echo "message:".$exception->getMessage();
    }
       $sqlquery = "select * from fruits";
       $result = $dbh->query($sqlquery);
        echo $dbh->errorCode()."<br/>";
        print_r($dbh->errorInfo());
        foreach ($result as $row) {
        $f_id = $row['f_id'];
        $s_id=$row['s_id'];
        $f_name=$row['f_name'];
        $f_price=$row['f_price'];
        echo "f_id:$f_id,s_id:$s_id,f_name:$f_name,f_price:$f_price<br/>";
    }




pdo

人生活在得失之间,得亦是失,失亦是得。

评论

^