8796 sujets

Développement web côté serveur, CMS

Bonjour,

Cela fait maintenant deux mois que je me suis mis à coder en html & en javascript et j'avoue y trouver mon plaisir mais voilà j'ai vite trouvé des limites c'est pourquoi je débute avec php qui sera bien plus adapté à mes besoins.

J'ai déjà parcouru pas mal de tuto et compris pas mal de chose sur la puissance de ce langage que j'aimerai exploiter.

Je construit donc pour le moment un petit site "test" sur lequel je souhaiterai inclure une zone membre, google étant mon ami aussi j'ai parcouru pas mal de chose et mis en application certain tuto dont un qui m'a parue très simple à comprendre et qui fonctionne très bien.

Seulement lorsque que je modifie le code du fichier inscription.php et son formulaire j'ai une erreur :
Erreur SQL !INSERT INTO membre VALUES("", "test ", "ab4f63f9ac65152575886860dde480a1")
Column count doesn't match value count at row 1


J'ai fait quelques recherches et j'ai pu lire ici et la que cette erreur se produit lorsque vous tentez d'insérer une requête alors que vous n'avez pas spécifié le nombre de champs corrects lors de l'insertion. Si votre table comporte par exemple 4 champs, vous devez spécifier une valeur pour chacun des champs dans la requête...j'ai beau chercher je ne trouve pas ou est l'erreur car j'ai bien spécifié chaque champs dans mon script dont je vous fait copie ci dessous :

<div id="blocgauche"> 
    <?php
// on teste si le visiteur a soumis le formulaire
if (isset($_POST['inscription']) && $_POST['inscription'] == 'Inscription') {
	// on teste l'existence de nos variables. On teste également si elles ne sont pas vides
	if ((isset($_POST['login']) && !empty($_POST['login'])) 
	&& (isset($_POST['pass']) && !empty($_POST['pass'])) 
	&& (isset($_POST['pass_confirm']) && !empty($_POST['pass_confirm']))
	&& (isset($_POST['nom']) && !empty($_POST['nom']))
	&& (isset($_POST['prenom']) && !empty($_POST['prenom']))
	&& (isset($_POST['datedenaissance']) && !empty($_POST['datedenaissance']))
	&& (isset($_POST['villedenaissance']) && !empty($_POST['villedenaissance']))
	&& (isset($_POST['adresse']) && !empty($_POST['adresse']))
	&& (isset($_POST['codepostal']) && !empty($_POST['codepostal']))
    && (isset($_POST['ville']) && !empty($_POST['ville']))
	&& (isset($_POST['tel']) && !empty($_POST['tel']))
	&& (isset($_POST['email']) && !empty($_POST['email']))
	) {
		// on teste les deux mots de passe
		if ($_POST['pass'] != $_POST['pass_confirm']) {
			$erreur = 'Les 2 mots de passe sont différents.';
		}
		else {
			$base = mysql_connect ('localhost', 'jpp', 'xxxxxxxxxx');
			mysql_select_db ('base_jpp', $base);

			// on recherche si ce login est déjà utilisé par un autre membre
			$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'"';
			$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
			$data = mysql_fetch_array($req);

			if ($data[0] == 0) {
				$sql = 'INSERT INTO membre VALUES("", "'.mysql_escape_string($_POST['login']).'", 
				"'.mysql_escape_string($_POST['nom']).'", 
				"'.mysql_escape_string($_POST['prenom']).'",
				"'.mysql_escape_string($_POST['datedenaissance']).'", 
				"'.mysql_escape_string($_POST['villedenaissance']).'", 
				"'.mysql_escape_string($_POST['adresse']).'", 
				"'.mysql_escape_string($_POST['codepostal']).'", 
				"'.mysql_escape_string($_POST['ville']).'", 
				"'.mysql_escape_string($_POST['tel']).'", 
				"'.mysql_escape_string($_POST['email']).'", 
				"'.mysql_escape_string(md5($_POST['pass'])).'")';
				mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

				session_start();
				$_SESSION['login'] = $_POST['login'];
				header('Location: membre.php');
				exit();
			}
			else {
				$erreur = 'Un membre possède déjà ce login.';
			}
		}
	}
	else {
		$erreur = 'Au moins un des champs est vide.';
	}
}
?>




    <h2><img src="images/icones/inscrition.png" width="48" height="48" align="absmiddle" /> Inscription</h2>
    <p><form action="inscription.php" method="post">
