什么是参数化查询?
Posted
技术标签:
【中文标题】什么是参数化查询?【英文标题】:What is parameterized query? 【发布时间】:2011-06-10 08:49:57 【问题描述】:什么是参数化查询,php 和 mysql 中的此类查询示例是什么?
【问题讨论】:
【参考方案1】:参数化查询(也称为准备好的语句)是一种预编译 SQL 语句的方法,因此您需要提供的只是“参数”(想想“变量”)需要插入到语句中才能执行。它通常用作防止SQL injection attacks 的一种手段。
您可以在 PHP 的 PDO page(PDO 是一个数据库抽象层)上阅读更多关于这些的信息,但如果您使用 mysqli 数据库接口,您也可以使用它们(参见 prepare 文档)。
【讨论】:
@RJD22 不是真的 - 你刚刚发布了一个链接,我花时间解释了参数化查询是什么,为什么它们被普遍使用,以及它们可以在 PHP 中利用的两种方式。仅仅依靠外部链接通常是不受欢迎的,因为它们可能在未来消失/移动。 @RJD22 是的,特定链接非常不太可能发生变化。然而,这不是重点。如果 Stack Overflow 只是一系列外部链接,那么它的用处将大大减少,而且我添加了额外的信息,如果你不知道你在看什么,你必须在 PHP 网站上寻找相当多的信息才能找到为。 参数化查询和准备好的语句不是彼此不同吗? link @KennetCeleste 他们是;根据 API,您可以执行未准备好的参数化查询,并且可以制作包含不安全嵌入式用户输入的准备好的语句。我真希望人们不要再把这两个概念混为一谈了。【参考方案2】:这是对它是什么以及它如何工作的清晰简洁的解释。 How and Why to use Parameterization [archive link]
该过程基本涉及服务器预处理不带参数的请求,因此它知道它是查询的类型。因此,例如 SELECT 查询只是一个 SELECT 查询,并且不能通过参数(请求变量)连接成为 SELECT / DROP 或其他 MySql 注入。相反,注入数据将只是参数字段中的字符串数据。
【讨论】:
您的链接已失效【参考方案3】:该语句是数据库系统的特点之一,同一条SQL语句可以高效地重复执行。准备好的语句是一种模板,由不同参数的应用程序使用。Reference Article
数据库系统可以执行相同的SQL语句,而不需要对同一种SQL语句进行一次又一次的解析、编译和优化。
您可以在 MySQL 中编写或创建预准备语句,但这不是一种有效的方式,因为通过预准备语句 API 的二进制协议更好。
但您仍然可以编写,甚至不需要任何其他可以直接用 SQL 编写的编程。 您可以为 MySQL 客户端程序使用准备好的语句。您也可以在存储过程中使用准备好的语句用于动态 SQL 方法。
在 MySQL 中创建准备好的语句:reference is taken from this article
PREPARE TestStmt FROM
'SELECT * FROM Test
WHERE TestNumber=?';
您可以使用 PHP 代码通过其 API 管理预准备语句或在 JDBC 级别进行管理。
【讨论】:
【参考方案4】:参数化查询是一种查询,其中占位符用于参数并且参数值在执行时提供。
为什么使用参数化查询
-
使用参数化查询的最重要原因是避免 SQL 注入攻击。
第二个参数化查询负责处理 sql 查询可能失败的情况,例如在字段中插入 O'Baily。参数化查询处理此类查询,而不会强制您将单引号替换为双单引号。
【讨论】:
以上是关于什么是参数化查询?的主要内容,如果未能解决你的问题,请参考以下文章