【问题标题】:active record in codeigniter automatically adds quotes around where clause valuescodeigniter 中的活动记录自动在 where 子句值周围添加引号
【发布时间】:2013-01-11 00:01:32
【问题描述】:

我已经尝试阅读 stackoverflow 上的其他帖子,还检查了 ci 的活动记录文档,但我似乎无法找到我的问题的答案

我的模型中有以下逻辑:

    $query = $this->db->get_where('categories', array('parent_id' => $category_id));

根据 last_query() 方法生成的 sql 是:

SELECT * FROM (categories) WHERE parent_id = '8'

我需要删除数字 8 周围的引号。我该怎么做?

我尝试使用 select 语句并将 false 作为第二个参数传递。比如:

    $this->db->select('*', false);
    $this->db->from('categories');
    $this->db->where('parent_id=',$category_id);

但这并没有真正改变太多。有什么建议? 谢谢你

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    默认情况下,CodeIgniter 会尝试预测比较中的数据类型,并相应地使用适当的 SQL 语法。如果您的查询使用单引号,则可能表明 $category_id 被视为字符串而不是整数。如果你尝试会发生什么:

    $this->db->select('*');
    $this->db->from('categories');
    $this->db->where('parent_id', (int) $category_id);
    

    或者,您可以手动构建自己的 WHERE 语句:

    $this->db->where('parent_id = ' . (int) $category_id);
    

    【讨论】:

    • 这只会解决这种情况,如果变量不可转换,它将不会运行查询。
    • 如果变量实际上是一段文本,则强制转换操作会将其转换为 0 整数。查询仍会运行,但不会返回任何结果。
    • 在转换为 int 之前,您可以使用 ctype_digit() 查看它是否实际上是一个整数。如果字符串完全由数字组成,则此函数接受一个字符串并返回 true:php.net/manual/en/function.ctype-digit.php
    【解决方案2】:

    对于 MIN 和 MAX 查询,我使用 null 和 false 关键字来删除引号。

    $this->db->where("$value > min_column",null,false);
    $this->db->where("$value < max_column",null,false);
    

    【讨论】:

      【解决方案3】:

      这些方法的想法是自动转义以防止 SQL 注入,如果出于某种原因您不想发送这样的原始查询:

      $q = "select * from categories where parent_id = $category_id";
      $this->db->query($q)->result();
      

      我觉得这更容易。但是我认为您可以发送额外的false 参数来禁用它,例如:

        $query = $this->db->get_where('categories', array('parent_id' => $category_id),false);
      

      仅供参考,如果您想发送原始查询并转义它们(对于更复杂的查询),您可以使用:

      $category_id = $this->db->escape($category_id);
      

      【讨论】:

      • 感谢您提供有关复杂查询的提示。但是,选择中的 FALSE 参数并没有什么不同。也就是说,它并没有解决问题。我在发帖之前已经试过了......
      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      相关资源
      最近更新 更多