0

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

<?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 文件将获得搜索的密钥。我通过添加斜杠转义密钥,执行 mysql 查询进行搜索。但是如果我用 key = % # _ + 搜索,它仍然会打印我们所有的表,而不是没有匹配的结果。我想我没有以正确的方式转义密钥,那么如何转义 % # _ + 等字符以使用 LIKE 进行 mysql 查询?请帮帮我?我看了另一个问题,但我还是不明白

4

2 回答 2

3

据我所知,#并且+不是 LIKE 匹配字符串中的特殊字符,但您只需要转义其他字符

$key = str_replace(array('%', '_'), array('\%', '\_'), $key);
于 2013-03-15T03:23:24.863 回答
1

解决这个问题的方法很简单,就是使用参数化查询。

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

请记住,您正在处理需要转义的三个级别。EG 在 PHP 中您必须转义',除非您希望它被解释为引号,mysql 查询本身必须转义相同的',手动 ( \') 使用 addlashes 或使用准备好的语句,并且 mysql 查询中的正则表达式必须在以下情况下转义它是一个保留字符,例如%or _are 在LIKE语句中。

于 2013-03-15T03:56:52.083 回答