mysql like语句没有按预期工作

时间:2011-10-10 18:01:59

标签: php mysql database

我有一张有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);

3 个答案:

答案 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 }

对代码的一些评论。

  1. 如果您不使用PDO,而是使用mysql,只有mysql_real_escape_string可以保护您免受SQL注入,其他任何东西都不会。
  2. 始终围绕您使用单$vars引号注入代码的任何'。如果你没有逃脱将无法工作,语法错误将打击你。
  3. 您可以使用isset测试var,看看它是否已填满。
  4. 为什么要连接表名?只需像往常一样将表的名称放在字符串中。
  5. 如果你只选择几行,你真的需要一个order by子句,所以结果不是随机的,这里我订购了最新的id,假设id是一个auto_increment字段,更新id将代表更新的用户。
  6. 如果您回显数据库中的数据,则需要使用htmlentities对其进行转义以防止XSS安全漏洞。

答案 2 :(得分:-1)

在mysql中,像运算符一样使用'$'正则表达式来表示任何字符串的结尾..而'%'用于开头..所以任何字符串都属于这个正则表达式,这就是它返回所有记录的原因。 请参阅http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html一次。希望,这对你有所帮助。