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);
?>