-2

我正在尝试为我正在创建的微博应用程序创建一个基本的@提及系统(这是我学习 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 插入到数据库的提及表的未读列中,以便稍后我们可以检查当前登录的用户是否有任何未读的提及并显示这些。我知道这种方法可能无法很好地扩展,但我不打算拥有数百万用户,我只想要一个简单的解决方案。

所以......我正在寻找的是让某人看看我到目前为止所拥有的东西,并让我知道如何让它发挥作用和/或提出更好/更简单的方法。

我想要的最终结果是用户能够@提及另一个用户并能够将其显示为“未读”提及,直到提及的用户查看他们的通知(提及列表等,例如 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

0

首先不要选择逐个帖子内容来获取帖子ID!你必须反其道而行之!(从帖子ID中选择内容)您必须做的事情:

Get post content from any source (hardcoded, user input)
Insert it in database.
post-id = Get last inserted id
get all mentions
foreach mention,  then 
     get the mentionned user
     insert it in database
Done

我不会为你写,但我建议你单独检查:插入帖子提取提及(print_r 将显示 $mentions 包含的内容,因此将其用于调试)插入提及参考。

我认为您如何使用 $mentions 变量的内容存在问题。

valid_username 也不会返回布尔值,但您使用的方式与以前一样 (if(!...)),因此您的逻辑可能在这里不好(至少是函数名称/内容/用法)

何,对于您使用的每个功能,请检查http://php.net/docs.php相信我,它会帮助您通过了解您使用的逻辑背后的逻辑来编写更多逻辑代码。

于 2013-06-06T19:31:49.727 回答