создать упоминание как твиттер или обмениваться с php - PullRequest
8 голосов
/ 02 марта 2011

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

@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. они используют регулярные выражения, чтобы сделать так, чтобы взять имя @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.

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

Спасибо, что заглянули в

Адам Рамадан

Ответы [ 3 ]

9 голосов
/ 03 марта 2011

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

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

 mention_id (Auto-incrementing key) | status_message_id | username_id

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

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

РЕДАКТИРОВАТЬ: Если вы хотите получить «ленту активности» для данного пользователяПоказывая только обновления статуса, в которых они были упомянуты, это будет так просто:

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

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

2 голосов
/ 08 марта 2011

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

Пример ..

  if ( strstr("$status", "@") ) {


$explodeat = explode("@", $status);
$explodeat1 = explode(" ", $explodeat[1]);

$status=$explodeat1[0];
}

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

1 голос
/ 11 марта 2011

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

Что-то связывает это:

SELECT `CID`, `BID`, DISTINCT `COMMENT` 
FROM comments
WHERE UID = :uid
AND ##Others clauses for bloc here##
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...