LIKE MySQL查询有问题

时间:2011-07-07 21:28:46

标签: php mysql sql-like

我有一个从.php页面执行的以下MySQL查询

SELECT * FROM servers WHERE name LIKE '%$value%'

当执行时,选择0行(但是,查询运行成功,所以我不能使用mysql_error()来调试)。当我在PHPMyAdmin中运行查询时,它会选择适当的行。其他查询,如

SELECT * FROM servers

工作正常。如果有帮助的话,我可以把我的代码放在这里。

3 个答案:

答案 0 :(得分:0)

您确实需要更安全地查看此查询。这也有助于解决您的问题。就目前而言,您很容易受到SQL注入攻击。请查看PHP手册中的示例,了解如何正确执行:

http://php.net/manual/en/function.mysql-query.php

编辑:根据您的评论,您提到您已经正确处理了字符串,这很棒。下面的代码可以解决您的问题。

例如,您可以像这样重写查询语句(在PHP中):

$query = sprintf("SELECT * FROM servers WHERE name LIKE '%". mysql_real_escape_string($value) . "%'");

这将清理你的代码,它也会解决你的LIKE语句无法正常工作的问题。

这是另一篇关于这个主题的好文章:

http://joshhighland.com/blog/2008/07/06/php-sprintf-sql-like/

答案 1 :(得分:0)

编辑:以下是基于Marek的答案提供改进的内容。请参阅有关将变量直接放入查询的实践的注释,并考虑使用预准备语句。无论如何,它就在这里。

  1. PHP在双引号字符串中替换变量,但不在单引号字符串中。
  2. 一个引号字符只被视为另一个字符串中的普通字符。
  3. 把它们放在一起,你可以写:

    $q = "SELECT * FROM servers WHERE name LIKE '%$value%'"; //Fine
    

    你不能写:

    $p = 'SELECT * FROM servers WHERE name LIKE "%$value%"'; //Broken!
    

    $q有效,因为它是一个双引号字符串,而撇号只是普通字符。 $p不起作用,因为它是一个单引号字符串。

    正如下面的GoodFather所指出的,你也可以说${value}以避免与环境字符串产生歧义,例如$r = "ABC${value}DEF";

答案 2 :(得分:0)

您是否期望区分大小写或不区分大小写的查询?我打算不区分大小写,因为你期待结果却没有看到它们。查看数据库的默认排序规则或表格的特定排序规则,并确保它以_ci结尾,无论它是什么。

相关问题