本篇文章给大家介绍一下PHP中的预处理类及绑定数据。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
PHP中的PDO操作学习(三)预处理类及绑定数据
要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更重要的就是它的预处理能力,也就是 PDOStatement 所提供的功能。因为它的存在,才让我们可以安心地去使用而不用操心 SQL 语句的拼接不好所带来的安全风险问题。当然,预处理也为我们提升了语句的执行效率,可以说是 PDO 的另一大杀器。
PDOStatement 类
PDOStatement 类其实就是代表一条预处理语句,并在该语句被执行后代表一个相关的结果集。它提供一些方法,让我们能够对这条预处理语句进行操作。
$dns = 'mysql:host=localhost;dbname=blog_test;port=3306;charset=utf8'; $pdo = new PDO($dns, 'root', '', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $stmt = $pdo->prepare("select * from zyblog_test_user"); // PDOStatement 对象的内容 var_dump($stmt); // object(PDOStatement)#2 (1) { // ["queryString"]=> // string(57) "select * from zyblog_test_user where username = :username" // }
PDOStatement 对象是通过 PDO 对象的 prepare() 方法返回的一个对象。它没有构造函数,也就是说我们不能直接实例化一个 PDOStatement 对象。它包含一个只读属性,也就是我们要执行的 SQL 语句,保存在 queryString 中。
PDOStatement 错误处理
接下来我们先看看 PDOStatement 的两个错误信息方法。
// 没有指定异常处理状态下的错误信息函数 $pdo_no_exception = new PDO($dns, 'root', ''); $errStmt = $pdo_no_exception->prepare("select * from errtable"); $errStmt->execute(); var_dump($errStmt->errorCode()); // string(5) "42S02" var_dump($errStmt->errorInfo()); // array(3) { // [0]=> // string(5) "42S02" // [1]=> // int(1146) // [2]=> // string(40) "Table 'blog_test.errtable' doesn't exist" // }
在之前的文章中,我们学习过,如果不给 PDO 对象指定错误处理格式的话。它会使用返回错误码和错误信息的方式处理错误。在这种情况下,如果预处理的语句有问题,我们就可以通过 errorCode() 和 errorInfo() 方法来获得错误的代码和错误的详细信息。不过,还是更加推荐指定 PDO 的错误处理方式为抛出异常,就像最上面我们定义的 PDO 对象那样。这样我们就可以通过 try…catch 来处理错误异常了。
PDOStatement FETCH_MODE 指定
// 为语句设置默认的获取模式。 $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ var_dump($row); } // array(4) { // ["id"]=> // string(1) "1" // ["username"]=><i style="color:transparent">来源gaodai$ma#com搞$代*码网</i>; // string(3) "aaa" // ["password"]=> // string(3) "aaa" // ["salt"]=> // string(3) "aaa" // } // ……
为查询结构指定 FETCH_MODE 是通过 setFetchMode() 方法来实现的。之前我们也讲过,通过 PDO 对象的属性可以指定默认的查询结果集模式,不过在 PDOStatement 中,也可以通过这个方法来为当前的这一次预处理语句的查询指定 FETCH_MODE 。
PDOStatement 获取列数量及字段信息
// 返回结果集列数、返回结果集中一列的元数据 $stmt = $pdo->prepare("select * from zyblog_test_user"); $stmt->execute(); var_dump($stmt->columnCount()); // int(4) var_dump($stmt->getColumnMeta(0)); // array(7) { // ["native_type"]=> // string(4) "LONG" // ["pdo_type"]=> // int(2) // ["flags"]=> // array(2) { // [0]=> // string(8) "not_null" // [1]=> // string(11) "primary_key" // } // ["table"]=> // string(16) "zyblog_test_user" // ["name"]=> // string(2) "id" // ["len"]=> // int(11) // ["precision"]=> // int(0) // }