Sélectionner table au hasard mysql ?

Résolu/Fermé
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 - 24 mars 2012 à 23:21
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 - 31 mars 2012 à 16:19
Bonjour,

J'essaye de créer un quiz de culture générale sur mon site avec Php et mysql, j'ai donc créé une base de donnée quiz, avec des tables thématiques avec mes questions et réponses.
Par exemple, j'ai une table geo_1 (premières questions de géographie) et une table histoire_1 (premières questions d'histoire) et ainsi de suite avec les autres thèmes. Ensuite il y a les tables des 2èmes question comme par exemple geo_2... qui sont dans la même bdd.

J'ai créé un code pour pouvoir sélectionner au hasard une question dans une des tables définies, voici ce code:

<?php

try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=quiz', 'root', '', $pdo_options);

$reponse = $bdd->query("SELECT questions, reponses_j, reponses_f FROM geo_1 ORDER BY RAND() LIMIT 1");

while ($donnees = $reponse->fetch())
{
echo '<p id="este">Question 1:</p><p id="question1">' . $donnees['questions'] . '</p>'

. '<p><label id="reponse_q_1"><input type="radio" name="reponse1" />'. $donnees['reponses_j'] .'</label>'
. ' <label id="reponse_q_1"><input type="radio" name="reponse2" />'. $donnees['reponses_f'] .'</label></p>';
}

$reponse->closeCursor();
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>

Je voulais donc savoir si il était possible de sélectionner une question au hasard non pas parmis une table, mais parmis toutes les tables de question 1 qui finissent donc par "_1"

En gros, je voudrais faire quelque chose comme ça:

SELECT questions, reponses_j, reponses_f FROM (table au hasard parmis les tables questions 1) ORDER BY RAND() LIMIT 1

Deuxièmement, mes tables sont composées d'une colonne id, une colonne questions, une reponses_j (pour réponses justes) et reponses_f (pour réponses fausses). Comme vous pouvez le constater dans mon code plus haut, le membre doit faire un choix entre deux réponses. Le problème, est que si il clic sur le code source de la page il pourra voir où ce situe la bonne réponse.

Je voulais donc savoir si il était possible de mettre les réponses au hasard en première et deuxieme position.

Par exemple:

. '<p><label><input type="radio" name="reponse1" />'. $donnees['(ici je voudrais une selection au hasard entre reponce_j et reponse_f)'] .'</label></p>'
. '<p><label><input type="radio" name="reponse2" />'. $donnees['(ici je voudrais une selection au hasard entre reponce_j et reponse_f qui ne soit pas la même que celle du dessus)'] .'</label></p>';

Si vous avez des solutions à ces problèmes n'hésitez pas à à me les confier :)
Si je n'ai pas été assez explicite, n'hésitez pas non plus à me le faire parvenir.

Cordialement

8 réponses

Bonjour l'analyse est mal faite. Il vaudrait mieux refaire toutes vos tables sous peine d'avoir ce que vous commencez à avoir:

lenteur de développement(et complexité inutile), lenteur de traitement, risques d'erreur, impossible d'adapter la base à un ajout, de la faire évoluer dans le temps.

Un exemple sur votre Modèle Logique de Données:

Vous parlez de tables thématiques:
Qu'est ce qui différencie une table de l'autre? Regroupez tout vos thèmes en un seul et votre système d'information est déjà plus juste(mais bon il reste des erreurs).

Vous pouvez par exemple ajouter un champ thématique qui aura la valeur du thème. Pour connaître toutes les questions géographie il vous faut faire un tri sur tout les résultats où thematique = 'geographie'.

Avec ce système vous pouvez ajouter autant de thématique que vous voulez, en supprimer quand vous le voulez.La présence d'une table par thématique est bien une erreur de débutant mais l'une des pires qu'il soit(je laisses pas 1an avec un système comme ça pour que vous refassiez tout votre programme: tables et programmes).

Jetez un oeil sur la méthode Merise qui peut vous aider.
1
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
29 mars 2012 à 19:59
Bonjour,
Merci pour le conseil aetrea, je pense que je vais suivre votre conseil, car ça devient craiment compliqué.
0
héhé l'analyse c'est 80% du travail et cela ne prend que 10% du temps. Avec une mauvaise analyse vous allez dans le mur.

