使用 PDO 准备参数化查询

     2023-02-24     262

关键词:

【中文标题】使用 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时在命名参数前面使用冒号(:),还有几篇不使用冒号。我会尽快不使用冒号,因为它减少了一次击键并且更易于阅读。这对我来说似乎工作得 查看详情