2010-01-28 4 views
1

Bon ... J'ai rencontré le problème suivant: J'ai une table qui fonctionne correctement - elle contient les ID des utilisateurs, les messages, les messages, le contenu des messages, le temps de publication fabriqué.Un problème 'qui l'a utilisé'

Je l'utilise pour faire imprimer: le contenu du post, qui est l'auteur de la publication et quand le message a été fait. Jusqu'à présent, tout fonctionne bien.

Maintenant ... J'ai un bouton qui permet aux utilisateurs de voter pour un post donné - tout fonctionne bien ici aussi. Cependant, maintenant je veux faire une fonctionnalité de plus qui montrera qui et quand a voté. Vous savez, de sorte que sous chaque message il y aura une liste de personnes qui ont aimé le post et quand ils ont appuyé sur le bouton.

Mon idée était d'avoir deux tables - celui qui tient l'information de poste post_table, et un autre tableau voted_table qui aura les ID utilisateur, le temps le bouton a été pressé et le post_id que le vote a été fait pour ... Mais je n'ai aucune idée de comment le faire. Donc à peu près ma question est:

Comment puis-je insérer dans une table des informations d'une autre table + quelques autres informations sur le clic d'un bouton?

+0

Quelle est la différence entre un noob et un débutant :-) – jao

+0

Noob = quelqu'un qui demande/fait des choses stupides débutant = quelqu'un qui est nouveau quelque chose – Izumi

Répondre

1
CREATE TABLE `user` (
    `id` INTEGER UNSIGNED NOT NULL auto_increment, 
    `username` varchar(32) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CREATE TABLE `post` (
    `id` INTEGER UNSIGNED NOT NULL auto_increment, 
    `owner_id` INTEGER UNSIGNED default NULL, 
    `content` TEXT default NULL, 
PRIMARY KEY (`id`), 
KEY `post_I_owner` (`owner_id`), 
CONSTRAINT `post_FK_user` 
    FOREIGN KEY (`owner_id`) 
    REFERENCES `user` (`id`) 
    ON DELETE SET NULL 
) ENGINE=InnoDB; 

CREATE TABLE `vote` (
    `id` INTEGER UNSIGNED NOT NULL auto_increment, 
    `user_id` INTEGER UNSIGNED default NULL, 
    `post_id` INTEGER UNSIGNED, 
    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `vote_IU_user_post` (`user_id`,`post_id`), 
    CONSTRAINT `vote_FK_user` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `user` (`id`) 
    ON DELETE SET NULL, 
    CONSTRAINT `vote_FK_post` 
    FOREIGN KEY (`post_id`) 
    REFERENCES `post` (`id`) 
    ON DELETE CASCADE 
) ENGINE=InnoDB; 

Donc, avec le schéma ci-dessus, nous pouvons faire ce qui suit ...

dans votre html/php pour la page viewPost vous pourriez avoir

<form name="vote_form" action="postVote.php" method="POST"> 
    <input type="hidden" name="post_id" value="1" /> 
    <input type="submit" value="Vote for this Post" /> 
</form> 

Alors dans votePost.php vous pourriez faire quelque chose comme:

if(isset($_SESSION['user']['user_id'])) 
{ 
    $userid = $_SESSION['user']['user_id']; 
} 
else 
{ 
    // redirect to a login or something 
} 

$sql = "INSERT INTO vote (user_id, post_id) VALUES (%s,%s)" 
$sql = sprintf($sql, $userid, $_POST['post_id']); 
mysql_query($sql); 

De cette façon, mysql s'occupera de l'horodatage pour vous. Notez que vous devez vérifier/valider les données d'entrée (ce que je n'ai pas vraiment fait ici) avant de l'insérer dans la base de données et tout ce truc de sécurité amusant. Id recommande également d'utiliser Mysqli ou PDO Mysql à la place des anciens libararies mysql et en utilisant un stament préparé (qui prendra en charge la plupart de vos fonctions de quai/fuite d'une valeur)

+0

De cette façon, lorsque je clique sur le bouton, il insère automatiquement dans la table de vote les informations nécessaires, n'est-ce pas? Comment est-ce que je lierai cette information à l'id de poste de la table de poteau? Parce que ... chaque vote doit être lié à un message donné à partir de la table des postes ... – Izumi

+0

définir "lien" - parlez-vous des relations sages dans la base de données, requête sage tirant sur, ou 'href' sage comme dans un' un tag? – prodigitalson

+0

db/query-wise? J'ai un

qui me donne le bouton de vote et quand je clique dessus, le vote monte - ça marche, mais je veux pouvoir quand je clique dessus, mes informations - user_id, time, to être inséré dans la table who_voted_table liée à l'identifiant post_id de la table post_table. – Izumi

1

Vous pouvez si votre base de données prend en charge les transactions. Dans mysql, cherchez les mots clés BEGIN COMMIT et ABORT. Cependant, si vous faites cela, vous allez stocker des données à deux endroits.

Alternativement, vous pouvez stocker vos votes totaux dans la votedtable et vous pouvez modifier votre première requête à joindre à la votedtable pour recenser les votes.

select P.post_id, sum(V.votes) # add other post_table fields 
from post_table as P, voted_table as V 
where P.post_id=V.post_id 
group by P.post_id #add other post_table fields you need here also 
+0

Merci, mais si elle était seulement la partie mysql - je me suis dit IT out. Mon problème est de savoir comment insérer ON BUTTON'S CLICK dans voté table the vote_user_id, time_they_vote et post_they_vote pour, de sorte que plus tard, je peux imprimer qui et quand avait voté. – Izumi

1

Pour exécuter la requête d'insertion lorsque l'utilisateur clique un bouton dont vous avez besoin d'une partie mobile. D'abord, vous devez ajouter un formulaire avec le bouton. Vous devrez ajouter suffisamment d'informations au formulaire en utilisant des champs "cachés" (le post_id, et le user_id à moins que vous ne puissiez l'obtenir d'un autre endroit). Vous devrez définir l'action sur le formulaire pour être une autre page PHP. Sur la deuxième page PHP, vous obtenez les variables de formulaire que vous avez spécifiées et l'utilisez pour générer votre requête d'insertion. (Il y a des problèmes de sécurité que vous devriez considérer, comme faire confiance à la valeur de user_id et vérifier l'entrée d'utilisateur, mais je n'entrerai pas dedans.) Si vous avez utilisé method = "POST" sur votre formulaire, vous obtenez $ _POST [$ formFieldName].

Questions connexes