使用 PDO 准备参数化查询

Posted

技术标签:

【中文标题】使用 PDO 准备参数化查询【英文标题】:prepared parameterized query with PDO 【发布时间】:2010-11-20 21:57:16 【问题描述】:

这种在 phpmysql 驱动的基于 Web 的应用程序中处理 SQL 的新安全方式的新方法,以保护代码免受 SQL 注入。我打算开始使用带有 PDO 的 mysqli。任何人都可以请概述我应该如何开始和继续。

对任何文章的任何引用也会有所帮助。

提前致谢。

【问题讨论】:

【参考方案1】:

创建连接

try 
    $db = new PDO("mysql:dbname=".DB_NAME.";host=".DB_HOST,DB_USER,DB_PWD);
 catch (PDOException $e) 
    die("Database Connection Failed: " . $e->getMessage());

然后准备一份声明

$prep = $db->prepare("SELECT * FROM `users` WHERE userid = ':id'");

如您所见,您可以通过在任何字符串前面加上“:”来标记您想要的每个参数。然后你所做的就是在执行时传递一个数组,将参数 (:id) 映射到值。

if (!$prep->execute(array(":id" => $userinput))) 
   $error = $prep->errorInfo();
   echo "Error: $error[2]"; // element 2 has the string text of the error
 else 
   while ($row = $prep->fetch(PDO::FETCH_ASSOC))  // check the documentation for the other options here
        // do stuff, $row is an associative array, the keys are the field names
   

除了具有“获取”功能的 PDO::FETCH_ASSOC 之外,还有其他各种获取数据的方法。您可以使用 fetchAll 一次获取所有结果的数组,而不是逐行获取。或者您可以将信息数组作为 0 索引数组获取,或者您甚至可以将结果直接获取到类实例中(如果字段名称与类的属性对齐。)

所有 PDO 的文档都可以在这里找到:PHP.net PDO Manual

【讨论】:

我相信你不需要引号包围占位符:"SELECT * FROM `users` WHERE userid = :id"

以上是关于使用 PDO 准备参数化查询的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 PDO 对象进行参数化 SELECT 查询

参数化 PDO 查询和“LIMIT”子句 - 不起作用 [重复]

什么是参数化查询?

PDO(预编译参数化查询)和安全问题

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]