Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/08/2007, 08h23   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Par défaut [SQL] Récupérer la première réponse juste d'un jeu

Bonjour à tous...

Voilà, un jeu simple que j'ai en php, une question, 4 réponses (genre qcm)

Je souhaite récupérer le visiteur (non inscrit sur le site) qui a fourni la réponse juste le plus rapidement.
Ensuite j'envois le gagant vers une page et les perdants vers une autre...

Puis, inscrire ces infos dans ma base sql...

Je ne sais comment m'y prendre...



Je cherche, mais ne trouve rien à ce sujet...
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 08h54   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Quand quelqu'un trouve la bonne réponse, ca l'envoie vers un script PHP qui va traiter ca!
Le plus simple c'est donc de commencer par verrouiller dans la base sql la table qui va contenir le nom du gagnant par exemple. Ensuite, quand la table est verrouillée, tu regardes si quelqu'un a déjà bien répondu, si non, tu mets a jours la base, tu la déverrouilles et tu rediriges l'utilisateur et tu as ton premier gagnant.
Les suivants (meme 100ms apres) comme ils veulent aussi verrouiller la table ils sont obligés d'attendre que le tout premier l'ait déverrouillée, et quand ca sera fait tu t'apercevras qu'il y a déjà eu un gagnant!

Voila j'espere avoir été compréhensible
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 09h22   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Merci de répondre... Mais effectivement, pas très clair pour nu newbie comme moi...

A ce stade, j'ai ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
        //echo '<form method="post" action="page3.php">';    
 
            require ("connectdb.php");//connection à la base
            //Execution de la requete SQL
            //$reqsql="Select numquest,question,rep1,rep2,rep3,rep4,rep from questionnaire where numquest=".$id;
            $reqsql="SELECT * FROM question order by rand() limit 1";
            $resbase=mysql_query($reqsql,$cnx) or die ("Echec de $sqlquest");
 
 
            while ($quizz=mysql_fetch_assoc($resbase)){
            //$num prend la valeur trouvé dans le champs 0
            $num=$quizz['num'];
            //$question prend la valeur trouvé dans le champs 1
            $question=$quizz['question'];
            //$reponse1 prend la valeur trouvé dans le champs 2
            $reponse1=$quizz['rep1'];
            //$reponse2 prend la valeur trouvé dans le champs 3
            $reponse2=$quizz['rep2'];
            //$reponse3 prend la valeur trouvé dans le champs 3
            $reponse3=$quizz['rep3'];
            //$reponse4 prend la valeur trouvé dans le champs 4
            $reponse4=$quizz['rep4'];
            //$repexact prend la valeur trouvé dans le champs 5
            $repexact=$quizz['rep'];
            }
$date = date("Y/m/d H:i:s");
$sql = "INSERT INTO parties (date, question, reponse)
VALUES('$date','$question','$repexact')";
mysql_query($sql)
or die('Erreur SQL !'.$sql.'
'.mysql_error());           
        //ferme la connection à la base
        mysql_close();
 
 
 
?>
Je prends mes questions au hasard dans la bdd. Au même moment j'enregistre la partie dans la bdd (j'ai X parties par jour...)

Ensuite, j'ai :

Code :
1
2
3
4
5
6
7
echo '<form method="post" action="home.php">';
			echo '<input type="radio" name="rep'.$num.'" value="1" />'.$reponse1;
			      echo '<input type="radio" name="rep'.$num.'" value="2" />'.$reponse2.'<br />';
			      echo '<input type="radio" name="rep'.$num.'" value="3" />'.$reponse3;
			      echo '<input type="radio" name="rep'.$num.'" value="4" />'.$reponse4.'<br /><br>';
				  echo '<input type="submit" value="Go Cash !" ></form>';
				  ?>
Qui m'affiche les réponses possibles...

Voilà où j'en suis...

Donc, il me manque déjà le script qui va traiter les réponses... Et ensuite, comment verrouille t-on une table?
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 09h31   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Verrouiller des tables MYSQL

En gros dans ton script qui traite les réponses, la PREMIERE chose a faire c'est de te connecter a la base et de verrouiller la table qui gère les parties. Tous les scripts qui vont la verrouiller se mettent donc en liste d'attente, dans l'ordre du premier arrivé, tout est géré par mysql tu ne t'en préoccuppes pas.