Login : <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"><br />
Mot de passe : <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"><br />
Confirmation du mot de passe : <input type="password" name="pass_confirm" value="<?php if (isset($_POST['pass_confirm'])) echo htmlentities(trim($_POST['pass_confirm'])); ?>"><br />
Nom : <input type="text" name="nom" value="<?php if (isset($_POST['nom'])) echo htmlentities(trim($_POST['nom'])); ?>"><br />
Prénom : <input type="text" name="prenom" value="<?php if (isset($_POST['prenom'])) echo htmlentities(trim($_POST['prenom'])); ?>"><br />
Date de naissance : <input type="text" name="datedenaissance" value="<?php if (isset($_POST['datedenaissance'])) echo htmlentities(trim($_POST['datedenaissance'])); ?>"><br />
Ville de naissance : <input type="text" name="villedenaissance" value="<?php if (isset($_POST['villedenaissance'])) echo htmlentities(trim($_POST['villedenaissance'])); ?>"><br />
Adresse : <input type="text" name="adresse" value="<?php if (isset($_POST['adresse'])) echo htmlentities(trim($_POST['adresse'])); ?>"><br />
Code postal : <input type="text" name="codepostal" value="<?php if (isset($_POST['codepostal'])) echo htmlentities(trim($_POST['codepostal'])); ?>"><br />
Ville : <input type="text" name="ville" value="<?php if (isset($_POST['ville'])) echo htmlentities(trim($_POST['ville'])); ?>"><br />
Téléphone : <input type="text" name="tel" value="<?php if (isset($_POST['tel'])) echo htmlentities(trim($_POST['tel'])); ?>"><br />
E-Mail : <input type="text" name="email" value="<?php if (isset($_POST['email'])) echo htmlentities(trim($_POST['email'])); ?>"><br /><br />
<input type="submit" name="inscription" value="Inscription">
</form>
<?php
if (isset($erreur)) echo '<br />',$erreur;
?>
</p></div>



Ma table "membre" comporte 12 champs : les 11 champs du formulaire + 1 champs id auto incrémenté qui est déclaré comme clé primaire.

Je m'arrache les cheveux depuis ce matin je ne vois pas ou j'ai fait l'erreur si quelqu'un pouvait me venir en aide il ne me reste plus beaucoup de cheveux Smiley confus merci
Modifié par jpp (09 Feb 2011 - 15:44)
Bonjour,

Je pense que ta requête ne fonctionne pas car tu défini une valeur pour le champ qui est défini en auto-increment.

Il faut que tu ne donnes pas de valeur dans ton insert à ce champ.

INSERT INTO "nom de table" ("colonne 2", "colonne 3", ...)
VALUES ("valeur 1", "valeur 2", ...)

Pense à bien préciser le nom de tes champs dans ta requête étant donné que tu vas en utiliser 11 sur les 12 de la table. Smiley cligne
Bonjour,
Je te conseilles d'adopter un controle en tête de tes php
ensuite tu n'utilisera que les variables ainsi trouvées
de même connectes toi au départ puis ferme la connection
en employant le handleur de connection (ici $base)
Autre point tu ne peut faire ton session_start qu'en tete
de ton PHP.
De même le header de redirection !
Bref tu dois faire toute ta logique avant d'envoyer un echo ou le DOCTYPE !

Pour l'ajout dans MySql il faut donner la liste des champs PUIS leur valeur
ceci t'évite de mentionner l'ID auto incrémenté, il se gérera tout seul
mieux qu'avec ""
j ais donc mis le nom des champs en prenant celui des variables a toi de rectifier





