2011-07-07 159 views
1

我有从PHP页面执行以下MySQL查询麻烦与LIKE MySQL查询

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

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

SELECT * FROM servers 

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

+0

那么你有什么问题? – rackemup420

+1

这将有助于查看您正在谈论的代码。另外,养成[引用你的标识符]的习惯并不会造成伤害(http://dev.mysql.com/doc/refman/5.0/en/identifiers.html)。 –

+1

'$ value'中有什么? – Ryan

回答

0

编辑:这里的东西提供基于以下马立克氏答案的改善。请参阅关于将变量直接放入查询的练习的评论,并考虑使用预准备语句。无论如何,在这里。

  1. PHP变量替换双引号字符串里面,但里面没有单独引号的字符串。
  2. 单引号字符被视为由另一个字符串分隔的字符串中的普通字符。

把它们一起,你可以写:

$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";

+0

都破了.... – dynamic

+0

@ yes123:你测试过了吗?为我工作得很好! –

+2

$ SQL中的变量是nonon – dynamic

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

不能回答他的问题,代码安全规则不会解决他的语法问题。如果这是内部脚本管理的一部分,则根本没有安全风险 –

+1

@Marek - 我正在使用代码示例更新我的答案,以便在发布此评论时对其进行进一步解释。至于你对使用这个作为内部脚本而没有危险的看法,我的观点是你永远不会编写易受攻击的代码。即使现在在内部使用它,也可能会有一天代码的用途发生变化。此外,即使是内部代码也应该受到保护以免出现这些类型的问题谁知道初级管理员实际执行这个脚本。如果你不小心,他们可能会造成真正的伤害。第一次做对吧总是更好。 – IAmTimCorey

+0

与你同意,但当你需要创建可用的代码时,不需要关注代码漏洞。在创建工作系统后,安全和优化是进一步步骤的一部分。当然,我同意需要安全,我们不能说他现在如何使用此代码,但不工作,并且SECURE代码无法使用;) –

0

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