在mysql查询LIKE中使用#%_ +进行搜索

时间:2013-03-15 03:20:26

标签: php mysql

我有这段代码(只是其中的一部分):

<?php
if(isset($_GET['act']) && $_GET['act']== 'do')  {
$key= $_POST['key'];
}
else {
$key= '';
}
?>

<input class='inputField' type='text' name='key' size=45 value='<?php echo $key;?>' > 

<script>$(document).ready(function(){
key= $("#mainTop input").val();
if(key!= null || key== '%') {
    showPage(1,key);
}
else    {
    showPage(1);
}
});
</script>

showpage()将获取参数并传递给php文件:

if(isset($_GET['key'])) {
$key= addslashes($_GET['key']);
}
else {
$key= null;
}
$result= $db->query("SELECT * FROM information WHERE stuId LIKE '%$key%' OR stuName LIKE '%$key%' LIMIT  $start,10");

php文件将获得搜索的密钥。我通过addslashes转义键,执行mysql查询搜索。 但是,如果我使用key =%#_ +进行搜索,它仍会打印我们所有的表,而不是没有匹配的结果。 我想我没有以正确的方式逃避密钥,所以我如何逃避%#_ +这样的角色用LIKE做mysql查询? 请帮帮我?我看了一些其他的问题,但我仍然没有得到它

2 个答案:

答案 0 :(得分:3)

据我所知,#+不是LIKE匹配字符串中的特殊字符,但您只需要escape the others

$key = str_replace(array('%', '_'), array('\%', '\_'), $key);

答案 1 :(得分:1)

此问题的解决方案只是使用参数化查询。

你不必担心逃跑 您可以保护自己免受SQL注入 您的代码和想要雇用您的人会更加认真地对待您的代码。

请记住,您正在处理需要转义的三个级别。例如。在PHP中,您必须转义',除非您希望它被解释为引用,mysql查询本身必须使用类似addslashes或使用准备的方法手动(')转义相同的\'如果%_之类的保留字符在LIKE语句中,则必须对mysql查询中的正则表达式进行转义。