【问题标题】:CodeIgniter like query with single quote in search stringCodeIgniter 类似于在搜索字符串中使用单引号的查询
【发布时间】:2013-09-17 16:03:24
【问题描述】:

我已经为此工作了 4 个多小时。我使用我正在做的活动记录选择查询: $this->db->like ('items.name',$search); 一切正常,但只要 $search 字符串中有单引号 ('),就会出现此错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行附近使用 's%' OR default_items.short LIKE 'faith\'s%' LIMIT 5' 的正确语法

我刚刚检查过它在 LIKE 查询的活动记录中添加了双反斜杠 \\ 而不是单斜杠。我尝试在 MySQL bt 中删除一个斜线,它正在工作。

我的代码:

$q = "faith's";
$query = $this->db->select('items_categories.slug as category_slug, items_categories.name as cat_name, items.name, items.price_value, items.cover_photo, items.slug');
$query->select('default_items.short as short',false);
$query->select('date(default_items.date_created) as date_created',false);
$query->join('items_categories','items_categories.id=items.root_id','inner');
$query->join('users','items.company_id=users.id','inner');
$query->like('items.name',$q);
$query->or_like('items.short',$q);
$query->limit(5);
$result =  $query->get($this->_table);
$both_prod_results = $result->result();

我正在使用 pyrocms 2.x。

【问题讨论】:

  • 这可能是魔术引号问题(即引号被转义两次,所以根本没有)。它们应该在 CodeIgniter/PyroCMS 中关闭,但你永远不知道...php.net/manual/en/security.magicquotes.whynot.php。如果没有,请显示更多代码。
  • 这里有同样的问题(未解决):stackoverflow.com/questions/18417441/…
  • 是的,所有魔术引号都已关闭。每当我使用 Like 函数时,我什至尝试用简单的查询创建一个简单的函数,它添加双反斜杠而不是单反斜杠。 PyroCMS 默认搜索使用 Match Against,这对我的系统来说似乎不可行。
  • 我不知道为什么在您尝试时它不起作用。不过看看this

标签: quotes pyrocms


【解决方案1】:

您可以尝试以下代码,也许它可以帮助您,但您必须在请求中的 every' 之前添加 \:

$value = "faith\'s";
$sql_request = "`short`  LIKE '%". $value ."%'";

$query = $this->db
              ->select('*')
              ->where($sql_request, null, false)
              ->get('default_items');

$result = $query->result();

dump($result);

【讨论】:

  • 我已经这样做了,WHERE 本身也添加了斜线。所以没用
【解决方案2】:

我想我需要回答我自己的问题。 好吧,这是一个黑客(不要认为它是否安全) 我已经修补了我的 MYSQLI 驱动程序:

我已经替换了这个:

return str_replace(array($this->_like_escape_chr, '%', '_'),
                    array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'),
                    $str);

用这个:

return str_replace(array($this->_like_escape_chr, '%', '_'),
                    array($this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'),
                    $str);

它添加了额外的斜线。并且也不认为它会允许sql注入等任何东西。

如果有人知道这是对的,请发表评论。

谢谢 乌梅尔

【讨论】:

  • 请参阅this 回答这可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 2019-12-09
  • 1970-01-01
  • 2010-12-25
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多