我正在重新设计一个使用最小数据库的PHP驱动的网站。原始版本使用“伪准备语句”(执行引号和参数替换的PHP函数)来防止注入攻击并将数据库逻辑与页面逻辑分开。
用一个使用PDO和真正的预备语句的对象替换这些临时功能似乎很自然,但是在对它们进行阅读之后,我不太确定。PDO似乎仍然是一个好主意,但是准备好的语句的主要卖点之一是能够重用它们……我永远不会。这是我的设置:
SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1
UNION ALL
鉴于使用准备好的语句至少将使我进行的数据库往返次数增加一倍,我最好避免使用它们吗?我是否可以PDO::MYSQL_ATTR_DIRECT_QUERY在保留参数化和注入防御优势的同时避免多次数据库旅行的开销?还是与执行我不为之担心的非准备查询相比,准备语句API使用的二进制调用执行得足够好?
PDO::MYSQL_ATTR_DIRECT_QUERY
编辑:
伙计们,感谢您的所有好的建议。我希望在这里我可以将多个答案标记为“已接受”-许多不同的观点。不过说到底,我给里克他应…没有他的回答,我会幸福地出去了,即使做了完全错误的事情 之后 大家的意见。:-)
是模拟准备好的语句!
我认为您想要PDO :: ATTR_EMULATE_PREPARES。这样可以关闭本机数据库准备好的语句,但是仍然允许查询绑定以防止sql注入并保持sql整洁。据我了解,PDO :: MYSQL_ATTR_DIRECT_QUERY完全关闭查询绑定。