IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Update en PDO : Invalid parameter number: mixed named and positional parameters' [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Points : 111
    Points
    111
    Par défaut Update en PDO : Invalid parameter number: mixed named and positional parameters'
    Bonjour

    Aidez-moi Svp !
    Je cherche à mettre à jour deux tables depuis mon formulaire mais cette erreur que je ne comprends pas, la valeur de l'id dans les requêtes vient d'un autre fichier :
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' in /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php:52Stack trace:#0 /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php(52): PDOStatement->execute()#1 {main} thrown in /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php on line 52
    Et la ligne 52 est celle-ci : Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php      require_once 'connexion.php';
          session_start();
        if (isset($_SESSION['id_membre']) AND isset($_SESSION['pseudo'])){
     
     
          //On vérifie si la variable existe et sinon elle vaut NULL
          $num = isset($_POST['num']) ? $_POST['num'] : NULL;
          $client = isset($_POST['client']) ? $_POST['client'] : NULL;
          $designation = isset($_POST['designation']) ? $_POST['designation'] : NULL;
          $quantite = isset($_POST['quantite']) ? $_POST['quantite'] : NULL;
          $prixht = isset($_POST['prixht']) ? $_POST['prixht'] : NULL;
          $datefacture = isset($_POST['datefacture']) ? $_POST['datefacture'] : NULL;
          $facturede = isset($_POST['facturede']) ? $_POST['facturede'] : NULL;
          $conditions = isset($_POST['conditions']) ? $_POST['conditions'] : NULL;
          $numtva = isset($_POST['numtva']) ? $_POST['numtva'] : NULL;
          $id_membre= $_SESSION['id_membre'];
     
     
          $req1 = $base->prepare('UPDATE infosfacture
            SET num = :num,
            numtva = :numtva,
            client = :client,
            datefacture = :datefacture,
            facturede = :facturede,
            conditions = :conditions,
            id_membre= :id_membre
            WHERE id= :?');
            $req1->bindParam(':num', $_POST['num'], PDO::PARAM_STR);
            $req1->bindParam(':numtva', $_POST['numtva'], PDO::PARAM_STR);
            $req1->bindParam(':client', $_POST['client'], PDO::PARAM_STR);
            $req1->bindParam(':datefacture', $_POST['datefacture'], PDO::PARAM_STR);
            $req1->bindParam(':facturede', $_POST['facturede'], PDO::PARAM_STR);
            $req1->bindParam(':conditions', $_POST['conditions'], PDO::PARAM_STR);
            $req1->bindParam(':id_membre', $_SESSION['id_membre'], PDO::PARAM_INT);
            $req1->execute();
     
     
            $req2 = $base->prepare('UPDATE facturation
                                    SET  designation = :designation,
                                    quantite = :quantite,
                                    prixht = :prixht
                                    WHERE fk_facturation_id= ?');
            $req2->bindParam(':designation', $_POST['designation'], PDO::PARAM_STR);
            $req2->bindParam(':quantite', $_POST['quantite'], PDO::PARAM_STR);
            $req2->bindParam(':prixht', $_POST['prixht'], PDO::PARAM_STR);
            $req2->execute();
     
     
        echo 'La facture n° '.$num.' a bien été mise à jour ';
     
          <?
          }
          else {
            echo 'Vous n\'êtes pas connecté.';
          }
     
          ?>
    Merci
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu nous a fait corriger * ton code d'INSERT, maintenant c'est celui d'UPDATE ???
    * Je devrais plutôt dire : "ré-écrire entièrement" !

    Tu as DEJA eu la MEME erreur !

    Tu ne fais pas beaucoup d'efforts....


    Indice : ligne 27.

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Points : 111
    Points
    111
    Par défaut
    J'ai modifié mon code mais je cherche comment récupérer l'id de la première requête $req1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    $req1 = $base->prepare('UPDATE infosfacture        SET num = :num,
            numtva = :numtva,
            client = :client,
            datefacture = :datefacture,
            facturede = :facturede,
            conditions = :conditions,
            id_membre= :id_membre
            WHERE id= :id');
     
     
            $req2 = $base->prepare('UPDATE facturation
                                    SET  designation = :designation,
                                    quantite = :quantite,
                                    prixht = :prixht
                                    WHERE fk_facturation_id=:fk_facturation_id');
     
     
            $param = array();
            $params[':num']    = $_POST['num'];
            $params[':numtva']    = $_POST['numtva'];
            $params[':client']    = $_POST['client'];
            $params[':datefacture'] = $_POST['datefacture'];
            $params[':facturede'] = $_POST['facturede'];
            $params[':conditions'] = $_POST['conditions'];
            $params[':id_membre'] = $id_membre;
            $req1->execute($params)
     
     
            //$fk_facturation_id = $base->query('SELECT facturation.fk_facturation_id FROM facturation INNER JOIN infosfacture WHERE facturation.fk_facturation_id=infosfacture.id ')
     
     
     
     
          $params = array();
          //$params[':fk_facturation_id'] = $fk_facturation_id;
     
     
          foreach ($_POST['designation'] as $key => $designation) {
                $params[':designation'] = $designation;
                $params[':quantite']    = $_POST['quantite'][$key];
                $params[':prixht']  = $_POST['prixht'][$key];
                $params[':taxe'] = $_POST['taxe'][$key];
                $req2->execute($params);
            }
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour en arriver à modifier une facture, il a bien fallu un lien ou un formulaire contenant l'id de la facture, non ?

    Explique-nous un peu....

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Points : 111
    Points
    111
    Par défaut
    Je cherche depuis là et je ne trouve pas la solution, j'airelu la doc PDO.

    J'ai cette erreur :
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php:81Stack trace:#0 /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php(81): PDOStatement->execute(Array)#1 {main} thrown in /homepages/0/d513201601/htdocs/Facturation_generale/updateFacture.php on line 81
    Voici la ligne 81: $req2->execute($params);
    Il ne reconnait pas la variable $params qui est pourtant déclaré. Aidez-moi Svp !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $req1 = $base->prepare('UPDATE infosfacture        SET num = :num,
            numtva = :numtva,
            client = :client,
            datefacture = :datefacture,
            facturede = :facturede,
            conditions = :conditions,
            id_membre= :id_membre
            WHERE id= :id');
            $req1->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
            $req1->bindParam(':num', $_POST['num'], PDO::PARAM_STR);
            $req1->bindParam(':numtva', $_POST['numtva'], PDO::PARAM_STR);
            $req1->bindParam(':client', $_POST['client'], PDO::PARAM_STR);
            $req1->bindParam(':datefacture', $_POST['datefacture'], PDO::PARAM_STR);
            $req1->bindParam(':facturede', $_POST['facturede'], PDO::PARAM_STR);
            $req1->bindParam(':conditions', $_POST['conditions'], PDO::PARAM_STR);
            $req1->bindParam(':id_membre', $_SESSION['id_membre'], PDO::PARAM_INT);
            $req1->execute();
     
     
     
     
     
     
            $req2 = $base->prepare('UPDATE facturation
                                    SET  designation = ?,
                                    quantite = ?,
                                    prixht = ?,
                                    taxe = ?,
                                    WHERE fk_facturation_id= ?');
          $params = array();
          foreach ($_POST['designation'] as $key => $designation) {
                $params[':designation'] = $designation;
                $params[':quantite']    = $_POST['quantite'][$key];
                $params[':prixht']  = $_POST['prixht'][$key];
                $params[':taxe'] = $_POST['taxe'][$key];
                $params[':fk_facturation_id'] = $_GET['id'];
                $req2->execute($params);
            }
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut VRAIMENT apprendre à comprendre les messages d'erreur !!!

    Invalid parameter number: parameter was not defined'
    Nombre de paramètres invalide. Un (ou plusieurs) paramètres sont indéfinis.

    En clair :
    Certains paramètres définis dans la requête ne le sont pas dans les paramètres transmis (via les bindParam ou l'array $params, c'est selon...*)
    ...
    * Pourquoi tu utilises tantôt l'une, tantôt l'autre syntaxe : mystère et boule de gomme....

    Et là,.... cerise sur le cageot, tu mets des ? au lieu de "place holders" nommés ...

    Bref : tu fais du gloubigoulba....

    Ça manque cruellement de RIGUEUR !!
    Dernière modification par Invité ; 17/04/2018 à 00h28.

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    @MInfo : il faut reprendre tes requêtes pour utiliser des paramètres nommés partout, construire le tableau de paramètres correctement et l'exécuter correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $req2 = $base->prepare('UPDATE facturation
                                    SET  designation = :designation,
                                    quantite = :quantite,
                                    prixht = :prixht,
                                    taxe = :taxe,
                                    WHERE fk_facturation_id= :fk_facturation_id');
          $params = array();
          foreach ($_POST['designation'] as $key => $designation) {
                $params[':designation'] = $designation;
                $params[':quantite']    = $_POST['quantite'][$key];
                $params[':prixht']  = $_POST['prixht'][$key];
                $params[':taxe'] = $_POST['taxe'][$key];
                $params[':fk_facturation_id'] = $_GET['id'];
                $req2->execute($params);
            }

    @Jreaux : Je peux comprendre que dans une même application on utilise tantôt les marqueurs, tantôt les paramètres nommés, et tantôt le tableau de paramètres dans execute, tantôt bindParam
    execute avec un tableau de paramètres nommés et la syntaxe la plus simple et la plus facile à mettre en oeuvre

    Cependant, bindParam a l'avantage de permettre de préciser le type du champ en plus de sa valeur, et il y a des cas où c'est obligatoire pour que ça fonctionne correctement (avec LIMIT je crois bien, ou si on utilise des BLOB) Et si tu dois construire une condition IN à la volée, ce sera plus simple d'utiliser des marqueurs que de nommer tous les paramètres 1 par 1.

    MAIS ce sont des cas particuliers et passer d'une syntaxe à l'autre d'une requête à l'autre demande de la rigueur et de maitriser ce que l'on fait. Je conseille donc fortement de choisir une syntaxe et de s'y tenir dans la totalité du code.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Points : 111
    Points
    111
    Par défaut
    Je n'ai plus d'erreur mais la mise à jour n'est pas correct, avec la requete 1 $req1, tout marche avec pas la requete 2 $req2:
    Il n'y a pas de mise à jour quand il y a une mise à jour sur plusieurs lignes cad designation/quantite/prixht/taxe. De plus quand je rajoute des lignes cad designation/quantite/prixht/taxe, ces lignes ajoutées ne sont pas prise en compte dans la mise à jour.

    Voici mon code comme me suggère @Celira:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $req2 = $base->prepare('UPDATE facturation                                SET  designation = :designation,
                                    quantite = :quantite,
                                    prixht = :prixht,
                                    taxe = :taxe
                                    WHERE fk_facturation_id= :fk_facturation_id');
            $params = array();
            foreach ($_POST['designation'] as $key => $designation) {
                $params[':designation'] = $designation;
                $params[':quantite']    = $_POST['quantite'][$key];
                $params[':prixht']  = $_POST['prixht'][$key];
                $params[':taxe'] = $_POST['taxe'][$key];
                $params[':fk_facturation_id'] = $_GET['id'];
                $req2->execute($params);
                }
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ....quand je rajoute des lignes ...
    Alors dans ce cas, c'est une requête INSERT.

    Par conséquent, il manque un élément LOGIQUE pour distinguer les lignes à modifier et les nouvelles lignes.

  10. #10
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Points : 111
    Points
    111
    Par défaut
    J'ai changé, je ne vais plus modifier la facture, je vais la cloner ensuite modifier son duplicata et faire une insertion. C'est plus simple, je l'ai déjà fait et ça marche !
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] erreur Invalid parameter number: mixed named and positional parameters
    Par rvm31 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/11/2015, 10h56
  2. [PDO] ERREUR PDO : Invalid parameter number
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/12/2013, 19h57
  3. [PDO] Invalid parameter number
    Par Kel-T dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/07/2010, 14h12
  4. Réponses: 6
    Dernier message: 03/06/2010, 10h09
  5. Réponses: 3
    Dernier message: 25/08/2009, 23h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo