【问题标题】:Removing/disabling backticks on variable in Active Record query in CodeIgniter在 CodeIgniter 的 Active Record 查询中删除/禁用变量的反引号
【发布时间】:2017-07-05 21:19:36
【问题描述】:

我正在尝试使用 CodeIgniter 的查询类对我的数据库进行“介于”查询,但是,当向 where 子句添加变量时,它会向变量添加反引号。

$this->db->select(TABLE_DISCOUNTSCARRIER.'.discount')->select(TABLE_DISCOUNTSCARRIER.'.idCarrier')
$this->db->from(TABLE_DISCOUNTSCARRIER);
$this->db->join(TABLE_DISCOUNTS, TABLE_DISCOUNTSCARRIER.'.idDiscount='.TABLE_DISCOUNTS.'.idDiscount');
$this->db->where(TABLE_DISCOUNTSCARRIER.'.idCarrier', $carrier);
$this->db->where($data['from'].' BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to');
$this->db->or_where($data['to'].' BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to');

解析成这个(最后两行)

SELECT 
    discountbycarrier.discount, 
    discountbycarrier.idCarrier 
FROM (discountbycarrier) 
JOIN discounts 
ON discountbycarrier.idDiscount=discounts.idDiscount 
WHERE `discountbycarrier`.`idCarrier` = '6' 
AND `5` BETWEEN discounts.from AND discounts.to 
OR `10` BETWEEN discounts.from AND discounts.to

已经尝试设置 $this->db->_protect_identifiers=false;但它删除了其余语句的反引号,但没有删除变量。已经尝试使用变量的 intval() ,但这都不起作用。 如您所见,变量 $carrier 被正确地解析为整数。 有任何想法吗?提前致谢。

【问题讨论】:

  • 您的问题是缺少反引号,特别是这里discounts.from 不是因为有他们,所以保留了from 这个词。
  • 它没有刻度,因为我只是将 _protect_identifiers 设置为 false。如果我启用它,则查询的其余部分都有反引号,包括来自的折扣。
  • 我使用正确的 SQL 而不是他们愚蠢的查询生成器,此外你不应该像 ? 那样输入然后提供值或其他东西。否则这对于 SQL 注入来说已经成熟了......只是说。

标签: php mysql codeigniter


【解决方案1】:

改变这个

   discounts.from

  discounts.`from`

或者更好(最佳实践)不要对表列使用保留关键字,换句话说,FROM 这个词是查询语言的一部分。

反引号用于转义保留的关键字和空格。

更新

类似的东西(虽然我没有看文档)

  $this->db->where('? BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to', $data['from']);

【讨论】:

    【解决方案2】:

    在查询之前添加这个

    $this->db->_protect_identifiers=false;
    

    【讨论】:

    • 我发帖说我用过,反引号还是出现了
    • 抱歉,我没看到。您可以发布您预期的查询字符串吗?
    猜你喜欢
    • 2014-06-26
    • 2011-09-27
    • 2016-03-15
    • 2011-11-20
    • 2015-01-29
    • 1970-01-01
    • 2012-04-17
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多