当前位置: 首页 > 面试题库 >

什么时候不使用准备好的语句?

吴西岭
2023-03-14
问题内容

我正在重新设计一个使用最小数据库的PHP驱动的网站。原始版本使用“伪准备语句”(执行引号和参数替换的PHP函数)来防止注入攻击并将数据库逻辑与页面逻辑分开。

用一个使用PDO和真正的预备语句的对象替换这些临时功能似乎很自然,但是在对它们进行阅读之后,我不太确定。PDO似乎仍然是一个好主意,但是准备好的语句的主要卖点之一是能够重用它们……我永远不会。这是我的设置:

  • 这些语句都很简单。大多数形式SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1。批次中最复杂的语句就是将三个这样的select与UNION ALLs 连接在一起。
  • 每个页面命中 最多 执行一个语句,并且仅执行一次。
  • 我处于托管环境中,因此不愿意亲自进行任何“压力测试”来猛击服务器。

鉴于使用准备好的语句至少将使我进行的数据库往返次数增加一倍,我最好避免使用它们吗?我是否可以PDO::MYSQL_ATTR_DIRECT_QUERY在保留参数化和注入防御优势的同时避免多次数据库旅行的开销?还是与执行我不为之担心的非准备查询相比,准备语句API使用的二进制调用执行得足够好?

编辑:

伙计们,感谢您的所有好的建议。我希望在这里我可以将多个答案标记为“已接受”-许多不同的观点。不过说到底,我给里克他应…没有他的回答,我会幸福地出去了,即使做了完全错误的事情
之后 大家的意见。:-)

是模拟准备好的语句!


问题答案:

我认为您想要PDO ::
ATTR_EMULATE_PREPARES。这样可以关闭本机数据库准备好的语句,但是仍然允许查询绑定以防止sql注入并保持sql整洁。据我了解,PDO ::
MYSQL_ATTR_DIRECT_QUERY完全关闭查询绑定。



 类似资料:
  • 将Camel 2.13.1与Spring 2.7.11一起使用,并在尝试使用SQL组件运行更新查询时收到SQL异常。下面是如何将更新查询添加到路由中,并使用主体中的java.util.Map将输入参数值传递给该语句。 主要问题:如果我在准备好的语句中只有一个输入参数,那么它工作得很好…如果我有以下更新查询中的多个,那么它将失败,出现sql异常

  • 问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。

  • 我有一个将列名映射到值的。要更新的列事先未知,在运行时决定。 例如< code>map = {col1: "value1 ",col2: "value2"}。 我想执行一个< code>UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,有没有一种优雅的方法可以不用手动构建查询?

  • 问题内容: 对于此查询,有必要使用吗? 任何改进或查询是否还好? 在这种情况下,查询速度很重要。 问题答案: 否,准备好的查询(正确使用时)将确保对数据进行正确的转义以进行安全查询。您有点正确地使用它们,只需要更改一件事。因为您使用的是“?” 占位符,最好通过execute方法传递参数。 请注意,如果要将其输出到页面,数据库清理并不意味着可以在HTML中安全显示,因此也可以在其上运行htmlspe

  • 问题内容: 我已经阅读了很多有关准备好的语句的信息,并且在阅读的所有内容中,没有人谈论使用它们的弊端。因此,我想知道是否有人们容易忽视的“有龙”斑点? 问题答案: Prepared语句只是一个经过解析和预编译的语句,它仅等待提供绑定变量的执行。 任何执行的语句迟早都会准备(需要解析,优化,编译然后执行)。 一条准备好的语句只是重用了解析,优化和编译的结果。 通常,即使您自己不使用准备好的查询,数据