2013-06-06 3 views
-2

J'essaie de créer un système @mention de base pour une application de micro-blogging que je crée (c'est un projet pour moi d'apprendre le PDO). J'ai lu quelques autres similarquestions et threads, mais je ne comprends toujours pas ce que tout le monde dit.Implémentation d'un système de base Twitter/Facebook @mention

Ce que j'ai en ce moment est une structure de base de données, quelque chose comme ceci:

**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) 

La façon dont je pense qu'il doit travailler en fonction des messages précédents est -, nous ajoutons le poste à la base de données, puis exécutez une fonction dessus pour récupérer le post_id ALORS nous lançons une instruction regex dessus et sortons toutes les références à @quechose, puis nous coupons le symbole @ et l'exécutons à travers une fonction pour vérifier s'il y a un utilisateur avec ce nom . S'il y a un utilisateur de ce nom, nous insérons leur user_id, le post_id et un 1 dans la colonne non lue dans la table mentions de la base de données afin que nous puissions vérifier si notre utilisateur actuellement connecté a des mentions non lues et les afficher. Je comprends que cette méthode peut ne pas évoluer bien, mais je ne cherche pas à détenir des millions d'utilisateurs que je veux juste une solution simple.

Alors ... ce que je cherche, c'est que quelqu'un jette un coup d'oeil à ce que j'ai jusqu'à présent et fais-moi savoir comment je peux le faire fonctionner et/ou suggérer une approche meilleure/plus simple.

Le résultat final que je veux est qu'un utilisateur puisse @mentionner un autre utilisateur et être capable de l'afficher comme une mention 'non-lu' jusqu'à ce que l'utilisateur mentionné affiche ses notifications (une liste de mentions etc.).

Ce que j'ai à ce jour est le suivant:

$post_content = 'Yo @jack, what up? I have a new email, [email protected]'; 
// 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("/\[email protected][a-zA-Z0-9]+/i", $post_content)) { 

    preg_match_all("/\[email protected][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); 
    } 

Suis-je même nulle part sur la bonne voie? Comment puis-je faire ce travail? S'il vous plaît, plus de détails dans votre réponse, le mieux, je suis intéressé par la syntaxe que vous utiliseriez et pas seulement un aperçu général.

+0

Commencer à partir de [apprendre PDO] (http://stackoverflow.com/tags/pdo/info) –

+0

@YourCommonSense merci, j'ai jeté un coup d'oeil et j'ai également regardé quelques-uns des liens là. Ça ne me donne toujours pas beaucoup de clarté. Ma logique est-elle complètement éteinte? Comment l'aborderiez-vous d'une manière simple comme un débutant? – Josh

+0

"_So ...ce que je cherche, c'est que quelqu'un jette un coup d'oeil à ce que j'ai jusqu'à présent et qu'il me dise comment je peux le faire fonctionner et/ou suggérer une approche meilleure/plus simple. résultats, identifiez un problème particulier dans votre approche actuelle et ajustez votre question pour ne traiter que cette partie Répétez avec les questions futures si nécessaire –

Répondre

0

Tout d'abord ne sélectionnez pas le contenu après la publication pour obtenir le message! Vous devez faire l'inverse! (Sélectionner le contenu d'ID de poste) Qu'est-ce que vous devez faire:

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 

Je ne vais pas l'écrire pour vous, mais je vous recommande de vérifier individualy: Insertion après extraction mentionne (print_r va vous montrer ce que mentionne $ contient, donc utilisez-le pour le débogage) Insérer la référence de référence.

Je pense qu'il y a un problème avec la façon dont vous utilisez le contenu de la variable $ mentions.

également valid_username ne retourne pas une valeur booléenne, mais vous utilisez comme il était (if (! ...)) alors peut-être votre logique est mauvaise ici (au moins le nom fonction/content/utilisation)

Ho et, pour chaque fonction que vous utilisez, vérifiez http://php.net/docs.php Croyez-moi, il vous aidera à faire plus de code logique en connaissant la logique derrière ce que vous utilisez.

+0

Merci Atrekaur, je vais prendre du recul et prendre votre approche. – Josh

Questions connexes