操作数据库是 PHP 常常用到的功能,使用 PDO 处理数据库操作在通用性和安全性上都很不错。在此我总结一下 PDO 的使用方法,PDO 安全性方面的问题可以参考 PDO防注入原理分析以及使用PDO的注意事项总结。
1. 连接数据库
PDO 连接数据只需 new 一个 PDO 对象并传入相关配置,包括数据库驱动,主机,端口,数据库名,链接帐号和密码等。若连接失败会抛出 PDOException。
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'account', 'password');
} catch (PDOException $e) {
echo $e->getMessage();
}
2. 查询
使用 query 方法来执行查询语句,该方法返回一个 PDOStatement 对象,可以遍历该对象获得查询结果也可以用该对象的 fetch 或 fetchAll 方法获得查询结果。
$sta = $pdo->query('select * from table');
foreach($sta as $row) {
print_r($row);
}
$rows = $sta->fetchAll(PDO::FETCH_BOTH);
foreach($rows as $row) {
print_r($row);
}
print_r($sta->fetch(PDO::FETCH_BOTH, 0));
3. 增删改
使用 exec 方法来执行增删改操作,该方法返回操作影响的行数。
要获得增加操作的自增id可以使用 lastInsertId方法。
$num = $pdo->exec('insert into table values (1)');
echo $pdo->lastInsertId();
4. 准备查询
在需要用不同参数对多次执行一个查询时,例如多次修改数据时,准备查询可以提高效率。它是将 sql 语句编译成一个模版,每次执行时只替换模版中的参数。PDO 通过 prepare方法编译一个 SQL 模版,SQL 模版中可以用 ? 表示一个参数,也可以用 :参数名 表示一个有名字的参数。
prepare返回一个 PDOStatement 对象,通过它的 bindParam 方法设置参数,使用 execute 方法执行 SQL 模版,execute 方法有一个可选的数组参数,也可以在这里用数组设置模版参数。
$sta = $pdo->prepare('select * from table where name = ?'); //准备 SQL 模版,其中 ? 代表一个参数。
$sta->execute(array('name1')); //通过数组设置参数,执行 SQL 模版
$sta->execue(array('name2'));
print_r($sta->fetchAll());
$sta = $pdo->prepare('update table set name = 'newName' where name = :name'); //准备 SQL 模版,其中 :name 代表一个有名字的参数
$sta->execute(array(':name'=>'name1')); //通过数组设置参数,执行 SQL 模版
$sta->bindParam(':name', 'name2'); //通过bindParam设置参数
$sta->execute(); echo $sta->columnCount(); //columnCount 方法返回查询结果的行数 $sta->rowCount(); // 返回操作影响的行数
5. 错误处理
设置 PDO::ATTR_ERRORMODE 可以修改 PDO 错误处理模式。可选的模式有:
PDO::ERRORMODE_EXCEPTION 发生错误时抛出异常。
PDO::ERRORMODE_SILENCE 默认设置 发生错误时不进行任何处理。
PDO::ERRMODE_WARING 发生错误时生成一条警告消息。
同时我们可以通过 PDO 的 errorCode() 方法来获取标准 SQL 错误代码,通过 errorInfo() 方法获取错误消息。
$pdo->setAttribute(PDO::ATTR_ERRORMODE, PDO::ERRORMODE_EXCEPTION); //让 PDO 在发生错误时抛出异常
$pdo->exec('insert into table values (1)');
echo $pdo->errorCode(); //获得标准 SQL 错误码
echo $pdo->errorInfo()[2]; //获得错误信息 errorInfo 返回一个数组,0 位存 SQL 错误码;1 位存数据库驱动错误码;2 位存错误消息