我有一张有4张唱片的桌子。
Records: 1) arup Sarma
2) Mitali Sarma
3) Nisha
4) haren Sarma
我使用下面的SQL语句从搜索框中获取记录。
$sql = "SELECT id,name FROM ".user_table." WHERE name LIKE '%$q' LIMIT 5";
但是这会检索表中的所有记录。即使我键入一个不存在的单词(例如:hgasd或任何东西),它也会显示上面的所有4条记录。问题出在哪儿 ?请提出任何建议..
这是我的完整代码:
$q = ucwords(addslashes($_POST['q']));
$sql = "SELECT id,name FROM ".user_table." WHERE name LIKE '%".$q."' LIMIT 5";
$rsd = mysql_query($sql);
答案 0 :(得分:3)
您的查询没问题。您的问题是$ q没有任何值,或者您将错误的值附加到查询中,因此您实际上在做:
"SELECT id,name FROM ".user_table." WHERE name LIKE '%' LIMIT 5";
答案 1 :(得分:0)
使用以下代码来
A - 防止SQL注入
B - 防止使用空的$ q
//$q = ucwords(addslashes($_POST['q']));
//Addslashes does not work to prevent SQL-injection!
$q = mysql_real_escape_string($_POST['q']);
if (isset($q)) {
$sql = "SELECT id,name FROM user_table WHERE name LIKE '%$q'
ORDER BY id DESC
LIMIT 5 OFFSET 0";
$result = mysql_query($sql);
while ($row = mysql_fetch_row($result)) {
echo "id: ".htmlentities($row['id']);
echo "name: ".htmlentities($row['name']);
}
} else { //$q is empty, handle the error }
对代码的一些评论。
$vars
引号注入代码的任何'
。如果你没有逃脱将无法工作,语法错误将打击你。 isset
测试var,看看它是否已填满。 order by
子句,所以结果不是随机的,这里我订购了最新的id,假设id
是一个auto_increment字段,更新id将代表更新的用户。 htmlentities
对其进行转义以防止XSS安全漏洞。 答案 2 :(得分:-1)
在mysql中,像运算符一样使用'$'正则表达式来表示任何字符串的结尾..而'%'用于开头..所以任何字符串都属于这个正则表达式,这就是它返回所有记录的原因。 请参阅http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html一次。希望,这对你有所帮助。