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 :

erreur PDO dans fonction et ok hors fonction [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut erreur PDO dans fonction et ok hors fonction
    Bonjour à tous !

    Alors voilà mon problème :

    J'ai une fonction :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    </head>
     
    <body>
    <?php
    // $champs = Champs des tables
    // $tables = Table
    // $where = Clause WHERE
     
    function requete_sql_update($champs = "", $tables = "", $where = "") {
     
        $connexion = new PDO('mysql:host=localhost;dbname=tests', 'root', 'root', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
     
        // Champs
        $champs_a_afficher = "";
        $champs_a_executer = "";
        $i = 1;
        foreach($champs as $cle => $valeur) {
     
            if ($i == count($champs)) { $virgule = ""; } else { $virgule = ", "; }
            $champs_a_afficher .= $cle." = :".$cle.$virgule;
            $champs_a_executer .= "':".$cle."' =>  '".$valeur."'".$virgule;
            $i++;
     
        }
     
        try {
            $update = $connexion->prepare("UPDATE ".$tables." SET ".$champs_a_afficher." WHERE ".$where."");
            $update->execute(array($champs_a_executer));
        }
        catch (Exception $e) {
            $requete_sql = '$update = $connexion->prepare("UPDATE '.$tables.' SET '.$champs_a_afficher.' WHERE '.$where.'");<br />$update->execute(array('.$champs_a_executer.'));';
            return  '<span style="color:#860E10; font-size:16px">Erreur : '. $e->getMessage().'<br />Requete : '.$requete_sql.'</span>';
        }
     
     
    }
     
     
    $update = requete_sql_update(
        $champs = array('name' => 'Test name', 'price' => 280),
        $tables = "products",
        $where = "id = 1",
        $debug = false
    );
     
    echo "<pre>";
    echo $update;
    echo "</pre>";
     
     
     
    // Table products
    /*
    CREATE TABLE IF NOT EXISTS `products` (
    `id` int(2) NOT NULL,
      `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
      `price` int(3) NOT NULL
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=79 ;
    
    
    INSERT INTO `products` (`id`, `name`, `price`) VALUES
    (1, 'LG Optimus 4X HD P880 Black', 309),
    (2, 'Motorola Google Nexus 6, Midnight Blue 32GB', 400),
    (3, 'Samsung Galaxy S4 i9500 16GB', 600),
    (6, 'Bench Men''s Bench Spokes Slim T-Shirt', 14),
    (7, 'HP ZBook 17 Mobile Business Workstation', 514),
    (8, 'Samsung Galaxy Tab 4', 210),
    (9, 'Spalding Men', 49),
    (10, 'Sony Smart Watch 3', 194),
    (11, 'Huawei SnapTo', 179),
    (12, 'Abercrombie Men''s Lake Arnold Blazer', 25);
    
    ALTER TABLE `products`
    ADD PRIMARY KEY (`id`);
    
    ALTER TABLE `products`
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=79;
    */
    ?>
    </body>
    </html>
    Qui renvoie ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    Si je ne me trompe pas, le message d'erreur m'indique que le nombre de champ ne corrspond pas au nombre de valeur

    Or, avec le debug de la fonction j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $update = $connexion->prepare("UPDATE products SET name = :name, price = :price WHERE id = 1");
    $update->execute(array(':name' =>  'Test name', ':price' =>  '280'));
    Qui fonctionne parfaitement hors de la fonction....
    Donc, je ne comprend pas pourquoi j'ai un message d'erreur dans la fonction et pas lorsque je l'execute hors de la fonction

    Merci d'avance du temps que vous prendrez pour me lire ...
    Écoute, sinon ta langue te perdra (proverbe Navajo)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Le probleme est au niveau de la ligne 35 "$update->execute(array($champs_a_executer));"

    Tu passes une chaine de caracteres a ton tableau, PHP ne va pas interpreter la syntaxe de ta chaine. La solution c'est de generer directement ton tableau de valeurs dans ta boucle foreach au lieu de generer $champs_a_executer, puis de passer le tableau directement a la fonction execute comme ceci "$update->execute($mon_tableau_de_cles_valeurs);"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Champs
        $champs_a_afficher = "";
        $mon_tableau_de_cles_valeurs = array();
        $i = 1;
        foreach($champs as $cle => $valeur) {
     
            if ($i == count($champs)) { $virgule = ""; } else { $virgule = ", "; }
            $champs_a_afficher .= $cle." = :".$cle.$virgule;
            $mon_tableau_de_cles_valeurs[$cle] = $valeur;
            $i++;
     
        }
        [...]
        $update->execute($mon_tableau_de_cles_valeurs);

  3. #3
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Merci Mrsky de ton aide ....
    En fait, je me compliquais la vie vue que $champs dans ma fonction est déjà un tableau ...

    Pour être clair et si cela peut aider quelqu'un (ligne 35) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $update->execute($champs);
    Tout simplement
    Écoute, sinon ta langue te perdra (proverbe Navajo)

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

Discussions similaires

  1. Erreur à cause de string dans l'appelle d'une fonction
    Par Bootax dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 25/03/2009, 20h02
  2. Erreur Mismatch dans une fonction qui rempli une liste déroulante
    Par MisNiak dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/12/2008, 17h11
  3. Réponses: 4
    Dernier message: 30/08/2007, 18h08
  4. Réponses: 1
    Dernier message: 30/05/2007, 18h19
  5. #Erreur dans une requête avec une fonction personnalisée
    Par pguiheu dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/07/2006, 15h45

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