Erreur entre PHP et BD mysql

Erreur entre PHP et BD mysql - SQL/NoSQL - Programmation

Marsh Posté le 20-11-2007 à 22:40:09    

Bonjour,
j'ai créé ma base de données et un formulaire d'inscription à un espace membre. Alors lorsque je remplis le formulaire et que je le soumets, j'obtiens cette erreur :
 
Erreur : Column count doesn't match value count at row 1
 
Mon problème je pense vient de l'insertion de données, dans ma base, de mon formulaire de type "radio". Je demande si les membres veulent s'inscrire à la newletter donc ils ont une case à cocher.
 
voici ma base :

Code :
  1. CREATE TABLE `membres` (
  2.   `id` mediumint(9) NOT NULL auto_increment,
  3.   `session` text NOT NULL,
  4.   `pseudo` text NOT NULL,
  5.   `passe` text NOT NULL,
  6.   `email` text NOT NULL,
  7.   `ville` text NOT NULL,
  8.   `infolettre` varchar(255) NOT NULL default '0',
  9.   KEY (`id`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


 
le script pour l'inscription :

Code :
  1. <?php
  2. session_start();
  3. require_once('config.php');
  4. $titre_page='Inscription';
  5. include_once('haut.php');
  6. ?><form method='post' action='verification.php' enctype='multipart/form-data'>
  7. <table width="400" border="0" align="center">
  8. <tr>
  9. <td colspan="2" class="menu"><div align="center">Inscription</div></td>
  10. </tr>
  11. <tr>
  12. <td width="195"><label for="pseudo">Pseudo : </label></td>
  13. <td width="195"><input name="pseudo" type="text" id="pseudo" /></td>
  14. </tr>
  15. <tr>
  16. <td><label for="email">E-mail : </label></td>
  17. <td><input name="email" type="text" id="email" /></td>
  18. </tr>
  19. <tr>
  20. <td><label for="mdp">Mot de passe : </label></td>
  21. <td><input name="mdp" type="password" id="mdp" /></td>
  22. </tr>
  23. <tr>
  24. <td><label for="mdp2">Confirmation du mot de passe : </label></td>
  25. <td><input name="mdp2" type="password" id="mdp2" /></td>
  26. </tr>
  27.     <tr>
  28. <td><label for="ville">Ville : </label></td>
  29. <td><input name="ville" type="text" id="ville" /></td>
  30. </tr>
  31.     <tr>
  32. <td><label for="infolettre">S'inscrire à l'infolettre ? : </label></td>
  33. <td>Oui<input name="infolettre" type="radio" value="1" />
  34. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input name="infolettre" type="radio" value="0" />Non</td>
  35. </tr>
  36.     <tr><td>&nbsp;</td></tr>
  37. <tr>
  38. <td><div align="right">
  39.   <input name="Envoyer" type="submit" value="Valider" />
  40. </div></td>
  41.     <td><input name="Effacer" type="reset" id="Effacer" value="Effacer" /></td>
  42. </tr>
  43. </table>
  44. </form>
  45. </div>
  46. <center><a href="index.php">Retour</a></center>
  47. <?php
  48. include_once('bas.php');
  49. ?>


 
et le script de vérification :

Code :
  1. <?php
  2. session_start();
  3. require_once('config.php');
  4. $titre_page='Inscription';
  5. include_once('haut.php');
  6. $email=formulaires($_POST['email']);
  7. $pseudo=formulaires($_POST['pseudo']);
  8. $mdp=formulaires($_POST['mdp']);
  9. $mdp2=formulaires($_POST['mdp2']);
  10. $ville=formulaires($_POST['ville']);
  11. $infolettre=formulaires($_POST['infolettre']);
  12. //// VERIFICATIONS BANALES ////
  13. if(!$mdp || !$mdp2 || strlen($mdp) < 5)
  14. {
  15. echo'Votre mot de passe est invalide. Il doit faire plus de 5 caractères et ne contenir que des caractères alphanumériques (A-Z, a-z, 0-9)<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  16. include_once('bas.php');
  17. return FALSE;
  18. }
  19. if($mdp!=$mdp2)
  20. {
  21. echo'Les deux mots de passe rentrés ne sont pas identiques<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  22. include_once('bas.php');
  23. return FALSE;
  24. }
  25. if(!$pseudo || strlen($pseudo) > 15)
  26. {
  27. echo'Votre pseudo est invalide. Il doit faire moins de 15 caractères et ne contenir que des caractères alphanumériques (A-Z, a-z, 0-9)<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  28. include_once('bas.php');
  29. return FALSE;
  30. }
  31. if(!$email)
  32.     {
  33. echo'Veuillez insérer un email valide<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  34. include_once('bas.php');
  35. return FALSE;
  36.     }
  37. //// VERIFICATIONS DES EXISTANCES ////
  38. $reponse_mail=mysql_query("SELECT email FROM membres WHERE email='$email'" ) or die ('Erreur : '.mysql_error()); //verification si e-mail existe déjà
  39. $count_mail=mysql_num_rows($reponse_mail);
  40. if($count_mail == 1)
  41. {
  42. echo'Cet e-mail existe déjà.<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  43. include_once('bas.php');
  44. return FALSE;
  45. }
  46. $reponse_pseudo=mysql_query("SELECT pseudo FROM membres WHERE pseudo='$pseudo'" ) or die ('Erreur : '.mysql_error()); //verification si pseudo existe déjà
  47. $count_pseudo=mysql_num_rows($reponse_pseudo);
  48. if($count_pseudo == 1)
  49. {
  50. echo 'Ce pseudo existe déjà.<br /><a href="inscription.php" onClick="history.back()">Retour</a>';
  51. include_once('bas.php');
  52. return FALSE;
  53. }
  54. for ($ligne=0;$ligne<30;$ligne++)  //Création d'un identifiant aléatoire
  55.  {
  56.  @$session.=substr('0123456789AZERTYUIOPMLKJHGFDSQWXCVBN',(rand()%(strlen('0123456789AZERTYUIOPMLKJHGFDSQWXCVBN'))),1);
  57.  }
  58.  $mdp=md5($mdp);  //Codage du mot de passe
  59.  mysql_query("INSERT INTO membres VALUES ('', '$session', '$pseudo', '$mdp', '$email')" ) or die ('Erreur : '.mysql_error()); //insertion dans la bdd
  60. echo'Merci de vous vous etre inscrit sur '.$nom_du_site.'<br /><a href="index.php">Identifiez vous !</a>';
  61. include_once('bas.php');
  62. ?>


 
Je vois pas d'où peut venir l'erreur. Si vous avez une idée...
 
Merci
Max

Reply

Marsh Posté le 20-11-2007 à 22:40:09   

Reply

Marsh Posté le 20-11-2007 à 22:53:40    

ouais, moi j'ai ça comme email :
 


'; drop table membres; --

Reply

Marsh Posté le 20-11-2007 à 22:54:18    

ok je te remercie, j'ai modifié. Pour le moment je fais des tests avant de l'insérer concrètement sur le site donc ça ne risque pas grand chose.

Reply

Marsh Posté le 20-11-2007 à 23:22:45    

MagicBuzz a écrit :

ouais, moi j'ai ça comme email :
 


'; drop table membres; --



Je reconnais qu'il n'est pas pruduent de laisser ce genre d'ouverture mais arrêtez de toujours répondre ça!

Citation :

mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante sur le serveur associé avec le link_identifier  spécifié.


http://fr.php.net/mysql_query


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 21-11-2007 à 09:40:21    

dwogsi a écrit :


Je reconnais qu'il n'est pas pruduent de laisser ce genre d'ouverture mais arrêtez de toujours répondre ça!

Citation :

mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante sur le serveur associé avec le link_identifier  spécifié.


http://fr.php.net/mysql_query


ben à ce moment, dans le login, le truc qui marche dans 99,9% des cas...


' or 1 = 1 or '


 
Y'as d'autres mécanismes que xxxxx_query(), qui permettent de :
1/ ganger en performances
2/ gagner en lisibilité
3/ ne pas polluer son code à grand coups d'échappement automatiques des quotes (que ce soit real_escape() ou magicquotes)
4/ permettre des contrôles de type en amont de l'exécution
5/ gagner en portabilité (pour rappel, \' N'EST PAS LE CARACTERE D'ECHAPPEMENT DE LA QUOTE DANS LA NORME SQL !)
 
Donc UTILISEZ LES !
 
mysql_query() ça date d'un autre âge, à l'époque où MySQL ne savait même pas faire une jointure "inner join" sans planter. Il serait temps d'évoluer un peu. Quandun gars demande de l'aide sur le forum pour du HTML et se pointe avec un <table> ou un <font color="red">, tout le monde lui vole dans les plumes en disant que c'est de la merde, qu'il faut plus l'utiliser et tout ça.
 
Alors je ne cèderai pas, quand je vois un accès à une base écrit comme une merde des années 70, ça me fait hurler, et vous pourrez bien dire tout ce que vous voudrez, je ne changerai pas ma façon de dire ce que je pense :o

Message cité 1 fois
Message édité par MagicBuzz le 21-11-2007 à 09:41:36
Reply

Marsh Posté le 21-11-2007 à 10:30:10    

là ça m'intéresse... En l'occurence, j'utilise un wrapper pour tout ce qui est accès à la base requêtes et tout le tintouin, mais qu'est-ce qui peut être significativement plus rapide qu'un mysql(i)_query() ou mysql(i)_real_query()?

Reply

Marsh Posté le 21-11-2007 à 10:36:29    

http://maximilian.developpez.com/m [...] tatements/
 
Y'a peut-être plus de détails dans la doc PHP officielle.
Je sais qu'il y a aussi une lib (standard ?) qui permet d'ajouter un iveau d'abstraction supplémentaire, et ainsi permet de faire abstraction du SGBD utilisé, ce qui est assez pratique pour un développement dans une optique de portabilité.

Reply

Marsh Posté le 21-11-2007 à 10:41:27    

MagicBuzz > Le "zend framework" permet d'avoir un bon niveau d'abstraction et il doit surement y en avoir d'autres.

Reply

Marsh Posté le 21-11-2007 à 10:41:28    

Ha, oui, les requêtes préparées... Plus que le côté perfs, c'est le côté sécurité qui m'a intéressé là-dedans. J'en avais parlé y'a assez longtemps sur le topic des développeurs de forum, mais ça n'avait pas tenté grand monde!

Reply

Marsh Posté le 21-11-2007 à 10:48:21    

moi je ne jure que par ça.
 
la syntaxe est à peine plus lourde, mais en revanche tu es sûr de ce qui est exécuté.
et avec MySQL > 5, des optimisations supplémentaires ont été apportées, ce qui améliore considérablement les perfs.
 
la doc de SQL Server est bien plus verbeuse que cet article, et s'applique en gros à tous les SGBD qui supportent ce type de requête (c'est à dire, à ma connaissance, tous).
 
à noter par contre que je ne sais pas si mysql support le paramètres nommés. ça améliore considérablement la lisibilité des requêtes (ça donne un peu comme dans le post de lofo7, sauf que tu trouves des "@toto" ou ":toto" au lieu de "$toto" dans tes requêtes. c'est plus lisible que des "?" )

Reply

Marsh Posté le 21-11-2007 à 10:48:21   

Reply

Marsh Posté le 21-11-2007 à 11:36:19    

y doit bien exister des tests quelque part, mais a priori une requete préparée pourrait même être plus rapide car si elle est exécutée de multiple fois le sgbd ne doit pas la recompiler a chaque fois.
Perso je pense qu'il n'y a que des avantages

Reply

Marsh Posté le 21-11-2007 à 11:46:05    

MagicBuzz a écrit :

Alors je ne cèderai pas, quand je vois un accès à une base écrit comme une merde des années 70, ça me fait hurler, et vous pourrez bien dire tout ce que vous voudrez, je ne changerai pas ma façon de dire ce que je pense :o


Non mais je suis tout à fait d'accord avec toi. Je signalait juste que l'exemple qui est souvent donné ne fonctionne pas.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 21-11-2007 à 11:59:13    


Perso, je préfère largement PDO à mysqli...
A noter également pour ceux qui ne pourraient installer ces extensions qu'il existe de nombreuses librairies d'abstaction qui permettent de se servir de prepared statement ( ma favorite étant adodb)
 

casimimir a écrit :

y doit bien exister des tests quelque part, mais a priori une requete préparée pourrait même être plus rapide car si elle est exécutée de multiple fois le sgbd ne doit pas la recompiler a chaque fois.
Perso je pense qu'il n'y a que des avantages


Nan mais un sgbd ça "compile" pas les requêtes hein :o On parle de "plan d'éxécution".
Mais tu as raison sur le fond. Au "prepare", le plan d'éxécution de la requête est memorisé pour pouvoir être ré-utilisé lors de chaque execute.
 

Reply

Marsh Posté le 21-11-2007 à 12:29:27    

c'est ce que je voulais dire, compiler était un résumé, mais oui je voulais dire que la requete était passée par le parser et l'optimizer, encore que la requete stockée sera une version hashée je crois, donc allez, moitié moitié ^^

Reply

Sujets relatifs:

Leave a Replay

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