Comment échapper une partie de chaine à l'INSERT ?
Résolu
emrh
Messages postés
427
Date d'inscription
Statut
Membre
Dernière intervention
-
emrh Messages postés 427 Date d'inscription Statut Membre Dernière intervention -
emrh Messages postés 427 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'ai une chaine ($chaine_contrat) que je découpe à l'aide d'un explode et dont je
souhaiterai ne pas enregistrer la totalité des éléments qui la composent dans ma base de données.
Quand je tente d'échapper la valeur [1] j'ai cette erreur :
(La valeur [1] est la désignation de la prestation (je n'en ai pas besoin dans ma bdd, l'id suffit)
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/html/gite/gestion/contrat-ajout2.php:76
Voici mon code :
Pouvez vous m'aider ?
D'avance merci...
J'ai une chaine ($chaine_contrat) que je découpe à l'aide d'un explode et dont je
souhaiterai ne pas enregistrer la totalité des éléments qui la composent dans ma base de données.
Quand je tente d'échapper la valeur [1] j'ai cette erreur :
(La valeur [1] est la désignation de la prestation (je n'en ai pas besoin dans ma bdd, l'id suffit)
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/html/gite/gestion/contrat-ajout2.php:76
Voici mon code :
$chaine_contrat = $_POST['chaine_contrat']; $tab_contrat = explode('|', $chaine_contrat); // Récupération du dernier ID inséré dans la table contrats : $last_insert_id = $bdd->lastInsertId(); for ($ligne=0;$ligne<sizeof($tab_contrat);$ligne++){ if($tab_contrat[$ligne] !=""){ $ligne_cont = explode(";", $tab_contrat[$ligne]); //Requête préparée pour l'ajout : $requete2 = $bdd->prepare('INSERT INTO compositions(id_contrat, id_prestation, prix, quantite) VALUES(:contrat, :prestation, ;prix, :quantite)'); $requete2->execute(array( 'id_contrat' => $last_insert_id, 'id_prestation' => $ligne_cont[0], 'prix' => $ligne_cont[2], 'quantite' => $ligne_cont[3] )); } }
Pouvez vous m'aider ?
D'avance merci...
Configuration: Linux / Firefox 94.0
A voir également:
- Comment échapper une partie de chaine à l'INSERT ?
- Touche insert - Guide
- Chaine tnt gratuite sur mobile - Guide
- Comment faire une recherche à partir d'une photo - Guide
- Plus de chaine tv - Guide
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
3 réponses
Bonjour,
regarde bien cette partie de ta requête .. tu devrais y voir une erreur
regarde bien cette partie de ta requête .. tu devrais y voir une erreur
:prestation, ;prix,
Merci Jordane,
Effectivement, j'ai tapé à côté sur le ; au lieu du :
Mais j'ai toujours mon erreur.
Ce code pour tester renvoi bien toutes mes valeurs en provenance du formulaire contrat-ajout1.php :
contrat-ajout2.php
Affichage :
8
Chambre village (2 personnes)
75
1
Mais je ne veux pas enregistrer dans la table "compositions" la data $ligne_cont[1] car elle n'est pas utile, son id est déjà dans $ligne_cont[0]. Le problème c'est que j'ai besoin dans la page formulaire (contrat-ajout1.php) d'afficher la désignation, car l'utilisateur ne sait pas ce que c'est 8 !
Cf le code de contrat-ajout1.php
Et je ne peux pas enlever text_prestation de chaine_contrat.value car j'en ai besoin pour l'affichage à destination de l'utilisateur :
Effectivement, j'ai tapé à côté sur le ; au lieu du :
Mais j'ai toujours mon erreur.
Ce code pour tester renvoi bien toutes mes valeurs en provenance du formulaire contrat-ajout1.php :
contrat-ajout2.php
for ($ligne=0;$ligne<sizeof($tab_contrat);$ligne++){ if($tab_contrat[$ligne] !=""){ $ligne_cont = explode(";", $tab_contrat[$ligne]); //Requête préparée pour l'ajout : //$requete2 = $bdd->prepare('INSERT INTO compositions(id_contrat, id_prestation, prix, quantite) VALUES(:contrat, :prestation, :prix, :quantite)'); //$requete2->execute(array( //'id_contrat' => $last_insert_id, //'id_prestation' => $ligne_cont[0], //'prix' => $ligne_cont[1], //'quantite' => $ligne_cont[2] echo $ligne_cont[0] . '<br>'; echo $ligne_cont[1] . '<br>'; echo $ligne_cont[2] . '<br>'; echo $ligne_cont[3] . '<br>'; //)); }
Affichage :
8
Chambre village (2 personnes)
75
1
Mais je ne veux pas enregistrer dans la table "compositions" la data $ligne_cont[1] car elle n'est pas utile, son id est déjà dans $ligne_cont[0]. Le problème c'est que j'ai besoin dans la page formulaire (contrat-ajout1.php) d'afficher la désignation, car l'utilisateur ne sait pas ce que c'est 8 !
Cf le code de contrat-ajout1.php
var tot_contrat=0; var selectElmt = document.getElementById("prestation"); function plus_contrat(){ if (prestation.value !=0 && prix.value !=0 && quantite.value !=0) { var text_prestation = selectElmt.options[selectElmt.selectedIndex].text; var ref_prestation = prestation.value; var ref_prix = prix.value; var ref_quantite = quantite.value; chaine_contrat.value += "|" + ref_prestation + ";" + text_prestation + ";" + ref_prix + ";" + ref_quantite; contrat(); } }
Et je ne peux pas enlever text_prestation de chaine_contrat.value car j'en ai besoin pour l'affichage à destination de l'utilisateur :
function contrat(){ var tableau_contrat = chaine_contrat.value.split('|'); var nb_lignes = tableau_contrat.length; document.getElementById("detail_contrat").innerHTML =""; for(ligne=0;ligne<nb_lignes;ligne++){ if(tableau_contrat[ligne] !=""){ var ligne_contrat = tableau_contrat[ligne].split(';'); document.getElementById("detail_contrat").innerHTML += "<div class='bord'></div>"; // On peut masquer l'id de la prestation, l'utilisateur n'en a pas besoin //document.getElementById("detail_contrat").innerHTML += "<div class='col1'>" + ligne_contrat[0] + "</div>"; document.getElementById("detail_contrat").innerHTML += "<div class='col2'>" + ligne_contrat[1] + "</div>"; document.getElementById("detail_contrat").innerHTML += "<div class='col3'>" + ligne_contrat[2] + "</div>"; document.getElementById("detail_contrat").innerHTML += "<div class='col4'>" + ligne_contrat[3] + "</div>"; document.getElementById("detail_contrat").innerHTML += "<div class='bord'></div>"; } } }