PDO介绍

PDO是PHP Date Oject的缩写,即PHP数据对象。提供了访问各种数据的一致接口,使用方便、简单,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

PDO提供了预处理功能来防止SQL注入,另外也可以使用事务功能。

安装PDO扩展

PHP在安装的时候,已经默认安装了pdo,但要使用pdo操作具体的数据库,需要安装响应的pdo-dbname驱动扩展。安装具体的pdo数据库驱动扩展安装方法这里不做说明。

要查看PDO支持哪些数据库驱动,点击这里:PHP: PDO 驱动 - Manual

使用PDO连接数据库

下面使用pdo连接本地的msyql数据库,实例化PDO类:

$pdo = new PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8', 'root', '123456');

第一个参数中,mysql为数据库名称,其后面的参数:

  • host:数据库主机地址,本地可以填localhost127.0.0.1
  • port:数据库服务端口号,如果为对应数据库的默认端口,可以省略。
  • dbname:要选择数据库名称,这里可以不写,之后可以用执行use dbname选择。但注意要有改数据库的操作权限。
  • charset:传输数据使用的字符集,推荐使用utf8

第二个参数为数据库用户名,第三个参数为用户密码。

如果连接出现错误,将抛出一个 PDOException 异常对象,你可以使用 try-catch 语句捕获它。

其实还有第四个参数,用来设置连接参数,请参考PHP手册。

执行SQL查询

执行一条SQL查询很简单:

$sql = "select * from tb_user";
$statement = $pdo->query($sql);

query方法执行一条sql语句,查询失败返回false,成功则返回一个PDOStatement对象。

PDOStatement是PDO语句类,用来获取查询语句结果、执行预处理语句)

获取错误信息

先看看怎么执行失败时候如果获取错误信息,pdo类提供两个两个方法:

// 返回一个 SQLSTATE,由5个字母或数字组成的在 ANSI SQL 标准中定义的标识符。
PDO::errorCode ( void ) : mixed

// 获取最后一个操作相关的错误信息(包含了errorCode,所以一般使用这个即可)
public PDO::errorInfo ( void ) : array

errorInfo方法返回的数组结构如下:

元素 说明信息
0 SQL 错误状态码
1 驱动返回的错误码
2 驱动返回的错误信息

获取查询结果

如果执行的是select语句,并且语句执行成功,则可以通过query方法返回的PDOStatement对象获取查询的结果。PDOStatement类相关的方法有:

// 一般来说如果语句无返回数据使用`rowCount`获取SQL语句影响的行数即可,如insert、delete、update等语句。
PDOStatement::rowCount — 返回受上一个SQL语句影响的行数

// 如果有返回数据使用下面的方法,如select语句。
PDOStatement::columnCount — 返回结果集中的列数
PDOStatement::setFetchMode — 为语句设置默认的获取模式。
PDOStatement::fetch — 从结果集中获取下一行
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。

获取 select 语句返回数据的例子:

// 设置获取的数据为关联数组(推荐)
$statement->setFetchMode(PDO::FETCH_ASSOC);
// 一行一行的获取
while ($row = $statement->fetch()) {
    print_r($row);
}
// 一次全部取出
$rows = $statement->fetchAll();
print_r($rows);

使用预处理防止SQL注入

PDO一个强大的功能就是提供了预处理功能,通过先设置sql查询格式,可以有效的防止SQL注入攻击(什么是SQL注入请自己查阅资料)。

要使用预处理,先调用pdo对象的prepare方法来设置需要的SQL语句格式,该方法返回一个PDOStatement对象。接着PDOStatement对象的execute方法绑定具体的参数并执行查询:

$sql = "select * from tb_user where id=:id and password=:password";
$statement = $pdo->prepare($sql);
$args = [
    ':id' => 1004,
    ':password' => '123456',
];
$res = $statement->execute($args);

上面使用名称占位符,还可以使用通用占位符?,那么绑定的参数的时候不需要指定名称,按顺序传入即可,就像这样:

$sql = "select * from tb_user where id=? and password=?";
$statement = $pdo->prepare($sql);
$args = [1004, '123456'];
$res = $statement->execute($args);

还可以不一次性传入所有参数,而是以一个一个的绑定参数:

/*  通过列名绑定  */
$statement->bindColumn('name', 1004);
$statement->bindColumn('password', '123456');

/*  通过列号绑定  */
$statement->bindColumn(1, 1004);
$statement->bindColumn(2, '123456');

execute方法会返回一个bool值表示查询是否成功,如果返回false你可以使用下面两个方法获取错误信息:

PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息

使用事务

(未完待续)

参考文章

  1. PHP手册:PHP: PDO - Manual
是白的 我是一个勤奋的爬虫~~
{{uname}}

{{meta.replies}} 条回复
写下第一个评论!

-----------到底了-----------