【发布时间】:2014-06-21 00:44:16
【问题描述】:
似乎关于这个主题的每个问题都是 mysqli 准备好的语句和 PHP 中的直接 mysqli 查询之间的区别,但是当准备好的语句不能满足您的需求时该怎么办。
在执行简单查询时,准备好的语句肯定是要走的路:
$stmt = $connection->prepare("SELECT * FROM my_table WHERE id = ?");
但是当事情变得更复杂时呢?来自 PHP 手册:
但是,在为 SELECT 语句返回的列命名的选择列表中,或指定二元运算符的两个操作数(例如= 等号。
这成为复杂查询的问题,确实需要指定二元运算符的两个操作数,或mysqli_prepare 具有的其他一些限制。
在我的例子中,我需要执行一些查询来返回博客条目的结果(这是一个简化的例子,我的连接变量实际上是博客类的私有属性,但你明白了):
$query = $connection->query("SELECT * FROM my_table WHERE $field = '$search'");
在此示例中,$field 变量是要搜索的列,$search 变量是要搜索的内容。准备好的语句无法进行此类查询。
我已经为这些函数做了很多仔细的规划,因为我知道只有 X 列可供搜索,所以我使用条件来检查 $field 是否等于这些列之一, 和 mysqli_real_escape_string 转义任何可能的引号字符。但这是好的做法吗?根据我在 SO 上阅读和回答的内容,您应该始终使用准备好的语句,但我从未在这些示例中看到过复杂的查询。有没有更好的方法来防止 SQL 注入,更高级的方法来使用准备好的语句,还是我应该在这里坚持非常仔细的验证?
【问题讨论】:
-
新来者选择
mysqli而不是PDO通常是由于研究有限,并且通过名称相似性假设它是更容易的迁移路径。 (不是。)
标签: php security mysqli prepared-statement