-2

私が作成しているマイクロブログ アプリケーション用の基本的な @mention システムを作成しようとしています (これは、PDO を学ぶためのプロジェクトです)。

他の同様の 質問スレッドをいくつか読みましたが、それでもみんなが何を言っているのか理解できません。

私が現在持っているのは、次のようなデータベース構造です。

**mentions:** <br>
mention_id (primary key auto increment) <br> 
post_id (id from the posts table) <br> 
user_id (id of the user who is mentioned) <br>
unread (either 0 or 1 depending on whether the post has been viewed by the user mentioned)

**posts:** <br>
post_id (primary key auto increment) <br> 
user_id (id of the user who posted) <br> 
post_content (the post contents)<br> 
stamp (the post time stamp)

以前の投稿に基づいて動作する必要があると私が考える方法は次のとおりです-投稿をデータベースに追加し、それに対して関数を実行してpost_idを取得します次に、それに対して正規表現ステートメントを実行し、@somethingへのすべての参照を引き出します、次に @ 記号を切り取り、関数を実行してその名前のユーザーが存在するかどうかを確認します。その名前のユーザーがいる場合、そのユーザーの user_id、post_id、および 1 をデータベースのメンション テーブルの unread 列に挿入します。これにより、現在ログインしているユーザーに未読のメンションがあるかどうかを後で確認し、それらを表示できます。この方法はうまくスケーリングできない可能性があることは理解していますが、何百万人ものユーザーを保持することは考えていません。単純なソリューションが必要なだけです。

だから...私が探しているのは、誰かが私がこれまでに持っているものを見て、それを機能させる方法や、より良い/より単純なアプローチを提案する方法を教えてくれることです.

私が望む最終結果は、ユーザーが別のユーザーに@メンションし、メンションされたユーザーが通知(Facebookなどのメンションのリストなど)を表示するまで、それを「未読」メンションとして表示できるようにすることです。

これまでのところ、これは次のとおりです。

$post_content = 'Yo @jack, what up? I have a new email, jack@bob.com'; 
// to be later replaced with $post_content = $_POST['post_content'];

// right here would be a function add_post that
// inserts the post_content, user_id and time stamp into the database

function select_post($post_content){
    $sql = "SELECT 
              post_id
            FROM posts
            WHERE post_content = $post_content
          "; 
    $stmt = $GLOBALS['db']->prepare($sql); 
    $stmt->execute(); 
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $rows;
}

function valid_username($mentionedUser){
    $sql = "SELECT 
              username
            FROM users
            WHERE username = $mentionedUser
          "; 
    $stmt = $GLOBALS['db']->prepare($sql); 
    $stmt->execute(); 
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $rows;
}

function insert_mention($post_id, $mentionedUser){
    $sql = "INSERT INTO 
            mentions (post_id, user_id, unread)
            VALUES (:post_id, :user_id, 1) // 1 means unread
            ";
    $stmt = $GLOBALS['db']->prepare($sql);                                      
    $stmt->bindParam(':user_id', $mentionedUser, PDO::PARAM_STR);       
    $stmt->bindParam(':post_id', $post_id, PDO::PARAM_INT);    
    $stmt->execute();
}

add_post($userid, $post_content);
$post_id = select_post($post_content);

if (preg_match("/\B@[a-zA-Z0-9]+/i", $post_content)) {

    preg_match_all("/\B@[a-zA-Z0-9]+/i", $post_content, $mentions);
    $mentions = array_map(function($str){ return substr($str, 1); }, $mentions[0]);
    foreach($mentions as $mentionedUser){
        if(!valid_username($mentionedUser)){ continue; }
        insert_mention($post_id, $mentionedUser);   
    }

私は正しい軌道に乗っていますか?どうすればこれを機能させることができますか?回答が詳細になるほど、一般的な概要だけでなく、どの構文を使用するかに興味があります。

4

1 に答える 1