如何在foreach循环中查询preg_match_all结果?

时间:2016-08-07 15:17:13

标签: php mysql foreach preg-match-all tagging

所以我正在开发像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存储在行中(如果标记了多个人,则为多个)?

1 个答案:

答案 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。