我正在重新设计一个使用最小数据库的 PHP 驱动的网站。原始版本使用“pseudo-prepared-statements”(执行引用和参数替换的 PHP 函数)来防止注入攻击并将数据库逻辑与页面逻辑分离。
用使用 PDO 和实际准备好的语句的对象替换这些临时函数似乎很自然,但是在阅读了它们之后,我不太确定。PDO 似乎仍然是一个好主意,但准备好的语句的主要卖点之一是能够重用它们……我永远不会。这是我的设置:
- 这些陈述都非常简单。大多数都是形式
SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1
。该批次中最复杂的语句只是三个这样的选择与UNION ALL
s 连接在一起。 - 每个页面命中最多执行一个语句并且只执行一次。
- 我在一个托管环境中,因此对通过亲自进行任何“压力测试”来抨击他们的服务器持谨慎态度。
鉴于使用准备好的语句至少会使我正在进行的数据库往返次数增加一倍,我最好避免使用它们吗?我是否可以PDO::MYSQL_ATTR_DIRECT_QUERY
在保留参数化和注入防御优势的同时避免多次数据库访问的开销?或者,与执行我不应该担心的未准备好的查询相比,准备好的语句 API 使用的二进制调用是否表现得足够好?
编辑:
感谢所有好的建议,伙计们。这是我希望我可以将多个答案标记为“已接受”的地方——许多不同的观点。不过,最终,我必须对rick给予应有的回报……如果没有他的回答,即使听从了每个人的建议,我也会幸福地离开并做完全错误的事情。:-)
它是模拟的准备好的语句!