什么时候我应该逃避SQL查询

时间:2017-01-24 02:51:02

标签: php mysql codeigniter codeigniter-3

参考CodeIgniter Query Builder

有许多函数接受可选的$escape参数,定义为:

  

$ escape(bool) - 是否转义值和标识符

在什么情况下应该或不应该逃避?

1 个答案:

答案 0 :(得分:3)

您在提供的链接中实际解释过:

  

如果您正在使用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论证吧?那么,让我给你一个使用来自the old documentationFALSE参数的场景:

$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE); 
  

如果您需要复合选择语句,则此(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只是删除反引号(`)。

这种用法是首选,因为它的写作很实用,但我不推荐它,因为它令人困惑。

我更喜欢这样写:

<?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参数。

顺便说一下,它不是$this->db->select()特定问题。在调用其他查询构建器函数时,可能有许多情况需要使用FALSE参数。但是这种情况的常见关键字可能是复合语句