我有这段代码(只是其中的一部分):
<?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查询? 请帮帮我?我看了一些其他的问题,但我仍然没有得到它
答案 0 :(得分:3)
据我所知,#
和+
不是LIKE匹配字符串中的特殊字符,但您只需要escape the others
$key = str_replace(array('%', '_'), array('\%', '\_'), $key);
答案 1 :(得分:1)
此问题的解决方案只是使用参数化查询。
你不必担心逃跑
您可以保护自己免受SQL注入
您的代码和想要雇用您的人会更加认真地对待您的代码。
请记住,您正在处理需要转义的三个级别。例如。在PHP中,您必须转义'
,除非您希望它被解释为引用,mysql查询本身必须使用类似addslashes或使用准备的方法手动('
)转义相同的\'
如果%
或_
之类的保留字符在LIKE
语句中,则必须对mysql查询中的正则表达式进行转义。