[Besoin d'un coup de pouce] pour des requetes préparées

Claadd
Invité n'ayant pas de compte PHPfrance

16 févr. 2011, 16:22

Bonjour tout le monde!
Alors je vous explique mon problème (le plus clairement possible ^^"), je n'arrive pas à créer simultanément deux requêtes sql préparées avec paramètres.
Ce qui me permettrais de rentrer une adresse de facturation , récupérer l'identifiant, et de le mettre en clé étrangères dans les champs du client et tout sa lors de l'inscription!
le code est le suivant :
// on récupère sous forme de tableau les données postés
$tab_value = variable_post::recup_tab_post("nom_client");
			$obj_pdo = new my_pdo();
			foreach($tab_value as $champ => $valeur)
			{
				// on test pour savoir si le tableau n'est pas vide	
				if(!empty($tab_value[$champ]))
				{
					$obj_pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
					$obj_pdo -> beginTransaction();
					try{
							$sql2 = "insert into adresse_facturation (idadresse_facturation, adresse_facturation, complement_facturation , cp_facturation, ville_facturation)
										  value('', :adresse, :cpt_adresse,:cp, :ville);";
							//on prépare la requete
							$preparation = $obj_pdo -> prepare($sql2);
							$preparation ->BindParam(':adresse', $tab_value["adresse"]);
							$preparation ->BindParam(':cpt_adresse', $tab_value["cpt_adresse"]);
							$preparation ->BindParam(':cp', $tab_value["cp"]);
							$preparation ->BindParam(':ville', $tab_value["ville"]);
							
							$execution = $preparation -> execute();
							
							// on récupère l'identifiant de la requete précèdente!
							$id_precedent = $obj_pdo -> lastInsertId();	
							
							echo $id_precedent;					
							$execution2 = $preparation -> execute();
					}
					catch(PDOException $e)
					{
						 // S’il y a eu une erreur, on annule les modifications
						$obj_pdo->rollBack();
						echo "Echec: " . $e->getMessage();
					}
					try{			
								//2eme requete
							$sql = "insert into client (idclient, nomCli, prenomCli, pseudoCli, emailCli, MdpCli, dateAge, telfix, telmob, venteRealise, idcivilite, idadresse_facturation, idadresse_livraison )
												values('', :nom_client, :prenom_client, ' ', :email, :mdp_client, :date_n, :tel_fixe, :tel_mob, ' ',  ' ', :idadresse_facturation , :idadresse_livraison );";
							$preparation2 = $obj_pdo -> prepare($sql);
							$preparation2 -> BindParam(':nom_client',$tab_value["nom_client"]);
							$preparation2 -> BindParam(':prenom_client',$tab_value["prenom_client"]);
							$preparation2 -> BindParam(':email',$tab_value["email"]);
							$preparation2 -> BindParam(':nom_client',$tab_value["nom_client"]);
							$preparation2 -> BindParam(':mdp_client',$tab_value["mdp_client"]);
							$preparation2 -> BindParam(':idadresse_facturation',$idprecedent);
							$preparation2 -> BindParam(':idadresse_livraison',$idprecedent);
							$preparation2 -> BindParam(':date_n',$tab_value["date_n"]);
							$preparation2 -> BindParam(':tel_fixe',$tab_value["tel_fixe"]);
							$preparation2 -> BindParam(':tel_mob',$tab_value["tel_mob"]);
						
							$execution2 = $preparation2 -> execute();						
						header("location:". _CH_MAG . "gestion_categorie.php");
						
						exit();
					}
					catch(PDOException $e)
					{
						 // S’il y a eu une erreur, on annule les modifications
						$obj_pdo->rollBack();
						echo "Echec: " . $e->getMessage();
					}
ai-je fais une erreur quelque part?? je pense que oui car cela ne donne rien de bon...
les deux requêtes marchent indépendamment mais lorsque j'essaie d'utiliser la variable $id_precedent pour l'inclure en tant que clé étrangère cela fait tout planter... en mettant comme erreur
Echec: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'idadresse_facturation' cannot be null
alors que la variable censée être idadresse_facturation contient bien un chiffre!
je ne sais plus où chercher quelqu'un pourrait-il m'aider!
merci!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 févr. 2011, 02:06

salut,

Fait un var_dump de l'objet prepare2 pour voir la tête de la requête, mais au vu du code c'est à cause d'un problème de syntaxe tu t'est gouré dans ta variable id => $preparation2 -> BindParam(':idadresse_facturation',$idprecedent); VS $id_precedent = $obj_pdo -> lastInsertId();

Utilise le 3ème arguments de binparam afin d'éviter les soucis : PDO::PARAM_STR pour un chaine PDO::PARAM_INT pour un entier (ta clef primaire).

par contre
echo $id_precedent;
$execution2 = $preparation -> execute();

dans le 1er bloc try la deuxième utilisation de execute n'est pas utile.

@+
Il en faut peu pour être heureux ......