1

背景

  • 框架:Codeignighter/PyroCMS

我有一个存储产品列表的数据库,duplicate function我的应用程序中有一个首先查找通用产品名称的数据库,因此它可以suffix为重复的产品添加一个“”值。

我的 Products 模型类中的代码

$product = $this->get($id);

$count = $this->db->like('name', $product->name)->get('products')->num_rows();

$new_product->name = $product->name . ' - ' . $count;

在第二行,应用程序仅在$product->name包含引号时才会失败。我理解 Codeignighter 转义了所有字符串,所以我不知道为什么会出现此错误。

所以我尝试使用 MySQL 转义字符串函数,但这也无济于事。

错误信息

A Database Error Occurred

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Book%'' at line 3

SELECT * FROM `products` WHERE `name` LIKE '%Harry\\'s Book%'

var_dump

以下是在相关行之前和之后执行var_dumpon的输出;product->name

string 'Harry's Book' (length=12)

A Database Error Occurred

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Book%'' at line 3

SELECT * FROM `products` WHERE `name` LIKE '%Harry\\'s Book%'
4

3 回答 3

2

让我们对此进行一些测试。

这是你在做什么

$count = $this->db->like('name', $product->name)->get('products')->num_rows();

我怀疑$product->name包含这个。

哈利的书

正如我们所知,这来自您使用的数据库表。在您使用上面提到的查询的地方,它用单引号括起来并产生这个结果。

SELECT * FROM `products` WHERE `name` LIKE '%Harry\\'s Book%'

如您所见,它正在转义撇号以告诉它不是字符串的结尾因此用两个斜杠转义它。一个用于撇号,一个用于单引号。

您要做的是在将参数分配给查询之前用双引号将其包装起来。

$product_name   =   "$product->name";

现在将其传递给查询。

$count = $this->db->like('name', $product_name)->get('products')->num_rows();

输出将是这个

SELECT * FROM `products` WHERE `name` LIKE '%Harry\'s Book%'

你在这里看到了不同之处。它现在包含单斜杠,并且将找到记录。

于 2013-09-19T07:11:52.617 回答
1

其他答案对我不起作用,但确实如此:

$count = $this->db->query("SELECT * FROM `default_firesale_products` WHERE `title` LIKE '".addslashes($product['title'])."'")->num_rows();

每当 CI Active Record 破坏您的查询时,您总是可以直接放入原始查询并拥有完全控制权。

于 2014-05-30T03:31:56.900 回答
0

试试这个,使用stripslashes()around $product->name

$count = $this->db->like('name', stripslashes($product->name))->get('products')->num_rows();

CI 自动转义具有活动记录的字符,但我敢打赌,如果您之前通过 CI 中的活动记录输入它,它已经转义了。所以现在它正在做双重转义。

更新:您可能还想在查询之前尝试添加以下内容:

$this->db->_protect_identifiers = FALSE;

最后一次尝试:尝试以这种方式查询,因为似乎like活动记录导致了错误:

$like = $product->name;
$this->db->query("SELECT * FROM `products` WHERE `name` LIKE '%$like%'");
于 2013-09-19T00:11:51.243 回答