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
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
A voir également:
- Sélectionner table au hasard mysql ?
- Table ascii - Guide
- Table des matières word - Guide
- Mysql community server - Télécharger - Bases de données
- Sélectionner texte pdf - Guide
- Table des annexes word - Forum Word
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.
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.
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
25 mars 2012 à 01:18
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.
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.
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
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
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
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 09:08
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)
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
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
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 15:12
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...
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...
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
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'.
<?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'.
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 16:26
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
(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)
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)
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
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
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
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
Modifié par AssassinTourist le 26/03/2012 à 17:00
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"...
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
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
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 17:22
26 mars 2012 à 17:22
Ma fonction ne fait rien s'afficher, voici l'algo informel de ce que j'ai fait :
Toi, tu veux plutôt :
Pas beaucoup de choses à changer =)
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 =)
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
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?
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?
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 18:03
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 :
Quelque chose dans ce goût-là.
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à.
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
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
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
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 20:07
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");
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
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
-( ! ) Warning: substr_count() expects parameter 1 to be string, array given
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
26 mars 2012 à 20:49
26 mars 2012 à 20:49
Houlà, j'apprends pas de mes erreurs, moi...
if(substr_count($row[0], '_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 à 21:04
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
28 mars 2012 à 12:19
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
?
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
?
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
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.
- 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.
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
28 mars 2012 à 13:44
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']))...
Et pour la récupérer : if(isset($_POST['erreur']))...
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
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'];
}
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'];
}
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
28 mars 2012 à 13:56
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.
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.
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
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,...
Si $_POST['check'] est égal à la réponse juste,...
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
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
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
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
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.
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.
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
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)
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)
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
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..
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..
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é?
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
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"
"SELECT * FROM categories WHERE categorie like '%_1' ORDER BY RAND( )LIMIT 1"
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
29 mars 2012 à 15:59
29 mars 2012 à 15:59
J'ai vu une petite erreur. Tu vas remplacer ceci :
Par ceci :
En algo informel, ce que tu faisais :
Bref, ça n'allait pas du tout. J'ai changé en :
$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"
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
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 ?
if(!empty($_POST)){ qui comprend tout le bloc Traitement des données et affichage des erreurs ?
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
29 mars 2012 à 16:32
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
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
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
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.
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.
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
29 mars 2012 à 17:06
29 mars 2012 à 17:06
Bon au moins, il voit qu'il y a des POST.
Fais un
echo $req;
avant ton
if($res) {
Fais un
echo $req;
avant ton
if($res) {
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
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) '
Bonjour
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) { 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) {...
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
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
J'ai fait ce que tu m'as dis, mais il m'affiche toujours que j'ai donné une mauvaise réponse :s
AssassinTourist
Messages postés
5710
Date d'inscription
lundi 16 janvier 2012
Statut
Contributeur
Dernière intervention
29 février 2024
1 311
29 mars 2012 à 17:27
29 mars 2012 à 17:27
C'est tout de même un meilleur test que le mien =)
29 mars 2012 à 19:59
Merci pour le conseil aetrea, je pense que je vais suivre votre conseil, car ça devient craiment compliqué.
30 mars 2012 à 15:54
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.