MySQL喜欢查询但不喜欢其他

时间:2011-09-14 21:29:56

标签: php mysql phpmyadmin sql-like username

    $SQL = "SELECT * FROM `user_posts` WHERE (`post` LIKE '%@".$user."%')";

例如,如果我的用户名是@Jake,它将显示任何包含@Jake的帖子。但它也会做,例如,@ Jake11,它也将显示。我该如何解决这个问题?

7 个答案:

答案 0 :(得分:3)

您可以考虑使用某种regular expression代替LIKE '%...%'

一个例子可能是:

... WHERE `post` REGEXP '@" . mysql_real_escape_string( $user ) . "[[:>:]]'"

[[:>:]]匹配右侧词边界。正如Bill Karwin所指出的那样,在这种情况下不需要左手边界模式,因为在@字符处存在隐含的单词边界。 (实际上,你不能在非单词字符的左边有一个左边界。)

(我相信其他人也会评论您可能接触SQL injection攻击。)

答案 1 :(得分:0)

看起来你在这里不需要LIKE,一个简单的相等检查就可以了:

$SQL = "SELECT * FROM `user_posts` WHERE (`post` = '@".$user."')";

请注意,这里有一个sql注入的可能性,应该使用mysql_real_escape_string

$SQL = sprintf("SELECT * FROM `user_posts` WHERE (`post` = %s)", mysql_real_escape_string('@' . $user));

如果你想在帖子中找到@Joe,你可以在喜欢的项目周围添加空格,但这样做会很慢:

$SQL = sprintf("SELECT * FROM `user_posts` WHERE (`post` LIKE %s)", mysql_real_escape_string('% @' . $user . ' %'));

对于性能,请使用FULLTEXT索引:

$SQL = sprintf("SELECT * FROM `user_posts` WHERE MATCH (post) AGAINST (%s)", mysql_real_escape_string('@' . $user));

答案 2 :(得分:0)

$SQL = "SELECT * FROM `user_posts` WHERE (`post` LIKE '%@".$user."')"; 

答案 3 :(得分:0)

http://devzone.zend.com/article/1304

使用FULLTEXT列:)

ALTER TABLE user_posts ADD FULLTEXT(post);

$sql = ' SELECT * FROM user_posts WHERE MATCH (post) AGAINST ("' . $user . '") ';

答案 4 :(得分:0)

'%'是一个通配符,它​​将匹配该位置中的任意数量的字符。从您的查询中删除那些,你将被设置。该查询所说的是“找到一个帖子匹配[任何] @Jake [any]”

的行

这听起来不像你想要使用,只是这样做:

$SQL = "SELECT * FROM `user_posts` WHERE (`post` = '@".$user."')";

答案 5 :(得分:0)

这种查询不会使用索引,需要全表扫描。一旦数据库增长到合理的大小,这显然会非常缓慢。理想情况下,创建帖子时,您可以解析文本并在一对多表中正确插入行(正确编入索引)以标识关系。

答案 6 :(得分:0)

使用正则表达式:

$SQL = "SELECT *
        FROM `user_posts1
        WHERE (`post` LIKE '%@".$user."%)
        AND (`post` NOT RLIKE '%@".$user."[a-zA-Z0-9]%')"

对于您的示例,只要紧跟在“jake”(@jake)之后的字符不在a和z,A和Z或0-a之间,就会包含$user