我有一个简单的基于MySQL的搜索脚本,我将仅发布与下面问题相关的部分。
$name = 'John Doe';
$query = 'SELECT username FROM members WHERE name LIKE %$name%';
现在,问题是当我搜索John Doe
而不是让用户使用该特定名称时,我会收到名为John
和Doe
的所有用户,而有趣的是,它甚至没有将John Doe
置于顶部,这意味着......在此之前你可以找到John xxxx
。
是否有高级MySQL属性来完成此任务?
答案 0 :(得分:2)
变化
$query = 'SELECT username FROM members WHERE name LIKE %$name%';
到
$query = 'SELECT username FROM members WHERE name LIKE "'.%$name%.'"';
或
$query = "SELECT username FROM members WHERE name LIKE '%$name%'";
注意,改为
$query = 'SELECT username FROM members WHERE name LIKE "%$name%"';
将 NOT 执行此操作。
这是因为single quoted strings不解释变量。
注意:与双引号和heredoc语法不同,特殊字符的变量和转义序列在单引号字符串中不会扩展。
双引号字符串最重要的特性是变量名称将被扩展。有关详细信息,请参阅字符串解析。
更新: 由于Memolition,它经过大量编辑和改变,意思是:)
答案 1 :(得分:1)
变化
$query = 'SELECT username FROM members WHERE name LIKE %$name%';
到
$query = "SELECT username FROM members WHERE name LIKE '%$name%'";
不是
$query = 'SELECT username FROM members WHERE name LIKE "%$name%"';
因为luksch所说的双引号会打印$ name而不是$ name变量值
所以它必须是单引号'
,如'%name'
所以'
单引号适用于strings
和variables
和"
双引号仅适用于strings
答案 2 :(得分:0)
您需要在您使用的字符串周围添加单引号作为LIKE
的比较
事实上,由于您在单引号中查询了您真正要查询的内容:
SELECT username FROM members WHERE name LIKE %$name%
使用文字$name
。
像这样写下你的查询:
$query = "SELECT username FROM members WHERE name LIKE '%$name%'";
答案 3 :(得分:0)
您还可以使用全文索引(仅限MyISAM AFAIR)和MATCH AGAINST子句。 它还会给你相似的速度。在某些情况下非常有用。 例如:http://forum.kohanaframework.org/discussion/9182/mysql-full-text-searching-match-against/p1