Поэтому я работаю над системой пользовательских тегов, такой как твиттер, где пользователи могут добавлять теги друг к другу в комментариях примерно так: «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» пользователей, помеченных в тексте, вместо их «username».
Я пытался делать
$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 . "");
}
}
Но это только вставляет одну строку (первое значение) в базу данных, даже если несколько человек были помечены.
Как правильно запросить «user_id» каждого упомянутого пользователя «username», а затем сохранить эти идентификаторы в строках (несколько, если несколько человек были помечены) в моей базе данных?
Пытаться 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.
Других решений пока нет …