MySQL转义字符串问题

时间:2011-03-08 06:10:36

标签: php mysql

在某些PHP代码中,我有一个mysql_real_escape_string()'d术语,如foo\'s。我在我的数据库中搜索它(它也存储为foo\'s),如下所示:

mysql_query("SELECT * FROM coupons WHERE retailerName LIKE '%" . $searchTerm . "%'");

查询看起来应该没有变量:

SELECT * FROM coupons WHERE retailerName LIKE '%foo\'s%'

如果我搜索ffofoo,则搜索有效。但是,如果我搜索foo's,则搜索不起作用(请记住,实际查询会使用转义字符串,因此所有内容都应匹配)。

2 个答案:

答案 0 :(得分:1)

从程序到mysql(JDBC或类似程序)的接口可能是在字符串中添加额外的转义字符。如果相同的机制不是将数据放入数据库的机制,请尝试插入以查看数据的存储方式。

Mysql可以通过它自己的界面处理查询

mysql> describe test_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col1  | varchar(20) | YES  |     | NULL    |       |
| col2  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into test_table (col1, col2) values ('col1value', 'foo\'s');
Query OK, 1 row affected (0.04 sec)

mysql> select * from test_table where col2 like '%foo\'s%';
+-----------+-------+
| col1      | col2  |
+-----------+-------+
| col1value | foo's |
+-----------+-------+
1 row in set (0.00 sec)

答案 1 :(得分:0)

如果它在数据库中存储为foo\'s,则有两个选项 - 要么是双重转义(即两次使用mysql_real_escape_string()),要么转义为“某事”的值(例如,魔术报价)已经大幅削减。

检查您是否启用了magic_quotes_gpc。

这是用于自动剥离“魔术引号”的PHP5.3代码(可以在配置文件中使用)。对于较旧的PHP,回调函数看起来会有所不同,但你应该从中得到这个想法。

// remove slashes, if they are being automatically added
if ( get_magic_quotes_gpc () ) {
    $stripslashes = function($value) use(&$stripslashes) {
        if ( is_array($value) ) {
            return array_map($stripslashes, $value);
        }
        return stripslashes($value);
    };
    $_GET    = array_map($stripslashes, $_GET);
    $_POST   = array_map($stripslashes, $_POST);
    $_COOKIE = array_map($stripslashes, $_COOKIE);
    unset($stripslashes);
}