[RESOLU] SQLSTATE[HY093]: Invalid parameter number

JVL
Eléphant du PHP | 76 Messages

16 juil. 2014, 09:10

Bonjour,

Je cherche depuis hier le soucis, c'est surement une erreur d'étourderie. Je récupère les infos depuis un formulaire et j'update ma base.

Merci d'avance.
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in D:\wamp\www\Climatelec\add2.php on line 49
      $libelle = $_POST['libelle'];
         $city = $_POST['ville'];
      $departe = $_POST['depart'];
           $ca = $_POST['chargeaffaire'];
           $ce = $_POST['chargeetude'];
       $custom = $_POST['client'];
        $types = $_POST['type'];
        $dateo = $_POST['dateoffre'];
       $achatf = $_POST['achatfrouni'];
    $achatsoup = $_POST['achatsousp'];
      $moetude = $_POST['moeetude'];
     $moechant = $_POST['moechantier'];
       $moemes = $_POST['moemes'];
        $devis = $_POST['devismdb'];
       $phasen = $_POST['phaseno'];
     $phasedeb = $_POST['phasedebut'];
     $phasefin = $_POST['phasefin'];
        $reser = $_POST['reservep'];
           $id = $_POST['id'];



$update = $bdd->prepare('UPDATE `affaire` SET `Libelle_affaire`= :lib,`Lieu_affaire`= :lieu,`Dept_affaire`= :dept,`ID_charge_affaire`= :ca,`ID_charge_etude`= :ce,`Client`= :client,`Type_etude`= type,`Date_offre`= DATE_FORMAT(:dateoffre,"%d/%m/%Y"),`Achat_fourniture_p`= :achatfourni,`Achat_soustraitance_p`= :achatsou,`MOE_etude_p`= :moeetude,`MOE_chantier_p`= :moechantier,`MOE_mes_p`= :moemes,`Devis_mdb_p`= :devismdb,`Phase_notification_p`= DATE_FORMAT(:phasenoti,"%d/%m/%Y"),`Phase_debut_p`= DATE_FORMAT(:phasedebut,"%d/%m/%Y"),`Phase_fin_p`= DATE_FORMAT(:phasefin,"%d/%m/%Y"),`Reserves_p`= DATE_FORMAT(:reserve,"%d/%m/%Y") WHERE `ID_affaire` = :id ');
$update->execute(array(         'lib'=>"$libelle",
						       'lieu'=>"$city",
				      	'dept'=>"$departe",
						'ca'=>"$ca",
						'ce'=>"$ce",
						'client'=>"$custom",
						'type'=>"$types",
						'dateoffre'=>"$dateo",
						'achatfourni'=>"$achatf",
						'achatsou'=>"$achatsoup",
						'moeetude'=>"$moetude",
						'moechantier'=>"$moechant",
						'moemes'=>"$moemes",
						'devismdb'=>"$devis",
						'phasenoti'=>"$phasen",
						'phasedebut'=>"$phasedeb",
						'phasefin'=>"$phasefin",
						'reserve'=>"$reser" ,
						'id'=>"$id"));

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

16 juil. 2014, 10:20

salut,


le message te dit que tu as plus de variable pour le remplacement que de "token" (d'empalcement où mettre ces variables).

la il te manque un : devant type.

pour info to utilisation des variables n'est pas logique et anti perfomante.
cela ne sert à rien d'utiliser ue vairable ainsi "$variable".
Pourquoi ? parce que tu fait bosser php pour analyser la chaine alors qu'il n'y a rien a faire.
cela donne
<?php
$update->execute(array('lib'         => $libelle,
                       'lieu'        => $city,
                       'dept'        => $departe,
                       'ca'          => $ca,
                       'ce'          => $ce,
                       'client'      => $custom,
                       'type'        => $types,
                       'dateoffre'   => $dateo,
                       'achatfourni' => $achatf,
                       'achatsou'    => $achatsoup,
                       'moeetude'    => $moetude,
                       'moechantier' => $moechant,
                       'moemes'      => $moemes,
                       'devismdb'    => $devis,
                       'phasenoti'   => $phasen,
                       'phasedebut'  => $phasedeb,
                       'phasefin'    => $phasefin,
                       'reserve'     => $reser,
                       'id'          => $id));
en allant un peu plus loin, on ce dit que ta recopie des infos depuis $_POST vers x variables est inutile et le code devient
$update =
    $bdd->prepare('UPDATE `affaire` SET 
    `Libelle_affaire`= :lib,`Lieu_affaire`= :lieu,`Dept_affaire`= :dept,`ID_charge_affaire`= :ca,`ID_charge_etude`= :ce,`Client`= :client,`Type_etude`= :type,`Date_offre`= DATE_FORMAT(:dateoffre,"%d/%m/%Y"),`Achat_fourniture_p`= :achatfourni,
    `Achat_soustraitance_p`= :achatsou,`MOE_etude_p`= :moeetude,`MOE_chantier_p`= :moechantier,`MOE_mes_p`= :moemes,`Devis_mdb_p`= :devismdb,`Phase_notification_p`= DATE_FORMAT(:phasenoti,"%d/%m/%Y"),
    `Phase_debut_p`= DATE_FORMAT(:phasedebut,"%d/%m/%Y"),`Phase_fin_p`= DATE_FORMAT(:phasefin,"%d/%m/%Y"),`Reserves_p`= DATE_FORMAT(:reserve,"%d/%m/%Y") WHERE `ID_affaire` = :id ');
$update->execute(array('lib'         => $_POST['libelle'],
                       'lieu'        => $_POST['ville'],
                       'dept'        => $_POST['depart'],
                       'ca'          => $_POST['chargeaffaire'],
                       'ce'          => $_POST['chargeetude'],
                       'client'      => $_POST['client'],
                       'type'        => $_POST['type'],
                       'dateoffre'   => $_POST['dateoffre'],
                       'achatfourni' => $_POST['achatfourni'],
                       'achatsou'    => $_POST['achatsousp'],
                       'moeetude'    => $_POST['moeetude'],
                       'moechantier' => $_POST['moechantier'],
                       'moemes'      => $_POST['moemes'],
                       'devismdb'    => $_POST['devismdb'],
                       'phasenoti'   => $_POST['phaseno'],
                       'phasedebut'  => $_POST['phasedebut'],
                       'phasefin'    => $_POST['phasefin'],
                       'reserve'     => $_POST['reservep'],
                       'id'          => $_POST['id']));
@+
Il en faut peu pour être heureux ......

JVL
Eléphant du PHP | 76 Messages

16 juil. 2014, 10:26

Ok merci moogli.

Je prend note, je ne pensai pas pouvoir utilisé directement $_POST dans les requêtes préparés.

Merci encore. Résolu.