La méthode Merise est une méthode à étapes didactique où la logique humaine ne doit pas vraiment rentrer en compte puisque l'on crée le Modèle Conceptuel de Données .


Les étapes Merise(en résumé):

1)recherche des données: il faut lister sans ordre toute les informations qui sont utiles(avec les documents disponibles), peuvent l'être et sont utilisées par le SI(Système d'Information). On obtient le Dictionnaire Des Données(DDD) en éliminant les doublons et les valeurs calculables ou ne pouvant être utilisée seule.
ex:_ un doublon est une même valeur ayant deux noms différents et donc devient une seule valeur.
_Une valeur calculable est en fait le résultat d'un calcul à partir d'une ou plusieurs valeur(prix ttc est obtenu à partir du prix ht et de la taxe, il faut garder taxe et prix ht comme données, ttc surcharge la table).
_La durée d'un abonnement annuel est une valeur calculable qui se calcule à partir de la date de renouvellement +1an.

2)Univers Du Discours(UDD): Cette étape est présente tout au long de l'analyse. Le discours de la méthode comprends les points qui sont flous et le choix de mettre ou non des valeurs avec l'explication. Ce sont les parties qui restent à définir et les choix où la logique humaine rentre en jeu. Les avantage et inconvénients de chaque choix y sont présents.


3)Regroupement en entités: Une fois le tri des données terminé vous pouvez regrouper en entité de même 'thème'. Il convient alors de vérifier que chaque donnée n'est présente qu'une fois par entité et n'est pas redondante dans une autre table.

4)Nommer les entités.