Une fois que c'est fait, tu fais comme si tout était normal :
  • tu vérifies la réponse choisie par l'utilisateur,
    • si elle est fausse, tu déverrouilles la table (au pire qd le script se termine c'est fait automatiquement mais vaut mieux le faire explicitement).
    • si elle est juste, tu regardes s'il y a déjà un gagnant
      • si non, tu inscris ce gagnant dans la base, tu déverrouilles la table et tu le rediriges sur la page du gagnant
      • si oui tu déverrouilles la table et tu le rediriges vers la page perdante
Le but de verrouiller la table en fait c'est juste de faire une sorte de "file d'attente" dans l'ordre de réponses au quizz
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 09h36   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Merci, je regarde cela et te tiens au jus...

Et merci à mathieu d'avoir rétabli les bonnes balises pour mon code... Pas bien réveillé ce matin...
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h12   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Bon, j'avance, mais me pose une question...

Est ce qu'avec cette méthode de verrouillage, je vais pouvoir avoir le temps de réponse du gagant...

C'est un jeu de rapidité, et j'aimerais donner le temps de réponse à chaque participant...

Merci
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h15   #7
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Ben dans ce cas il faut faire le calcul avant de verrouiller la table, parce que quand t'attends qu'un verrou se libère t'es en "pause".
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h27   #8
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Si je fais le calcul avant de vérrouiller, et que j'obtiens donc le temps de réponse de chaque participant, est ce que j'ai encore besoin de verrouiller?

Et comment fait on pour calculer ce temps entre l'affichage des réponses et le clic sur le bouton valider?
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h33   #9
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par syl2042
Si je fais le calcul avant de vérrouiller, et que j'obtiens donc le temps de réponse de chaque participant, est ce que j'ai encore besoin de verrouiller?

Et comment fait on pour calculer ce temps entre l'affichage des réponses et le clic sur le bouton valider?
Tu n'auras pas moyen de savoir pour une personne donnée si elle est la plus rapide puisque tu ne peux pas connaitre le temps des autres personnes. Le fait de verrouiller la table c'est pour etre sur que "entre le moment où tu lis dans la table "aucun gagnant" et le moment où tu écris "je suis le gagnant" tu n'as pas qqn d'autre qui fait exactement pareil (a 3ms pres) et qui va donc penser qu'il a gagné aussi.

Pour l'histoire du temps, quand tu génères ton formulaire avec la question, tu peux ajouter une date/un timestamp qui correspond à l'heure a laquelle la personne a eue la question. Mais ca pose un probleme de sécurité, le mieux va etre de passer par les sessions (il y a des cours du developpez.com qui en parlent)

Par contre j'ai pas compris, si quelqu'un lit le questionnaire a 00h pile et répond en une minute, est ce qu'il est gagnant par rapport a celui qui le lit a 00h00min30s et qui répond en 40s (donc plus vite mais après lui) ???
Parce que dans ce cas tu t'en fiches de savoir le temps que chacun met a répondre, le seul truc intéressant c'est : le temps du plus rapide (qui correspond a l'heure a laquelle il a répondu moins l'heure a laquelle le questionnaire a été créé (date que tu peux stocker dans la base))
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h38   #10
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Merci de tes explications...

Non, en fait la question apparait pendant un laps de temps qui est le même pour tous.. (compte à rebours)
Les réponses apparaissent à la fin du compte à rebours...

Et là, je fais gagner le plus rapide à répondre...
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h43   #11
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
D'accord, donc ca répond a ma question : le premier a verrouiller la table sera aussi le plus rapide de tous (s'il a la réponse juste bien sur)
Il suffit donc que dans ta table tu stockes la date exacte a laquelle ton questionnaire est disponible.
Au début du script qui vérifie la réponse tu commences par stocker dans une variable la date a laquelle la personne a répondu.
Si la personne répond faux, ben tu ignores
Si la personne répond juste, alors tu peux savoir a partir de cette variable et de la date stockée dans la base le temps exact qu'il a mis a répondre!
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 10h53   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 62
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 62
Points : 12
Points : 12
Cela me semble très bien ceci et cela correspond plus à ce que je tentais...

J'avais déjà inscrit dans la table l'heure d'affichage du questionnaire par partie (Plus de 200 parties par jour)...

je continue et merci encore...
syl2042 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h17.


 
 
 
 
Partenaires

Hébergement Web