Quizz en php/sql - PHP - Programmation
Marsh Posté le 24-02-2011 à 14:05:15
faudra apprendre à coder en php et non en C
Code :
|
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 :
|
Mais je ne comprends pas pourquoi !
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).
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 :
|
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...
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.
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(*)
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
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...
Marsh Posté le 25-02-2011 à 18:07:28
ouep. mysql optimise automatiquement mais c'est pas une raison
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
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 :
exemple2 :
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 :
merci de votre aide car je ne vois pas d'où vient le problème.