Quizz en php/sql

Quizz en php/sql - PHP - Programmation

Marsh Posté le 24-02-2011 à 12:59:33    

Bonjour,  
 
Je suis en train de programmer un quizz en PHP/SQL. Le script fonctionne sauf dans les cas suivants :
exemple1 :

  • question1 : A combien de bouteilles champenoises ordinaires correspond la contenance d'un nabuchodonosor ?
  • réponse1 : 20

exemple2 :

  • question2 : Quel roi d'Angleterre avait pour surnom 'Cœur de Lion' ?
  • réponse2 : Richard 1er  

Dans ces 2 cas, le script considère que la réponse est fausse même si elle est juste !
 
Est-ce un problème d'encodage ? Mes pages PHP sont encodées en ISO-8559-1 et ma base de données en Latin1_swedish_ci.
 
Précision : pour comparer la réponse donnée et celle contenue dans la table, j'utilise la fonction suivante :

Code :
  1. function newString($string) {
  2. //traitement des accents et caracteres speciaux
  3.    $char = Array("é", "è", "ê", "ç", "à", "â", "î", "ï", "ù", "ô", "ë", "-" );
  4.    $newchar = Array("e", "e", "e", "c", "a", "a", "i", "i", "u", "o", "e", " " );
  5.    $c=sizeof($char);
  6.    for($i=0;$i<$c;$i++)
  7.     $string = str_replace($char[$i], $newchar[$i], $string);
  8.    //traitement des majuscules
  9.    $string = strtolower($string);
  10.    return $string;
  11. }


 
merci de votre aide car je ne vois pas d'où vient le problème.

Reply

Marsh Posté le 24-02-2011 à 12:59:33   

Reply

Marsh Posté le 24-02-2011 à 14:05:15    

faudra apprendre à coder en php et non en C :/

Code :
  1. function newString($string) {
  2.    $char = Array("é", "è", "ê", "ç", "à", "â", "î", "ï", "ù", "ô", "ë", "-" );
  3.    $newchar = Array("e", "e", "e", "c", "a", "a", "i", "i", "u", "o", "e", " " );
  4.    $string = strtolower(str_replace($char, $newchar, $string));
  5. }



---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2011 à 14:33:53    

Soit (Résultat de 120 h de C contre 20 en PHP !) mais ça ne résoud pas le problème !
 
Par contre en rajoutant la fonction trim() je n'ai plus d'erreur :
 

Code :
  1. function newString($string) {
  2.    $char = Array("é", "è", "ê", "ç", "à", "â", "î", "ï", "ù", "ô", "ë", "-" );
  3.    $newchar = Array("e", "e", "e", "c", "a", "a", "i", "i", "u", "o", "e", " " );
  4.    $c=sizeof($char);
  5.    $string = trim(strtolower(str_replace($char, $newchar, $string)));
  6.    return $string;
  7. }


 
Mais je ne comprends pas pourquoi !


Message édité par midnightweb le 24-02-2011 à 14:35:24
Reply

Marsh Posté le 24-02-2011 à 15:04:48    

cela dit, tu ne nous montres pas le code qui fait la comparaison entre la réponse donnée et celle attendu, donc difficile de te répondre :/
 
ps : $c=sizeof($char); sert strictement à rien dans le cas présent et on utilise plutôt strlen() pour connaître la taille d'un chaîne (voire mb_strlen() pour les pbs de charset).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2011 à 15:18:47    

$c=sizeof($char); est un reliquat de ma fonction avant que tu ne m'aides à la rectifier.
Voici un extrait du code :

