создать упоминание как twitter или convore с php

привет им просто любопытно. о том, как они делают вещи. что я предполагаю, что они делают что-то вроде этого

@someone1 im stacking on stackoverflow RT @someone2 : hello guys what are you doing? 

прежде чем я сделаю это по-своему, я хочу рассказать вам о моей схеме базы данных

 // CID = COMMENT ID, BID = BLOG ID, UID = USER ID CID BID UID COMMENT 1 1 1 @someone1 im stacking on stackoverflow RT @someone2 : .... 2 1 4 @someone1 im stacking on stackoverflow RT @someone2 : .... 3 1 12 @someone1 im stacking on stackoverflow RT @someone2 : .... 
  1. они используют regex, чтобы сделать это, чтобы взять имя @someones

     preg_match_all("/@[a-zA-Z0-9_]+/", $text, $matches); 
  2. то они получают @ от каждого имени

     foreach ($matches as $value) { foreach ($value as $value) { $usernames[] = substr($value, 1); } } 
  3. то они получают UID из базы данных, делая что-то вроде этого

     foreach ($username as $value) { # insert database one by one ? so it will be like the example above } 

то мы можем просто вывести комментарий, получив UID.

то как-то мы можем получить все комментарии в блоге. (без одного и того же комментария), where blog buid = 1 и дать им уведомление каждому пользователю, where uid = :uid .

есть ли лучший способ сделать это? что-то вроде twitter или convore?

Спасибо, что посмотрели

Адам Рамадхан

    Я сделал что-то подобное этому с помощью собственного приложения, которое мы используем для связи.

    В принципе, у вас будут две таблицы: status_updates и mentions . В каждом обновлении состояния много упоминаний. Всякий раз, когда кто-то создает обновление статуса, вы сохраняете его в таблице status_updates . Во время этого процесса вы также можете использовать Regex для обнаружения любого @username «упоминания». Когда вы найдете упоминание, вы добавляете его в таблицу mentions . Например, таблица mentions может выглядеть примерно так:

      mention_id (Auto-incrementing key) | status_message_id | username_id 

    Таким образом, если вы хотите узнать, упоминается ли кто-либо в сообщении о статусе, вы можете быстро просмотреть его в таблице status_messages , в отличие от загрузки сообщения о статусе и запуска status_messages . Другая приятная вещь об этом подходе заключается в том, что она позволяет вам иметь несколько упоминаний в каждом сообщении о состоянии. Просто создайте запись для каждого.

    Это основной способ, которым мы его настроили.

    EDIT: Если вы хотите вытащить «фид активности» для данного пользователя, показывая только обновления статуса, в которых они были упомянуты, это будет так же просто, как:

     SELECT * FROM mentions m LEFT JOIN status_messages s ON m.status_message_id = s.id WHERE m.username_id = $username_id 

    Я должен отметить, что это не так, как они делают это в Twitter, потому что они имеют дело с проблемами масштаба, которые сделали бы этот простой способ делать вещи невозможными. Тем не менее, я думаю, что это самое простое решение, которое хорошо работает, если вы не беспокоитесь о масштабировании сотен тысяч пользователей. Если да, то у вас, вероятно, больше проблем на руках, чем на этом.

    Вы можете использовать его как bb-коды, но вместо того, чтобы воспринимать его как [foo] [/ foo], вы берете @ и заканчиваете его в пространстве … прежде чем он вставляется в вашу базу данных, вы берете другой скрипт и разбиваете @ после пробела , и поместите упоминание в отдельный столбец, затем используйте bbcodes, чтобы сделать упоминание «на лету»

    Пример..

      if ( strstr("$status", "@") ) { $explodeat = explode("@", $status); $explodeat1 = explode(" ", $explodeat[1]); $status=$explodeat1[0]; } 

    и вставьте $ status в свой столбец упоминаний в вашей базе данных … Код BB для него после этого не будет таким сложным

    Я думаю, что в MySQL вы можете использовать DISTINCT чтобы избежать дублирования строк:

    Что-то связать это:

     SELECT `CID`, `BID`, DISTINCT `COMMENT` FROM comments WHERE UID = :uid AND ##Others clauses for bloc here##