小编典典

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

mysql

我正在重新设计一个使用最小数据库的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使用的二进制调用执行得足够好?

编辑:

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

是模拟准备好的语句!


阅读 325

收藏
2020-05-17

共1个答案

小编典典

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

2020-05-17