所以我正在开发像twitter这样的用户标记系统,用户可以在这样的评论中互相标记:“blablabla @username blablabla”。我正在使用preg_replace来查找文本中的“@username”并将其转换为可点击链接,并在插入数据库时将其转换为preg_match_all。
$text = preg_replace('/(^|\s)@(\w+)/', '$1<a href="profile.php?poet_id=$2" class="small">@$2</a>', $text);
和
$sanitized_comment = trim(mysql_real_escape_string(htmlspecialchars($_POST['comment'])));
if (preg_match_all("/(^|\s)@(\w+)/", $sanitized_comment, $matches)) {
$mentions = array_unique($matches[0]);
foreach($mentions as $mention) {
mysql_query("INSERT INTO `comments_mentions` SET `cm_comment_id` = @last_comment_id, `cm_mentioned` = '" . $mention . "', `cm_mentioner` = " . (int)$session_user_id . "");
}
}
这很好用。
我现在要做的是找到并存储已在文本中标记的用户的“user_id”,而不是“用户名”。
我尝试过做
$sanitized_comment = trim(mysql_real_escape_string(htmlspecialchars($_POST['comment'])));
if (preg_match_all("/(^|\s)@(\w+)/", $sanitized_comment, $matches)) {
$mentions = array_unique($matches[0]);
foreach($mentions as $mention) {
$user_id_from_username = mysql_fetch_assoc(mysql_query("SELECT `user_id` FROM `users` WHERE lower(`username`) = lower(substr('" . $mention . "', 2))"));
mysql_query("INSERT INTO `comments_mentions` SET `cm_comment_id` = @last_comment_id, `cm_mentioned` = " . $user_id_from_username . ", `cm_mentioner` = " . (int)$session_user_id . "");
}
}
但是这只会在数据库中插入一行(第一个值),即使标记了几个人。
如何正确查询每个提到的用户“username”的“user_id”,然后在我的数据库中将这些ID存储在行中(如果标记了多个人,则为多个)?
答案 0 :(得分:1)
在var_dump($matches)
之前尝试$mentions = array_unique($matches[0]);
。我不确定,但我希望用户名存储在$matches[2]
。
您还可以为(\w+)
提供一个名称,以简化操作。该模式应该类似于:
/(^|\s)@(?P<username>\w+)/
执行preg_match_all
时,您可以获得如下用户名:
$mentions = array_unique($matches['username']);
同样@CharlotteDunois在评论中说。使用mysql
很糟糕。使用PDO或mysqli。