Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2467 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Erreur entre PHP et BD mysql

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur entre PHP et BD mysql

n°1646153
lofo7
Posté le 20-11-2007 à 22:40:09  profilanswer
 

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

mood
Publicité
Posté le 20-11-2007 à 22:40:09  profilanswer
 

n°1646162
MagicBuzz
Posté le 20-11-2007 à 22:53:40  profilanswer
 

ouais, moi j'ai ça comme email :
 


'; drop table membres; --

n°1646163
lofo7
Posté le 20-11-2007 à 22:54:18  profilanswer
 

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.

n°1646175
dwogsi
Défaillance cérébrale...
Posté le 20-11-2007 à 23:22:45  profilanswer
 

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})/
n°1646266
MagicBuzz
Posté le 21-11-2007 à 09:40:21  profilanswer
 

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
n°1646334
soulmanto
Chat Noir replica
Posté le 21-11-2007 à 10:30:10  profilanswer
 

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()?

n°1646351
MagicBuzz
Posté le 21-11-2007 à 10:36:29  profilanswer
 

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é.

n°1646358
omega2
Posté le 21-11-2007 à 10:41:27  profilanswer
 

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

n°1646359
soulmanto
Chat Noir replica
Posté le 21-11-2007 à 10:41:28  profilanswer
 

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!

n°1646365
MagicBuzz
Posté le 21-11-2007 à 10:48:21  profilanswer
 

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 "?" )

mood
Publicité
Posté le 21-11-2007 à 10:48:21  profilanswer
 

n°1646432
casimimir
Posté le 21-11-2007 à 11:36:19  profilanswer
 

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

n°1646438
dwogsi
Défaillance cérébrale...
Posté le 21-11-2007 à 11:46:05  profilanswer
 

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})/
n°1646450
anapajari
s/travail/glanding on hfr/gs;
Posté le 21-11-2007 à 11:59:13  profilanswer
 


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.
 

n°1646466
casimimir
Posté le 21-11-2007 à 12:29:27  profilanswer
 

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é ^^


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Erreur entre PHP et BD mysql

 

Sujets relatifs
Problème : Appli delphi sur base mysql whitespace[PHP][6] - Meeting notes
[PHP] Problème déconnection sous IE[Mysql] Droit sur les tables ??
Aide pour la création d'un flux RSS[Crypt::CBC] RandomIV, Rijndael et PHP
SQL oracle erreur nombre invalide[MySQL] Trigger mettant à jour une autre table
[PHP] Upload de fichier en plusieurs partiesprivilèges MYSQL
Plus de sujets relatifs à : Erreur entre PHP et BD mysql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR