Erreur auto incrementation

Georgetta899
Invité n'ayant pas de compte PHPfrance

29 juil. 2013, 16:20

Bonjour, voici mon souci j'ai créé un formulaire pour effectuer des commande je souhaite attribuer un numéro de devis a chaque envoi de formulaire seulement lorsque je fait des essais au bout du deuxième envoi j'ai un message d'erreur du type "Duplicate entry '1' for key 'PRIMARY'"
Voici le code je ne comprend pas d'où vient l'erreur
<?php 
if(isset($_POST) && isset($_POST['format_tracts']) && isset($_POST['papier']) && isset($_POST['quantite']) && isset($_POST['delai']) && isset($_POST['name']) && isset($_POST['ville']) && isset($_POST['email']) && isset($_POST['tel'])){
	extract($_POST);
	if(!empty($format_tracts) && !empty($papier) && !empty($quantite) && !empty($name) && !empty($ville) && !empty($email) && !empty($tel)){
	
			# Connexion à la MySQL
			mysql_connect("mysql51-53.perso", "***", "***");
			# Sélection de la base 'etrecandidat'
			mysql_select_db("etrecandidat");
			
			# Récupération du plus grand numéro de devis 
			$num_devis = mysql_query("SELECT MAX(numero_devis) AS numero_devis WHERE demande_devis");
			# Incrémentation du numéro de devis
			$num_devis = ($num_devis + 1 );
			# Insertion des éléments dans la" table
			$variable = mysql_query("INSERT INTO demande_devis (numero_devis,format_tracts,papier,quantite,delai,name,ville,email,tel) VALUES ('$num_devis','$format_tracts','$papier','$quantite','$delai','$name','$ville','$email','$tel')") or die (mysql_error());
			mysql_close();
			# Création du corp de l'email
			$destinataire="[email protected]"; 
			
			$sujet="Demande de devis";
			
   			$msg="Nouvelle demande de devis
			Num_devis : $num_devis
			Nom du candidat : $name
			Ville : $ville
			Email : $email
			Tél. : $tel
			Format : $format_tracts
			Papier : $papier
			Quantite : $quantite
			Délai : $delai
			Prix : $prix";
			
			$entete="From: $email";
			
			# Envoi de l'email
			mail($destinataire,$sujet,$msg,$entete);
			

			
			echo "Your message has been sent, thank you";
			

          } 
     } 
	 
	 else{
	
		echo "you have not filled in all fields";
		
		}
	 
	 
?>

Eléphant du PHP | 96 Messages

29 juil. 2013, 16:40

Essayez d'afficher votre code d'insertion pour vérifier que le nouvel id est bien différent de celui présent en base de donnée ;)

note : vous pouvez également faire une conversion en entier lors de l'appel au max (dans le cas où il ferait un max en chaine de caractère)
Cas qui m'était déjà arrivé ;)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Georgetta899
Invité n'ayant pas de compte PHPfrance

29 juil. 2013, 16:44

Merci pour votre réponse, comment fait on pour faire une conversion en nombre entier ?

Eléphant du PHP | 96 Messages

29 juil. 2013, 16:49

SELECT MAX(CONVERT(INTEGER),monchamp)) as total 
note: a adapter, si c'est mysql c'est peut etre INT à la place d'INTEGER
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Petit nouveau ! | 6 Messages

29 juil. 2013, 17:00

J'ai toujours la même erreur ! L'incrémentation ne fonctionne pas, voici une capture d'ecran du tableau de bord phpmyadmin il a peut-être un souci a ce niveau que je ne vois pas
http://etrecandidat.fr/Capture.png

Eléphant du PHP | 96 Messages

29 juil. 2013, 17:22

Si le champ est déjà incremental, il ne faut pas essayer de le forcer, mais laisser faire mysql, non ?
INSERT INTO demande_devis (format_tracts,papier,quantite,delai,name,ville,email,tel) VALUES ('$format_tracts','$papier','$quantite','$delai','$name','$ville','$email','$tel')") 
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Petit nouveau ! | 6 Messages

29 juil. 2013, 17:50

