使用 PDO 准备参数化查询
Posted
技术标签:
【中文标题】使用 PDO 准备参数化查询【英文标题】:prepared parameterized query with PDO 【发布时间】:2010-11-20 21:57:16 【问题描述】:这种在 php 和 mysql 驱动的基于 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 查询和“LIMIT”子句 - 不起作用 [重复]