一、安装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/>"; }