5)(j'ai un peu perdu le compte de la méthode merise-sachez toutefois qu'il existe 9étapes dans la version réelle) Création des liaisons entre les tables. Les tables sont reliés en indiquant des valeurs de 1 à n indiquant les possibilités pour chaque table d'avoir une occurrence d'une autre table(ex: un client peut avoir 0 à une infinité de commande: c'est une liaison 0,n de la table client vers la table commande- la liaison 0,n est plus souple et permissive que la liaison 1,n puisqu'un client peut être inscrit sans avoir de commande(0) . Ce choix peut être indiqué dans l'UDD, on redemandera au client s'il veut qu'un client puisse s'inscrire sans avoir de commande ou s'il doit forcément avoir une commande pour être inscrit (liaison 1,n oblige au moins une commande, mais risque de provoquer des erreurs si le client ne fait pas son inscription en m^me temps que sa 1ère commande, donc pas top comme solution).


Les étapes 7 et 8 vont fournir le Modèle Conceptuel de Données(MCD) et le Modèle Logique de Données(MLD autrement dit la structure des tables).

L'étape 9 concerne la persistance dans le temps et permet de prévoir les évolutions possibles du Systèmes d'Informations, les demandes et possibilités nécessaires si le SI à besoin de nouvelles fonctionnalités dans les années à venir et garantit ainsi la persistance dans le temps.
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
25 mars 2012 à 01:18
Bonsoir,

L'idée qui me vient en tête, c'est de faire une étape avant de faire ta requête sql.

Tu récupères d'abord la liste de toutes tes tables avec une des techniques énoncées ici : https://forums.commentcamarche.net/forum/affich-1754709-sql-lister-les-tables-d-une-base

Tu auras donc un tableau et après, tu cherches un chiffre au hasard : http://www.zone-webmasters.net/codes-sources/php/39-nombre-aleatoire-en-php.html

Et ensuite tu récupères dans le tableau généré des tables de ta base, la table correspondant au rang donné en random.
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
25 mars 2012 à 15:30
Merci d'avoir répondue AssasinTourist.
En effet, c'est une très bonne idée, mais le problème est que je ne pense pas m'y prendre correctement car mon code me renvoie une erreur quand je veux récupérer la liste de mes tables.
Je ne sais pas si j'ai placer ce code au bonne endroit :

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=quiz', 'root', '', $pdo_options);
$sql = "SHOW TABLES [FROM quiz] [LIKE "test%"]";
$reponse = $bdd->query("SELECT questions, reponses_j, reponses_f FROM geo_1 ORDER BY RAND() LIMIT 1");

while ($donnees = $reponse->fetch())
{
echo '<p id="este">Question 1:</p><p>' . $donnees['questions'] . '</p>'

. '<p><label><input type="radio" name="check" />'. $donnees['reponses_j'] .'</label>'
. ' <label ><input type="radio" name="check" />'. $donnees['reponses_f'] .'</label></p>';
}

Il me renvoit une erreur à la ligne rajoutée, donc celle pour récupérer la liste des tables :
-( ! ) Parse error: syntax error, unexpected T_STRING in C:\Program Files\wamp\www\Site\page1.php on line 148
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 09:08
Je pensais plus à cette commande : select * from cat where table_type='TABLE'; (sans rien changer, ce sont des noms de variables de tables)
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 14:19
J'ai suivie tes conseilles, mais même si je ne change rien il me renvoie la même erreur :s
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 15:12
Caramba !

Je te donne toutes ces fonctions : https://www.php.net/manual/fr/function.mysql-list-tables.php
En attendant que je puisse tester ce soir...
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 16:01
C'est bon, du coup ça marche avec le code de ton lien :

<?php
// liste des tables de ma dbb

$dbname = 'quiz';

if (!mysql_connect('localhost', 'root', '')) {
echo 'Impossible de se connecter à MySQL';
exit;
}

$sql = "SHOW TABLES FROM $dbname";
$result = mysql_query($sql);

if (!$result) {
echo "Erreur DB, impossible de lister les tables\n";
echo 'Erreur MySQL : ' . mysql_error();
exit;
}

while ($row = mysql_fetch_row($result)) {
echo "Table : {$row[0]}\n<br />";
}

mysql_free_result($result);
?>

Donc il m'affiche la liste de mes tables par ordre alphabétique :

Table : geo_1
Table : geo_2
...
Table : histoire_1
Table : histoire_2
...

Et j'ai mis ensuite le code de création d'un numéro au hasard :

<?php
//création d'un nombre aléatoire entre 1 et 100

$nb_min = 1;
$nb_max = 100;
$nombre = mt_rand($nb_min,$nb_max);

echo $nombre;
?>

Mais après je ne sais pas comment procéder pour la suite, car pour la première question, je n'ai besoin seulement des tables finissant par '_1'.
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 16:26
Pour savoir s'il y a "_1" à la fin, je ferais un test sur toutes les valeurs de ton tableau avec cette fonction-là : https://www.php.net/manual/fr/function.substr-count.php

while ($row = mysql_fetch_row($result)) { 
  if(substr_count($row, '_1') == 0){
    unset($row)
  }
}


(j'ai utilisé la fonction unset => https://www.php.net/manual/fr/function.unset.php pour supprimer une valeur d'un tableau sans être obligé de passer par un autre tableau)
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 16:43
Mais il faut que je remplace mon while par le tien ou bien il faut juste que je rajoute le tien en-dessous?

Parce que si je le rejoute en dessous du mien, il m'affiche encore toutes les tables, et si je le remplace, une erreur s'affiche :

-( ! ) Warning: substr_count() expects parameter 1 to be string, array given in
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
Modifié par AssassinTourist le 26/03/2012 à 17:00
if(substr_count($row[0], '_1') == 0){

pardon =)
$row est une ligne entière, et on ne veut lui donner en paramètre qu'une "case"...
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 17:14
Maintenant si je remplace l'ancien while par le while que tu m'as donné, rien ne s'affiche :s
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 17:22
Ma fonction ne fait rien s'afficher, voici l'algo informel de ce que j'ai fait :
Tant qu'il y a encore des résultats
  s'il n'y a pas "_1" dans la première case
  alors on enlève la valeur du tableau


Toi, tu veux plutôt :
Tant qu'il y a encore des résultats
  s'il y a "_1" dans la première case
  alors on affiche la case et on va à la ligne


Pas beaucoup de choses à changer =)
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 17:38
Merci pour tes conseil :), ducoup voici mon code:

