Php 什么时候应该转义sql查询
指 有许多函数接受可选的Php 什么时候应该转义sql查询,php,mysql,codeigniter,codeigniter-3,Php,Mysql,Codeigniter,Codeigniter 3,指 有许多函数接受可选的$escape参数,定义如下: $escape(bool)–是否转义值和标识符 在什么情况下应该或不应该逃跑?您提供的链接中实际解释了这一点: 如果您使用的是CodeIgniter逃避查询的数据库,那么 可以通过传递可选的第三个参数来防止转义内容, 并将其设置为FALSE 它意味着;例如,支持MySQL,它将转义: $this->db->having('user_id', 45); // Produces: HAVING `user_id` = 45 in
$escape
参数,定义如下:
$escape(bool)–是否转义值和标识符
在什么情况下应该或不应该逃跑?您提供的链接中实际解释了这一点: 如果您使用的是CodeIgniter逃避查询的数据库,那么 可以通过传递可选的第三个参数来防止转义内容, 并将其设置为FALSE 它意味着;例如,支持MySQL,它将转义:
$this->db->having('user_id', 45); // Produces: HAVING `user_id` = 45 in some databases such as MySQL
要禁用它,请执行以下操作:
$this->db->having('user_id', 45, FALSE); // Produces: HAVING user_id = 45
但你的问题是什么时候使用FALSE
参数,对吗?因此,让我给您一个使用FALSE
参数的场景,来自:
如果需要复合select语句,则此(FALSE)非常有用
如果没有FALSE
,它将产生:
SELECT `(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4`
但是如果为FALSE
:
SELECT (SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4
理想的情况是最后一个。使用FALSE
is只需删除反勾(`)
这种用法是首选的,因为它很实用,但我不推荐它,因为它令人困惑
我喜欢这样写:
<?php
.
.
$whatever_query = $this->db->get_compiled_select();
$query = $this->db->query('SELECT (SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4 '.$whatever_query);
?>
但也有人更喜欢使用:$this->db->select()
,这就是为什么会有一个FALSE
参数
顺便说一下,这不是一个特定的问题。在调用其他查询生成器函数时,可能有许多情况需要使用
FALSE
参数。但是这种情况的常见关键字可能是复合语句除非事先对输入进行了清理,否则您应该始终转义值和标识符。唯一的例外是当没有任何输入来自用户时。@shmosel,DFriend,谢谢。我现在明白了。@DFriend仅仅因为它们不是来自用户并不意味着它们不需要被转义。@chris85,你说得很对。我被纠正了。也许这个故事的寓意是,“用户输入”不仅来自POST/GET,而且还应该从数据库检索以前提供的输入。它还指出了适当的数据清理的重要性。转义输入值是不够的。
<?php
.
.
$whatever_query = $this->db->get_compiled_select();
$query = $this->db->query('SELECT (SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4 '.$whatever_query);
?>