在某些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%'
如果我搜索f
,fo
或foo
,则搜索有效。但是,如果我搜索foo's
,则搜索不起作用(请记住,实际查询会使用转义字符串,因此所有内容都应匹配)。
答案 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);
}