0

我正在使用 php MySQLi 类来比 MySQL 更安全,但我有一个问题。

我有一列数据,其中包含撇号。我正在将该列与一个没有撇号的变量进行比较,它是一个干净的字符串,来自我的 url。在我的旧代码中,我可以轻松地在 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

而且我没有得到任何结果。我怎样才能绕过这个?

4

1 回答 1

2

您的代码中有几个缺陷。

  1. 您只能绑定数据文字。不是标识符。不是Mysql函数。不是各种 SQL 部分。但仅限数据文字。
  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 slug 与类别名称进行匹配。
那是错误的方式。
将另一个字段添加到您的表中,包含来自 URL 的确切信息。
然后匹配这个。
否则你会一直遇到麻烦。

于 2013-01-30T20:24:12.980 回答