while ($row = mysql_fetch_row($result)) {
if(substr_count($row[0], '_1') != 0){
echo "{$row[0]}<br />";

Donc il m'affiche les tables finissant par '_1'
Et à la suite il y a mon nombre au hasard.
Mais maintenant je dois récupérer dans le tableau généré la table correspondant au rang donné en random. Mais comment faire :s?
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 18:03
C'est pour cette raison que je t'avais donné mon premier bout de code avec unset. Rien n'est affiche (parce qu'au final, on ne veut pas que ce soit affiché quand même...)
Donc :

//On ne garde que les tables qui nous intéressent 
while ($row = mysql_fetch_row($result)) { 
  if(substr_count($row, '_1') == 0){
    unset($row)
  }
}

//On génère un nombre au hasard : 
$nb_tables = MYSQL_NUM_ROWS($result);
$nombre = mt_rand(0, $nb_tables); 

//On se positionne sur la ligne demandée
mysql_data_seek ( $result , $nombre );

//On récupère le nom de la table qui est sur la ligne
while ($row = mysql_fetch_assoc($result)) {
   $table = $row[0];
}

//On fait sa requête
$reponse = $bdd->query("SELECT questions, reponses_j, reponses_f FROM '".$table."' ORDER BY RAND() LIMIT 1"); 


Quelque chose dans ce goût-là.
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 18:43
Merci pour ce code :)
Il y a 3 erreurs qui s'affichent :
-( ! ) Warning: mysql_data_seek(): 4 is not a valid MySQL result resource
-( ! ) Warning: mysql_fetch_assoc(): 4 is not a valid MySQL result resource
-( ! ) Notice: Undefined variable: table
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 20:07
... Bon, ça doit avec le unset et le mysql, ça ne doit pas être top... Bon je voulais éviter de créer un tableau temporaire, mais bon... Tu remplaces tout ce que je t'ai donné dans ma réponse précédente par :

//On range dans un tableau les valeurs qui nous intéressent
$tab_temp = array();
while ($row = mysql_fetch_row($result)) { 
  if(substr_count($row, '_1') == 0){
    $tab_temp[] = $row[0];
  }
}

//On génère un nombre au hasard : 
$nombre = mt_rand(0, count($tab_temp)); 

//On fait sa requête
$reponse = $bdd->query("SELECT questions, reponses_j, reponses_f FROM '".$tab_temp[$nombre]."' ORDER BY RAND() LIMIT 1"); 
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 20:17
Merci ! Mais il y a encore une erreur qui s'affiche :
-( ! ) Warning: substr_count() expects parameter 1 to be string, array given
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
26 mars 2012 à 20:49
Houlà, j'apprends pas de mes erreurs, moi...
if(substr_count($row[0], '_1') == 0){
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
26 mars 2012 à 21:04
Merci, mais une erreur SQL apparait avec geo_2 alors qu'il n'a rien à voir dans ce code, voici cet erreur : Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''geo_2' ORDER BY RAND() LIMIT 1' at line 1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
28 mars 2012 à 12:19
Je pense que tu te mélanges avec le php. Généralement, pour faire ce que tu veux faire, on utilise plus le javascript, mais bon...

Pour être sûr, tu as une page traitement.php qui regroupe :
- haut de page : gestion des erreurs
- milieu : formulaire
- bas : traitement php

Et une page page1.php si jamais la personne a rempli tout le formulaire

?
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
28 mars 2012 à 12:32
En fait j'ai ma page1.php :
- haut de page : html avec mon menu, mon header... et les endroits ou je veux que les erreurs apparaissent.
- milieu de page : j'ai effectivement mon formulaire.
- bas de page : traitement php

Et enfet si la personne a rempli tout le formulaire, elle est redirigé sur la même page, donc sans erreur.
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
28 mars 2012 à 13:44
Le problème, c'est que la variable $erreur ne passe pas comme ça. Tu ne peux la faire passer que en GET ou en POST, à travers un formulaire en champ caché.

Et pour la récupérer : if(isset($_POST['erreur']))...
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
28 mars 2012 à 13:53
J'ai fait ce que tu m'as dis, mais ça ne marche toujours pas :s.
Crois-tu que ça pourrait venir de cette partie là qui ne detecterait pas les réponses justes des réponses fausses? :
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=quiz', 'root', '', $pdo_options);
}
catch (Exeption $e)
{
die('Erreur : ' . $e->getMessage());
}