Code :
  1. $point=array();
  2. $point[0]=0;
  3. $score=0;
  4. //SELECTION DES QUESTIONS       
  5. if(empty($_POST["nb"])&&empty($_SESSION["nb"]))
  6.  <form method="post" action="index.php">
  7.   <p>A combien de questions voulez-vous répondre ?</p>
  8.   <select name="nb">
  9.    <option value="10" />10</option>
  10.    <option value="20" />20</option>
  11.    <option value="30" />30</option>
  12.    <option value="40" />40</option>
  13.    <option value="50" />50</option>
  14.    <option value="75" />75</option>
  15.    <option value="100" />100</option>
  16.   </select>
  17.   <input type="submit" value="Go !" />
  18.  </form>
  19. ';
  20. elseif(empty($_SESSION["nb"]))
  21. {
  22.  $_SESSION["nb"]=$_POST["nb"];
  23.  header("location:index.php" );
  24. }
  25. else
  26. {
  27. $tab=array();
  28. if(empty($_SESSION["tab"]))
  29. {
  30.  $nb=$_SESSION["nb"];//Nb de questions à generer
  31.  $sql='select count(*) as nb from question';
  32.  $req=mysql_query($sql);
  33.  $rst=mysql_fetch_array($req);
  34.  $min=1;
  35.  $max=$rst["nb"];
  36.  $i=1;
  37.  while($nb != 0)
  38.  {
  39.   $k = mt_rand($min, $max);//variable aleatoire
  40.   if(!in_array($k, $tab) )
  41.   {
  42.    $tab[]=$k;
  43.    $nb--;
  44.   }
  45.  }
  46.  for($i=0;$i<$_SESSION["nb"];$i++)//je remplis le tableau
  47.    $_SESSION["tab"][$i]=$tab[$i];
  48. }
  49. // AFFICHAGE DES QUESTIONS   
  50. for($i=1;$i<=$_SESSION["nb"];$i++)
  51. {
  52.  $sql='select * from question where id='.$_SESSION['tab'][$i-1].'';
  53.  $req=mysql_query($sql);
  54.  $rst=mysql_fetch_array($req);
  55. //QUESTIONS AUXQUELLES ON A DEJA REPONDU   
  56.  if(!empty($_POST["reponse".$i.""])||!empty($_SESSION["reponse".$i.""]))
  57.  {
  58.   if(!empty($_POST["reponse".$i.""]))
  59.    $_SESSION["reponse".$i.""]=newString($_POST["reponse".$i.""]);
  60.  //VERIFICATION DES REPONSES
  61.   $goodrep[$i]=$rst["reponse"];
  62.   $pose=$i;
  63.   if(newString($goodrep[$i])==newString($_SESSION["reponse".$i.""]))
  64.   {
  65.    $point[$i]=1;
  66.   }
  67.   else
  68.   {
  69.    $point[$i]=0;
  70.   }
  71.  }


Reply

Marsh Posté le 24-02-2011 à 15:40:44    

Je pense que tu devrais commencer par apprendre un peu plus le php et regarder les fonctions qui existent en natif parce que tu recodes des fonctions qui existent déjà
http://www.php.net/manual/fr/function.array-rand.php
http://www.php.net/manual/fr/function.strcasecmp.php
 
Tu ne devrais pas faire une comparaison stricte, rendre ton algo plus permissif.
 
Lignes 1 et 2 => $point=array(0);
Lignes 6 à 19 : t'aurais pas un pb de syntaxe, là? Manque soit du echo, soit un php?> pour que le html soit écrit dans la page :/
Ligne 62 : $pose=$i;  -> à quoi ça sert $pose?
 
Niveau architecture, tu devrais faire une page qui génère le formulaire, une autre qui traite... Parce qu'entre le $_SESSION et le $_POST, c'est un peu le bazar...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-02-2011 à 16:04:53    

"select count(*).." => verboten! select count('id') si tu veux mais pas de count(*) c'est ineficace ca sert a rien dans ton cas
 
t'as plus vite fait de compter le nombre de reponses deja données et de les exlure du nombre de question max de ton questionnaire ie: repondues =3, total = 20 et de faire
 
"select [fields] FROM [tablename] ORDER BY RND() LIMIT 20"
 
tu peux ensuite afficher 17 questions (20-3) en verifiant par rapport aux ids deja repondues pour les exclure
 
ca c'est pour le sql.
 
ensuite pour verifier qu'une reponse est valide tu peux faire un soundex()/sounds like/like/strcmp()/lower() avec mysql mais il faut que ta collation soit bonne.
ou tu peux utiliser une conversion vers ASCII avec mb_convert_encoding et strtolower ou stricmp (binaires) ou stristr pour plus de latitude
 
ca c'est dans le cas ou c'est une reponse champ libre.
 
si c'est un quizz genre QCM il faut travailler avec les ids de reponse et pas les champs ca t'evitera plein de problemes.


---------------
[VDS] rail vesa, bras ecran, support TV / [ACH] des machins
Reply

Marsh Posté le 24-02-2011 à 18:24:37    

Merci Rufo,
J'ai rectifié mon code en utilisant array_rand().
Par contre j'ai conservé ma fonction newString telle quelle.
Est-il vraiment possible de connaître toutes les fonctions natives du PHP ???
merci aussi à pop-pan : tu as raison pour le count(*)

Reply

Marsh Posté le 24-02-2011 à 19:18:16    

Non, pas par coeur, mais avant de coder, vérifier si php ne l'a pas déjà sur php.net ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 25-02-2011 à 12:53:17    

ok et merci pour tout

Reply

Marsh Posté le 25-02-2011 à 12:53:17   

Reply

Marsh Posté le 25-02-2011 à 16:40:35    

pop-pan a écrit :

"select count(*).." => verboten! select count('id') si tu veux mais pas de count(*) c'est ineficace ca sert a rien dans ton cas


Sauf si c'est un SGBD en carton, un count(*) ne sera pas plus lent, car le SGBD ne va pas fetch le contenu des colonnes... :spamafote:
 


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 25-02-2011 à 18:07:28    

ouep. mysql optimise automatiquement mais c'est pas une raison :p
 
le truc c'est que si le code est pas explicite tu reperes pas les incoherences, c'est l'avantage d'une code convention.
 
count('id') c'est pour la simple raison que ca oblige a faire des tables correctes et faire les recherches sur les bons indexes/pk, ce qui permet rapidement d'identifier si c'est utile ou non (psychologie de merde, si tu pense au champ et que tu l'ecris tu te rends plus facilement compte de ce que tu cherches a faire)
 
la precisement (je passe outre le fait que les fct mysql_* sont utilisées et pas PDO) il utilise les ids pour comparer les questions, du coup count(*) from => count('id') from => ca devient evident que => select id,reponse from ... revient au meme sauf qu'au lieu de  
 
 $rst=mysql_fetch_array($req);
 $max=$rst["nb"];
 
on peut faire  avec les mysql_*
$max = mysql_num_rows($req);
 
et on conserve les resultats sans lancer d'autres requetes.
du coup comme on a les questions on a pas besoin de se compliquer la vie et la boucle for qui lance X requetes juste pour recuperer un champ se transforme en while($row = mysql_fetch_array($req)){//affiche ton champ}
 
apres c'est clair que c'est une habitude que j'ai (liee certainement au mvc et a la declaration explicite de champs de modeles) mais qui s'avere bien utile lors du refactoring
 
 


---------------
[VDS] rail vesa, bras ecran, support TV / [ACH] des machins
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed