Comment échapper une partie de chaine à l'INSERT ?

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 16 janvier 2023 - 20 nov. 2021 à 09:17
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 16 janvier 2023 - 20 nov. 2021 à 12:20
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 :

$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

3 réponses

jordane45 Messages postés 36864 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 janvier 2023 4 466
20 nov. 2021 à 10:25
Bonjour,

regarde bien cette partie de ta requête .. tu devrais y voir une erreur
:prestation, ;prix,

1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 16 janvier 2023 16
Modifié le 20 nov. 2021 à 11:40
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
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>";
        }
    }
}
0
jordane45 Messages postés 36864 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 janvier 2023 4 466
20 nov. 2021 à 11:45
Ton erreur était un problème d'insertion dans la base de données à cause de ta faute de frappe.
Je ne vois pas, comment, en ayant corriger les erreurs que je t'ai montré, tu puisses avoir toujours le même souci....

Si tu as un autre problème merci de créer une discussion propre à celui-ci.
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 16 janvier 2023 16
20 nov. 2021 à 12:20
J'ai tout repris en détail en faisant plutôt des copiés/collés et mon erreur venait effectivement
d'une faute de frappe à l'insertion :
la dernière colonne de la table compositions est 'quantites' et non 'quantite' !

Merci Jordan et désolé pour la perte de temps !
0