我使用php MySQLi类比MySQL更安全,但我遇到了问题。
我有一列数据,其中包含撇号。我正在将列与一个没有撇号的变量进行比较,它是一个干净的字符串,来自我的网址。在我的旧代码中,我可以轻松地在SQL语句中执行Replace(category_name,'''',''),并且撇号不会成为因素。
如果我把它扔进phpmyadmin,它可以工作:
SELECT DISTINCT merchant_category
FROM products
WHERE Replace( category_name, '''', '' ) = 'childrens accessories'
ORDER BY merchant_category
但是使用MySQLi这是一个真正的问题,因为它不会解析它们:
$params = array();
$params[0] = "Replace(category_name, '''', '')";
$params[1] = $this->db->escape($this->cleanDBValue(requestQS("cat1")));
//print_r($params);
$rs = $this->db->rawQuery("SELECT DISTINCT merchant_category FROM products WHERE ? = ? ORDER BY merchant_category ", $params);
我试图与查询匹配的数据是:
children's accessories
我没有得到任何结果。我怎么能绕过这个?
答案 0 :(得分:2)
您的代码中存在一些缺陷。
所以,你必须摆脱这两件事,让你的查询像
一样简单$param = str_replace('-',' ',$_GET['cat1']); //yes, I don't trust your functions
$sql = "SELECT DISTINCT merchant_category FROM products
WHERE category_name = ? ORDER BY merchant_category";
$rs = $this->db->rawQuery($sql, array($param));
如果它不起作用 - 调试它。但是你必须让它以这种方式工作。没有替换和东西。
<强>更新强>
我懂了。
您正在尝试将URL slugs与类别名称进行匹配
这是错误的方式。
在表格中添加另一个字段,包含来自URL的精确slug
然后匹配这一个。
否则你会遇到麻烦。