$req = "SELECT reponses_j FROM ".$tab_temp[$nombre]."";
$res = $bdd->query($req);
foreach($res as $row)
{
$reponses_j = $row['reponses_j'];
}
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
28 mars 2012 à 13:56
Le try catch, c'est un test pour vérifier que tu arrives bien à te connecter à ta base de données.
Sinon, sache que cette ligne :
$reponses_j = $row['reponses_j'];
va réécrire la variable $reponse_j à chaque fois, c'est-à-dire qu'à la fin de ta boucle, cette valeur sera la dernière valeur de ton tableau.
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
28 mars 2012 à 14:02
Ha d'accord, mais si je ne mais pas cette ligne, comment puis-je faire pour dire
Si $_POST['check'] est égal à la réponse juste,...
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
28 mars 2012 à 12:40
bonjour,

pourquoi tu n'as pas fait une vrai base de donnée propre qui peut faire ce que tu veux sans agir sur le nom des tables ?
tu aurais pus faire une table catégorie avec histoire_1, histoire_2, geo_1, geo_2, etc...
et ensuite faire tes requètes sur une table question en ne sélectionnant qu'une catégorie choisie
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
28 mars 2012 à 12:47
Bonjour,

Et bien j'ai fais cela pour pouvoir m'y retrouver facilement avec chaques questions de chaque tables, car il y a beaucoup de question, donc si j'aurais tout mis dans la même table je pense que je m'y serait plus retrouvé, mais c'est vrai que cela aurait été plus simple au niceau des requètes.
0
vordano Messages postés 1682 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 20 juillet 2012 316
28 mars 2012 à 12:51
dans une bdd il n'est pas très utile de se concentrer sur les données en tant que tel.
si les questions sont bien dans la bonne colonne, pareil pour les réponses + la colonne de la clé étrangère, alors c'est pas si compliqué non ?
si tu veux de l'aide pour faire une vrai bdd, il suffit de demander :)
(imagine si tu avais 20 catégories, tu devrais faire 20 tables, et probablement du code en plus)
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
28 mars 2012 à 12:59
Merci, c'est gentil de me prposer ton aide :)
Je vais déja essayer tel quel, et si je rencontre trop de soucis je suivrais tes conseils et ferais appel à toi si ça ne te dérange pas bien sur..
0

Et bien j'ai fais cela pour pouvoir m'y retrouver facilement avec chaques questions de chaque tables, car il y a beaucoup de question, donc si j'aurais tout mis dans la même table je pense que je m'y serait plus retrouvé, mais c'est vrai que cela aurait été plus simple au niceau des requètes.


Complétement faux, une base de données c'est aussi un langage de requêtes: SQL.

Pour obtenir toutes les questions d'une catégorie vous n'avez qu'à indiquer:

SELECT * FROM table WHERE categorie='geographie'

Votre logique ne marche pas, vous pensez à la conception et la réalisation en même temps.
Pour vous retrouvez vous n'avez qu'à faire des pages administrateur(donc avoir un rang administrateur enregistré dans la table)et afficher pour celui ci une liste des catégories, et des menus de tri et pour visualiser questions/réponses.

Vous n'arriverez à rien si vous ne faites pas une analyse et conception correcte... mais n'ai je pas dit cela?

edit:

une table par catégorie ne peut pas marcher. Si vous avez besoin de rajouter une catégorie dans l'avenir vous devez refaire tout le programme, enregistrer les tables existantes et les exporter vers la nouvelle table...
En plus d'être compliqué pour rien vos MCD est tout simplement faux(lenteur réalisation exécution, risque d'erreur, aucune modularité...). N'oubliez pas une seule erreur dans une table et vous pouvez jeter toutes les tables et leur contenu. Puisqu'on vous dit que cela ne va pas, pourquoi vous acharner à faire un programme qui dans la semaine de sa mise en service devra être remplacé?
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
31 mars 2012 à 01:46
C'est pour cela que j'ai changé ma manière de faire en regroupant mes catégories dans une seule table et en proposant une requête de la sorte puiqu'il me faut une question choisie aléatoirement :
"SELECT * FROM categories WHERE categorie like '%_1' ORDER BY RAND( )LIMIT 1"
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
29 mars 2012 à 15:59
J'ai vu une petite erreur. Tu vas remplacer ceci :
  $req = "SELECT reponses_j FROM ".$tab_temp[$nombre]." WHERE reponses_j= ' ". $_POST['check'] ." ' ";
    $res = $bdd->query($req);

    //Affichage des erreurs
    if(!isset($_POST['check'])) { 
      echo '<p><span class="erreur">Vous devez compléter un champ !!</span></p>'; 
    }  
    if($_POST['check'] == NULL) { 
      echo '<p><span class="erreur">Désolé, vous avez donné une mauvaise réponse.<br />Retentez votre chance avec un autre objet !!</span></p>'; 
    } else {
      header('Location: page1.php');
    }

