关键词:
【中文标题】使用 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 参数化与非参数化查询速度
...014-06-0417:49:28【问题描述】:根据我最近几个月对PHP-PDO的使用,我了解到您可以执行PREPARE语句,然后运行查询。事实上,如果我要在复杂的连接上选择SELECT,改变where条件,重复次数,我可以看到它的用处。或者,类似地,如果... 查看详情
如何在 PHP 中为动态查询构建参数化 PDO 语句?
...。我已经看到有关静态SQL的答案,但在这种情况下,我想使用PDO->prepare()作为在运行时动态构建的查询字符串。分解成一个简单的例子:$TempSQL="SE 查看详情
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]
...【发布时间】:2010-12-1916:04:10【问题描述】:在PHP中,当使用带有参数化查询的PDO访问MySQL数据库时,如何检查最终查询(在替换所有标记之后)?有没有办法检查数据库真正执行了什么?【问题讨论】:我真的希望有办法 查看详情
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]
...【发布时间】:2010-12-1916:04:10【问题描述】:在PHP中,当使用带有参数化查询的PDO访问MySQL数据库时,如何检查最终查询(在替换所有标记之后)?有没有办法检查数据库真正执行了什么?【问题讨论】:我真的希望有办法 查看详情
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]
...【发布时间】:2010-12-1916:04:10【问题描述】:在PHP中,当使用带有参数化查询的PDO访问MySQL数据库时,如何检查最终查询(在替换所有标记之后)?有没有办法检查数据库真正执行了什么?【问题讨论】:我真的希望有办法 查看详情
PDO 参数化查询的工作方式
】PDO参数化查询的工作方式【英文标题】:ThewayPDOparametrizedqueryworks【发布时间】:2011-04-1305:37:36【问题描述】:请仔细阅读问题。“我的代码不起作用!!!”这不是通常的愚蠢行为问题。当我运行此代码时出现预期错误try$sth=... 查看详情
是否在 PDO oveekill 中清理数据 + 参数化? [复制]
...?[duplicate]【发布时间】:2017-01-1514:55:36【问题描述】:在使用PDO准备好的语句时使用filter_input()或任何类似的验证/清理功能过大:$sql="SELECTcount(*)FROMplayers_testWHEREemail=:v 查看详情
PDO 参数化查询 - 重用命名占位符?
】PDO参数化查询-重用命名占位符?【英文标题】:PDOParameterizedQuery-Reusenamedplaceholders?【发布时间】:2011-01-2618:53:56【问题描述】:本质上,我有一个值,我必须在我的SQL查询中调用几次。因此,是否可以在语句中重用相同的命... 查看详情
如何在 PDO 中为准备好的查询绑定参数?
】如何在PDO中为准备好的查询绑定参数?【英文标题】:HowbindparametersforapreparedqueryinPDO?【发布时间】:2015-08-2117:47:53【问题描述】:MSAccess中有一个数据库,是否准备(存储)了名称为testQuery:PARAMETERStourNumber;SELECT*FROMToursWHEREID=to... 查看详情
pdo(预编译参数化查询)和安全问题(代码片段)
...MS审计的一点总结/看到了对SQL注入的挖掘思路:cms中如果使用了PDO,我们的挖掘思路就是跟进涉及到table,orderby等字段的拼接去,因为这些字段是无法使用PDO的。为什么无法使用?这篇文章来分析一下。什么是PDO毫无疑问,他的... 查看详情
参数化 PDO 查询和“LIMIT”子句 - 不起作用 [重复]
】参数化PDO查询和“LIMIT”子句-不起作用[重复]【英文标题】:ParametrizedPDOqueryand`LIMIT`clause-notworking[duplicate]【发布时间】:2013-08-0301:22:12【问题描述】:我有这样的查询:SELECTimageurlFROMentriesWHEREthumbdlISNULLLIMIT10;它与PDO和MySQLWorkben... 查看详情
PHP - 具有未知数量参数的安全 PDO 准备语句
...题(这让我感到惊讶,但也许我不知道如何搜索)在尝试使用PDO之前,我使用了简单的、不受保护的查询。我的准备函 查看详情
使用准备好的语句构建 PDO 动态查询
】使用准备好的语句构建PDO动态查询【英文标题】:PDODynamicQueryBuildingwithpreparedstatements【发布时间】:2018-08-0709:27:03【问题描述】:我基本上是在尝试使用动态查询来更新用户信息。一切都很好,但是当我尝试执行查询时,它的... 查看详情
为啥在 PHP 和 MySQL 中使用 PDO 的某些类型的准备查询很慢?
】为啥在PHP和MySQL中使用PDO的某些类型的准备查询很慢?【英文标题】:WhyarecertaintypesofpreparedqueriesusingPDOinPHPwithMySQLslow?为什么在PHP和MySQL中使用PDO的某些类型的准备查询很慢?【发布时间】:2011-05-2000:57:50【问题描述】:当使用... 查看详情
SQL 注入中的“参数化查询/准备语句”如何比转义用户输入更好
...时间】:2018-05-1816:23:09【问题描述】:有很多articles告诉使用parametrizedqueries而不是escapinguserinput。 查看详情
如何使用准备好的 PDO 语句设置 ORDER BY 参数?
】如何使用准备好的PDO语句设置ORDERBY参数?【英文标题】:HowdoIsetORDERBYparamsusingpreparedPDOstatement?【发布时间】:2011-02-0207:11:39【问题描述】:我在使用SQL的ORDERBY部分中的参数时遇到问题。它不会发出任何警告,但不会打印任何... 查看详情
如何使用准备好的 PDO 语句设置 ORDER BY 参数?
】如何使用准备好的PDO语句设置ORDERBY参数?【英文标题】:HowdoIsetORDERBYparamsusingpreparedPDOstatement?【发布时间】:2010-03-3002:01:19【问题描述】:我在使用SQL的ORDERBY部分中的参数时遇到问题。它不会发出任何警告,但不会打印任何... 查看详情
PDO 准备好的语句 - 参数名称中的冒号用于啥?
...时间】:2013-06-2712:16:40【问题描述】:我看到很多文章在使用PDO时在命名参数前面使用冒号(:),还有几篇不使用冒号。我会尽快不使用冒号,因为它减少了一次击键并且更易于阅读。这对我来说似乎工作得 查看详情