我有一个从.php页面执行的以下MySQL查询
SELECT * FROM servers WHERE name LIKE '%$value%'
当执行时,选择0行(但是,查询运行成功,所以我不能使用mysql_error()来调试)。当我在PHPMyAdmin中运行查询时,它会选择适当的行。其他查询,如
SELECT * FROM servers
工作正常。如果有帮助的话,我可以把我的代码放在这里。
答案 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的答案提供改进的内容。请参阅有关将变量直接放入查询的实践的注释,并考虑使用预准备语句。无论如何,它就在这里。
把它们放在一起,你可以写:
$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结尾,无论它是什么。