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 :

Boucle foreach() sur un tableau associatif avec référence pour lier des paramètres [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut Boucle foreach() sur un tableau associatif avec référence pour lier des paramètres
    Bonjour,
    Je me prends la tête depuis des heures à tourner autour du pot sans trouver de solution. Si quelqu'un pouvait m'expliquer ça serait juste géniaaaal .

    Alors voila, je ne demande pas la chose la plus compliquée du monde. Je suis en php poo sous architecture MVC design façade. Je cherche à faire des requêtes préparées pour éviter les injections SQL.

    J'ai une classe ClientManager.class.php dans laquelle je prépare un tableau associatif de paramètres en clé et leurs valeurs associées en...valeur. Cette classe appelle ensuite une méthode static dans une classe de gestion des exécutions de requête à la base de données.

    Dans cette dernière, je boucle le tableau de paramètres pour faire un bindParam() ou un bindValue() (toujours pas compris la différence) et c'est là que je mords mon chapeau.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($aQueryParams as $key => &$value){
                        $stmt->bindParam($key, $value);
                    }
    ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach($aQueryParams as $key => $value){
                        $stmt->bindValue($key, $value);
                    }
    A chaque fois, c'est la CLE qui est insérée dans ma table de base de données au lieu de la VALEUR. J'ai même inversé à un moment les clés et les valeurs dans mon tableau, bref j'ai essayé toutes les combinaisons, je n'ai jamais d'erreur, mais toujours ce même mauvais résultat.

    Après avoir parcouru à peu prêt tous les topics de stackoverflow sur la question, je ne comprends toujours pas où ça coince.
    Donc je sollicite de tout coeur votre aide

    Si vous voulez voir le code complet, c'est ligne 44 de la classe ClientManager.class.php et 97 de la classe DBOperation.class.php ici : https://github.com/code-climber/car_...ntal/model/dao

    A+

  2. #2
    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
    Premier point : la différence entre bindValue et bindParam est au niveau de l'affectation de la valeur. bindValue évalue au moment de l'affectation alors que bindParam évalue au moment de l'exécution.
    Un exemple pour illustrer :
    Dans ce code, au moment où on appelle bindValue, $couleur vaut 'rouge'. La requête va donc s'exécuter avec couleur = 'rouge'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $couleur = 'rouge';
    $sth = $dbh->prepare('SELECT nom, couleur, calories
        FROM fruit
        WHERE couleur = :couleur');
    $sth->bindValue(':couleur', $couleur, PDO::PARAM_STR); // ":couleur vaut 'rouge'
     
    $couleur = 'bleu'; // je change la valeur de la variable
     
    $sth->execute();
    Dans ce code, on se moque de la valeur que vaut $couleur au moment de l'appel à bindParam. Au moment de l'exécution $couleur vaut 'bleu'. La requête va donc s'exécuter avec couleur = 'bleu'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $couleur = 'rouge';
    $sth = $dbh->prepare('SELECT nom, couleur, calories
        FROM fruit
        WHERE couleur = :couleur');
    $sth->bindParam(':couleur', $couleur, PDO::PARAM_STR);
     
    $couleur = 'bleu'; // je change la valeur de la variable
     
    $sth->execute();
    En gros, tu utilises bindValue si tu veux fixer la valeur et bindParam si tu veux pouvoir changer facilement la valeur.

    Personnellement, j'ai tendance à préférer la 3e solution qui consiste à passer un tableau en paramètre de la fonction execute. Solution qui s'applique très bien à ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $iAffectedRows = $stmt->execute($aQueryParams) or die(print_r(self::$oDataBase->errorInfo()));
    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]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Bonjour Celira,

    Tout d'abord merci d'avoir pris le temps de me répondre et pour tes explications claires. J'ai bien saisi la différence entre bindParam() et bindValue().

    En revanche, j'ai essayé ta troisième solution et ça me renvoie exactement le même résultat.

    Je ne vois vraiment pas où ça coince. Un affichage de mon array de paramètres renvoie pourtant les bonnes clés et les bonnes valeurs, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    :firstName vaut s
    :lastName vaut s
    :email vaut s@s.s
    :login vaut s
    :saltedPasswd vaut $2y$10$yvFDolc.lF0Cy./SMgwF0Oz5PA76u6oV1j69GfvD2McC//9qFbSGG
    Donc si mon tableau est bon, c'est au niveau de la méthode d'exécution que ça ne va pas.

    C'est d'autant plus énervant que j'ai l'intuition que c'est une bêtise.

  4. #4
    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
    Si je reprends le code que tu as indiqué dans ton 1er message, je remarque que tu as mis des quotes autour des valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //insert into Clients table
    $sQuery = 'INSERT INTO Clients (first_name, last_name, email, login, passwd) ';
    $sQuery .= "VALUES (':firstName',':lastName',':email',':login',':saltedPasswd')";
    Essaye en retirant les quotes (normalement, le fait d'utiliser une requête préparée va mettre les quotes là où il faut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //insert into Clients table
    $sQuery = 'INSERT INTO Clients (first_name, last_name, email, login, passwd) ';
    $sQuery .= " VALUES (:firstName, :lastName, :email, :login, :saltedPasswd)";
    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]

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Juillet 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Juillet 2013
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Celira, je t'épouse sur le champ !

    C'était ça ! Je me doutais bien que c'était une traîtresse bêtise. Les inquisiteurs de stackoverflow, à part me mettre le post en forme en me traitant comme du poisson pourri et me dire que mon post est une duplication de l'existant alors que j'avais pris le temps de tout lire et d'essayer n'ont pas vu cette subtilité.

    Merci à toi, j'étais bloqué depuis hier après-midi et c'est très frustrant.

  6. #6
    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

    [auto-promo éhontée et quelque peu exagérée] Faut rester sur DVP, on est les meilleurs du monde [/auto-promo]
    Un petit clic sur le bouton résolu ?
    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]

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

Discussions similaires

  1. Boucle foreach sur tableau devenu inaccessible
    Par Lhtldrn dans le forum C#
    Réponses: 1
    Dernier message: 08/07/2012, 12h23
  2. [MySQL] Remplir un tableau associatif avec une boucle while
    Par Palsajicoco dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/07/2009, 10h59
  3. [forms 9i] COPY sur un tableau associatif
    Par Magnus dans le forum Forms
    Réponses: 2
    Dernier message: 21/09/2006, 12h11
  4. [Tableaux] Boucle sur un tableau associatif
    Par alexfrere dans le forum Langage
    Réponses: 11
    Dernier message: 28/06/2006, 16h44
  5. Boucler sur un tableau associatif
    Par effree dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 17h15

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