MySQLi准备的语句与查询

萨姆拉普

似乎该主题上的每个问题都是mysqli预准备语句和PHP中直接mysqli查询之间的区别,但是当预准备语句不能满足您的需求时该怎么办。

在执行简单查询时,准备好的语句无疑是解决问题的方法:

$stmt = $connection->prepare("SELECT * FROM my_table WHERE id = ?");

但是,当事情变得更加复杂时呢?从PHP手册中:

但是,在选择列表(用于命名要由SELECT语句返回的列)或指定二进制运算符的两个操作数(例如=等号)的选择列表中,不允许使用[markers]作为标识符(例如表或列名) 。

对于确实需要指定二进制运算符的两个操作数或具有其他一些限制的复杂查询,这将成为一个问题mysqli_prepare

就我而言,我需要执行一些查询以返回博客条目的结果(这是一个简化的示例,我的连接变量实际上是博客类的私有属性,但是您可以理解):

$query = $connection->query("SELECT * FROM my_table WHERE $field = '$search'");

在此示例中,$field变量是要搜索的列,$search变量是要搜索的列。对于准备好的语句,这种类型的查询是不可能的。

我已经对诸如此类的功能进行了很多周密的计划,并且由于我知道只有X个列可供搜索,因此我使用条件语句来检查$field是否等于这些列之一,并mysqli_real_escape_string避免任何可能的情况发生。引用字符。但是,这是好习惯吗?基于我在SO上的阅读和回答,您应该始终使用准备好的语句,但是在这些示例中我从未见过复杂的查询。是否有防止SQL注入的更好方法,使用预处理语句的更高级方法,还是我应该在这里坚持非常仔细的验证?

耶罗恩

是和否:有必要再次检查该$field变量的白名单-这是防止sql注入的唯一方法-但mysqli_real_escape_string在该$field变量使用毫无意义如果您的列名是保留字或以数字开头,则应在反引号中将其引号,但仅此而已。

您仍然应该对$search变量使用准备好的语句,尽管这里mysqli_real_escape_string也可以这样做(而不是准备好的语句,不能同时使用两者)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP MySQLi准备的语句

来自分类Dev

Mysqli准备的语句错误?

来自分类Dev

如何使用mysqli准备用于选择查询的语句

来自分类Dev

查询使用SQL变量时Mysqli PHP准备的语句

来自分类Dev

PHP MySQLi准备的语句fetch()返回'1'而不是查询结果

来自分类Dev

无法在 MySQLi 中使用准备好的语句运行查询

来自分类Dev

使用准备好的语句 mysqli 获取查询结果

来自分类Dev

准备语句与直接查询

来自分类Dev

PHP MySQLi准备的语句-SELECT

来自分类Dev

PHP MySQLi准备的语句-SELECT

来自分类Dev

mysqli 准备好的语句 num_rows 返回 0 而查询返回大于 0

来自分类Dev

PHP if mysqli查询语句

来自分类Dev

MySQLi在while循环中准备的语句

来自分类Dev

嵌套MySQLi准备好的语句

来自分类Dev

mysqli准备语句和用户卫生

来自分类Dev

PHP-MySQLi预准备语句

来自分类Dev

PHP MySQLi准备的语句不起作用

来自分类Dev

mysqli用ADDTIME CURTIME准备的语句失败

来自分类Dev

Mysqli准备语句插入未插入

来自分类Dev

mysqli函数内部准备好的语句

来自分类Dev

mysqli准备语句num_rows函数

来自分类Dev

Mysqli准备的语句不起作用

来自分类Dev

如何准备使用数组的mysqli语句?

来自分类Dev

PHP-MySQLi预准备语句

来自分类Dev

mysqli准备的语句get_result()?

来自分类Dev

从mysqli准备好的语句创建数组

来自分类Dev

PHP MySQLi准备的语句不起作用

来自分类Dev

Mysqli准备的语句选择不起作用

来自分类Dev

PHP:Mysqli准备的语句带有“选择*”