$SQL = "SELECT * FROM `user_posts` WHERE (`post` LIKE '%@".$user."%')";
例如,如果我的用户名是@Jake,它将显示任何包含@Jake的帖子。但它也会做,例如,@ Jake11,它也将显示。我该如何解决这个问题?
答案 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
。