我有一个从.php页面执行的以下MySQL查询
SELECT * FROM servers WHERE name LIKE '%$value%'
当执行时,选择0行(但是,查询运行成功,所以我不能使用mysql_error()来调试)。当我在PHPMyAdmin中运行查询时,它会选择适当的行。其他查询如
SELECT * FROM servers
工作得很好。如果有帮助,我可以把我的代码放在这里。
编辑:这是根据马雷克的答案提供改进的东西。请参阅有关将变量直接放入查询的实践的注释,并考虑使用预准备语句。无论如何,在这里。
把它们放在一起,你可以写:
$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";
。
你真的需要更安全地看看这个查询。这也有助于解决您的问题。就目前而言,您很容易受到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/
您是否期望区分大小写或不区分大小写的查询?我打算不区分大小写,因为你期待结果却没有看到它们。查看数据库的默认排序规则或表的特定排序规则,并确保它以_ci结尾,无论它是什么。