我不认为这是最明确的问题,但一个例子应该让它更清晰。
我有一个充满电影名称的表,其中一些包含撇号。我有一个用于查找电影的搜索框。
如果我通过
执行搜索mov_title = '$search_keywords'
一切正常,但这种方法不会产生部分搜索的任何结果,所以我必须使用这个
mov_title LIKE '%$search_keywords%'
此方法适用于A-Za-z0-9的标题,但如果标题有撇号,即使我完全匹配,也无法找到该电影。
在将标题存储在数据库中之前,我将它们通过:
$search_keywords = htmlspecialchars(mysql_escape_string($_GET["search_keywords"]));
所以在DB中,每个撇号之前都有一个正斜杠。
将电影标题与撇号匹配的唯一方法是在搜索框中在撇号前面放置正斜杠。
这似乎是微不足道的,我确信解决方案很明显,但我只是没有看到它。
答案 0 :(得分:4)
使用mysql_real_escape_string()
,不要使用htmlspecialchars()
。后者不是用于数据库转义,而是用于HTML生成。
答案 1 :(得分:1)
这只是因为您在执行输出之前转义了html输出的数据!在输出之前你应该只做对,即:
<li><?php echo htmlspecialchars($some_var); ?></li>
取消数据库中的值并将应用程序更改为仅在输出时转义。除了在$ search_string上执行htmlspecialchars(mysql_real_escape_string())
之外,您目前没有办法。
即使在插入数据库时已经为HTML转义是有意义的,mysql_real_escape_string()
将是外部函数而不是内部函数。
答案 2 :(得分:0)
如果您希望保持数据库完好无损,则可以在构建查询之前对要查找的任何搜索词运行htmlspecialchars()函数。虽然我建议将数据完全按原样放入数据库中,但是(但是使用mysql_real_escape_string()来逃避它以阻止sql注入尝试)。然后在将数据打印到浏览器时使用htmlspecialchars()。