<?php
$base = mysql_connect ('localhost', 'jpp', 'xxxxxxxxxx');
mysql_select_db ('base_jpp', $base);
$inscription = (isset($_POST['inscription'])) ? mysql_real_escape_string($_POST['inscription']) : '';
$login = (isset($_POST['login'])) ? mysql_real_escape_string($_POST['login']) : '';
$pass = (isset($_POST['pass'])) ? mysql_real_escape_string($_POST['pass']) : '';
$pass_confirm = (isset($_POST['pass_confirm'])) ? mysql_real_escape_string($_POST['pass_confirm']) : '';
$nom = (isset($_POST['nom'])) ? mysql_real_escape_string($_POST['nom']) : '';
$prenom = (isset($_POST['prenom'])) ? mysql_real_escape_string($_POST['prenom']) : '';
$datedenaissance = (isset($_POST['datedenaissance'])) ? mysql_real_escape_string($_POST['datedenaissance']) : '';
$villedenaissance = (isset($_POST['villedenaissance'])) ? mysql_real_escape_string($_POST['villedenaissance']) : '';
$adresse = (isset($_POST['adresse'])) ? mysql_real_escape_string($_POST['adresse']) : '';
$codepostal = (isset($_POST['codepostal'])) ? mysql_real_escape_string($_POST['codepostal']) : '';
$ville = (isset($_POST['ville'])) ? mysql_real_escape_string($_POST['ville']) : '';
$tel = (isset($_POST['tel'])) ? mysql_real_escape_string($_POST['tel']) : '';
$email = (isset($_POST['email'])) ? mysql_real_escape_string($_POST['email']) : '';
// on teste si le visiteur a soumis le formulaire
if (isset($_POST['inscription']) && $_POST['inscription'] == 'Inscription')
{
	// on teste l'existence de nos variables. On teste également si elles ne sont pas vides
 if ($login!="" && $pass!="" && $pass_confirm!="" && $nom!=""
 && $prenom!="" && $datedenaissance!="" && $villedenaissance!="" && $adresse!=""
 && $codepostal!="" && $ville!="" && $tel!="" && $email!=""	)
 {
		// on teste les deux mots de passe
  if ($pass!= $pass_confirm) { $erreur = 'Les 2 mots de passe sont différents.';}
   else
   {
   $mdp=md5($pass);
			// on recherche si ce login est déjà utilisé par un autre membre
   $sql = 'SELECT count(*) FROM membre WHERE login=$login';
   $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
   $data = mysql_fetch_array($req);
    if ($data[0] == 0) {
    $sql = 'INSERT INTO membre (
    login,nom,prenom,datedenaissance,villedenaissance,
    adresse,codepostal,ville,tel,email,pass)
    VALUES(
    $login,$nom,$prenom,$datedenaissance,$villedenaissance,
    $adresse,$codepostal,$ville,$tel,$email,$mdp)';
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
   session_start();
    $_SESSION['login'] = $login;
   header('Location: membre.php');
   exit();
  }
 else {  $erreur = 'Un membre possède déjà ce login.'; }
 }
}
else {
	$erreur = 'Au moins un des champs est vide.';
}
}
?>
<div id="blocgauche">
<h2><img src="images/icones/inscrition.png" width="48" height="48" align="absmiddle" /> Inscription</h2>
<p><form action="inscription.php" method="post">
Login : <input type="text" name="login" value="<?php echo htmlentities(trim($login)); ?>"><br />
Mot de passe : <input type="password" name="pass" value="<?php echo htmlentities(trim($pass)); ?>"><br />
Confirmation du mot de passe : <input type="password" name="pass_confirm" value="<?php echo htmlentities(trim($pass_confirm)); ?>"><br />
Nom : <input type="text" name="nom" value="<?php echo htmlentities(trim($nom)); ?>"><br />
Prénom : <input type="text" name="prenom" value="<?php echo htmlentities(trim($prenom)); ?>"><br />
Date de naissance : <input type="text" name="datedenaissance" value="<?php echo htmlentities(trim($datedenaissance)); ?>"><br />
Ville de naissance : <input type="text" name="villedenaissance" value="<?php echo htmlentities(trim($villedenaissance)); ?>"><br />
Adresse : <input type="text" name="adresse" value="<?php echo htmlentities(trim($adresse)); ?>"><br />
Code postal : <input type="text" name="codepostal" value="<?php echo htmlentities(trim($codepostal)); ?>"><br />
Ville : <input type="text" name="ville" value="<?php echo htmlentities(trim($ville)); ?>"><br />
Téléphone : <input type="text" name="tel" value="<?php echo htmlentities(trim($tel)); ?>"><br />
E-Mail : <input type="text" name="email" value="<?php  echo htmlentities(trim($email)); ?>"><br /><br />
<input type="submit" name="inscription" value="Inscription">
</form>
<?php
if (isset($erreur)) echo '<br />',$erreur;
mysql_close($base); 
?>
</p></div>


Modifié par Christele (10 Feb 2011 - 13:04)
salut

Juste en passant. mysql_escape_string est obsoléte, à la place, mysql_real_escape_string et

if ((isset($_POST['login']) && !empty($_POST['login'])) 


double emploi, çà c'est suffisant et sans erreurs de syntaxe

if (!empty($_POST['login'])) 


pour le champ autoincrémenté, on insére la valeur NULL et non une chaine vide.
Autant pour moi, j'avais copié/collé
Je confirme c'est mysql_real_escape_string Smiley decu

par contre tu dis pour le champ autoincrémenté,
on insére la valeur NULL et non une chaine vide

Je péréfres ma méthode de ne pas le mentionner Smiley smile