LIKE MySQL查询有问题

问题描述 投票:1回答:3

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

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

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

SELECT * FROM servers

工作得很好。如果有帮助,我可以把我的代码放在这里。

php mysql sql-like
3个回答
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
投票

你真的需要更安全地看看这个查询。这也有助于解决您的问题。就目前而言,您很容易受到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/


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.