Par ceci :
    //Affichage des erreurs
    if(!isset($_POST['check'])) { 
      echo '<p><span class="erreur">Vous devez compléter un champ !!</span></p>'; 
    }  else {
      $req = "SELECT reponses_j FROM ".$tab_temp[$nombre]." WHERE reponses_j= ' ". $_POST['check'] ." ' ";
      $res = $bdd->query($req);
      if($res) { 
        header('Location: page1.php');
      } else {
        echo '<p><span class="erreur">Désolé, vous avez donné une mauvaise réponse.<br />Retentez votre chance avec un autre objet !!</span></p>'; 
      }
    }

En algo informel, ce que tu faisais :
Recherche d'une réponse dans la base qui correspond à post(check)
si post(check) n'existe pas
alors "vous devez compléter un champ"
si post(check) est vide
alors "mauvaise réponse"
sinon "bonne réponse"

Bref, ça n'allait pas du tout. J'ai changé en :
si post(check) n'existe pas
alors "vous devez compléter un champ"
sinon
  recherche d'une réponse dans la base qui correspond à post(check)
  si la requête n'est pas nulle
  alors "bonne réponse"
  sinon "mauvaise réponse"
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
29 mars 2012 à 16:19
Malheureusement, ça n'affiche toujours pas les erreurs. Est-ce que par hasard ça pourrais venir de
if(!empty($_POST)){ qui comprend tout le bloc Traitement des données et affichage des erreurs ?
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
29 mars 2012 à 16:32
Tu as essayé un petit echo dans ce if ?
Commente aussi cette ligne : header('Location: page1.php'); et mets à la place echo "Bonne réponse"; pour qu'on fasse les tests sans qu'il nous dérange
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
29 mars 2012 à 16:49
Alors j'ai mis un echo "force bleue"; juste après if(!empty($_POST)){ et j'ai remplacer header('Location: page1.php'); par echo "Bonne réponse"; .
Mainteant quand je donne une bonne ou une mauvaise réponse il m'affiche les 2 echo, et quand je ne donne aucune réponse et que j'appuye sur entrer, il n'y a rien qui s'affiche.
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
29 mars 2012 à 17:06
Bon au moins, il voit qu'il y a des POST.
Fais un
echo $req;
avant ton
if($res) {
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
29 mars 2012 à 17:13
Et bien que sa soit une bonne ou une mauvaise réponse il m'affiche : SELECT reponses_j FROM geo_1 WHERE reponses_j= ' (la il y a la réponse qu'a choisie le membre) '
0
Bonjour
      $res = $bdd->query($req);
      if($res) { 
        header('Location: page1.php');
      } else {
        echo '<p><span class="erreur">Désolé, vous avez donné une mauvaise réponse.<br />Retentez votre chance avec un autre objet !!</span></p>'; 
      }


Ceci n'est pas un bon test pour savoir si la réponse à la question est correcte ou pas. Ce qui est testé ici, c'est si la requête exécutée est correcte, alors qu'il faudrait tester le nombre de lignes rendues.
Il faudrait faire
      $res = $bdd->query($req);
      if($res->rowCount()>0) {...
0
shoub-tcy Messages postés 169 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 23 mai 2012 2
29 mars 2012 à 17:16
Merci d'avoir répondue le père.
J'ai fait ce que tu m'as dis, mais il m'affiche toujours que j'ai donné une mauvaise réponse :s
0
AssassinTourist Messages postés 5709 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 310
29 mars 2012 à 17:27
C'est tout de même un meilleur test que le mien =)
0