Effectivement il avait une double incrémentation qui posait problème, en revanche lors de l'envoi du mail en face de "Num_devis :" il n'y a plus rien


<?php 
if(isset($_POST) && isset($_POST['format_tracts']) && isset($_POST['papier']) && isset($_POST['quantite']) && isset($_POST['delai']) && isset($_POST['name']) && isset($_POST['ville']) && isset($_POST['email']) && isset($_POST['tel'])){
	extract($_POST);
	if(!empty($format_tracts) && !empty($papier) && !empty($quantite) && !empty($name) && !empty($ville) && !empty($email) && !empty($tel)){
	
			# Connexion à la MySQL
			mysql_connect("mysql51-53.perso", "etrecandidat", "mdCTGVFy");
			# Sélection de la base 'etrecandidat'
			mysql_select_db("etrecandidat");
			
			# Récupération du plus grand numéro de devis 
			$num_devis = mysql_query("SELECT MAX(CONVERT(INTEGER),numero_devis)) AS total FROM demande_devis");   
			
			# Insertion des éléments dans la" table
			$variable = mysql_query("INSERT INTO demande_devis (format_tracts,papier,quantite,delai,name,ville,email,tel) VALUES ('$format_tracts','$papier','$quantite','$delai','$name','$ville','$email','$tel')") or die (mysql_error());
			mysql_close();
			# Création du corp de l'email
			$destinataire="[email protected]"; 
			
			$sujet="Demande de devis";
			
   			$msg="Nouvelle demande de devis
			Num_devis : $num_devis
			Nom du candidat : $name
			Ville : $ville
			Email : $email
			Tél. : $tel
			Format : $format_tracts
			Papier : $papier
			Quantite : $quantite
			Délai : $delai
			Prix : $prix";
			
			$entete="From: $email";
			
			# Envoi de l'email
			mail($destinataire,$sujet,$msg,$entete);
			

			
			echo "Your message has been sent, thank you";
			

          } 
     } 
	 
	 else{
	
		echo "you have not filled in all fields";
		
		}
	 
	 
?>

Eléphant du PHP | 96 Messages

29 juil. 2013, 17:55

mysql_query retourne un un recordset

il faudrait plutot faire:
$result = mysql_query('SELECT MAX(CONVERT(INTEGER),numero_devis)) AS total FROM demande_devis');
$row = mysql_fetch_assoc($result)
$num_devis = $row['total'];
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Petit nouveau ! | 6 Messages

29 juil. 2013, 18:07

Un message attention s'affiche :
"Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /homez.52/etrecand/www/tracts.php on line 23
Your message has been sent, thank you"

Eléphant du PHP | 96 Messages

29 juil. 2013, 18:14

Essayons

$result = mysql_query('SELECT MAX(CONVERT(INTEGER),numero_devis)) AS total FROM demande_devis');
if($result){
 $row = mysql_fetch_assoc($result)
 $num_devis = $row['total'];
}else{
 var_dump($result);
 var_dump(mysql_error() );
}

je pense qu'il y a un probleme avec le type INTEGER, essayer avec INT
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Petit nouveau ! | 6 Messages

29 juil. 2013, 18:15

Ca y'est c'est OK tout fonctionne, j'ai supprimé cette partie "(CONVERT(INTEGER)," tout fonctionne à merveille merci beaucoup :wink:

Petit nouveau ! | 6 Messages

29 juil. 2013, 18:26

En fait il y a juste un petit souci c'est qu'il y a décalage entre le numéro du devis envoyé dans le mail et celui qui apparait dans la base de donnée il y a un décalage de 1, c'est-à-dire, le numéro 1 (par mail) est le numéro 2 (dans la BDD)

Eléphant du PHP | 96 Messages

29 juil. 2013, 19:18

oui, il faut ajouter 1 au max récupéré: c'est le maximum en base de donnée, ou sinon faire la requete max apres l'insertion ;)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Petit nouveau ! | 6 Messages

30 juil. 2013, 10:04

C'est Ok merci beaucoup, cela faisait un bon moment que j'essayais de trouver une solution merci beaucoup

Eléphant du PHP | 96 Messages

30 juil. 2013, 10:19

Oubliez pas de passer en [RESOLU] :)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com