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 :

[PHP 5.6][PG 9.4] BindParam ne lie pas des variables


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut [PHP 5.6][PG 9.4] BindParam ne lie pas des variables
    Bonjour,

    j'ai un souci lors de l’exécution d'une requête préparée, les valeurs de PDO::bindParam ne sont pas transférées lors de l'appel de la fonction execute() et je ne comprends pas pourquoi.

    Le code PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $query = $pdo->prepare("SELECT id, FROM :ma_table");
    $query->bindParam(':ma_table', $ma_table);
     
    $queryUser->execute();
    Le log postgreSQL:
    ERREUR: erreur de syntaxe sur ou près de « $1
    INSTRUCTION : SELECT id FROM $1,

    Les variables passées dans la méthode bindParam() sont bien initialisées et aucune des variables passées avec bindParam ne sont prises lors de l'exécution.

    bindValue a exactement le même comportement et je n'ai aucune erreur lors de la connexion à la BDD puisque aucune exception n'est jetée.
    Exprimer une différence d'opinion vaut mieux que :

  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
    Les requêtes préparées n'acceptent des variables que pour les données (par exemple la valeur dans une condition where ma_col = :val ou l'affectation dans une requête insert/update)
    Ce que tu veux rendre modifiable, c'est une composante de la requête. Donc, là, pas d'autre choix que la concaténation pure et simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query = $pdo->prepare("SELECT id FROM ".$ma_table." ");
     
    $queryUser->execute();
    Si jamais la variable $ma_table est alimentée à partir d'une donnée extérieure, mets un maximum de contrôles dessus. Etablir une liste des tables autorisées et vérifier que $ma_table correspond à un élément de la liste est une bonne piste.
    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
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Grand merci, ça a solutionné le problème mais il reste un point au niveau sécurité par rapport à ton commentaire. Comme la doc spécifie qu'une requête préparée n'a pas besoin de faire de l'échappement de caractères, je n'ai pas utilisé PDO::quote() documentée ici. Donc l'équivalent de pg_escape_string() n'est pas dans mon code.

    Est ce que c'est bien ce que tu voulais dire en matière de sécurité ?
    Exprimer une différence d'opinion vaut mieux que :

  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
    Alors là, on est dans un cas limite : on échappe les valeurs qui partent dans les données (ou les conditions) pour éviter de laisser passer n'importe quoi. C'est surtout important lorsqu'on ne maitrise pas les données : typiquement, si elles arrivent d'un formulaire.

    Là il s'agit d'un élément de ta base. On n'échappe les noms de colonnes, de tables...
    Normalement, tu as la maitrise de la donnée. Par exemple, si ton bout de code est le corps d'une fonction et $ma_table est un paramètre de cette fonction : tu vas appeler ta fonction en renseignant en dur dans le code le paramètre de la fonction. Il n'y a donc pas de risque de faille.

    Par contre, si tu es en train de faire une interface où ton utilisateur peut renseigner le nom de la table dans un formulaire, là il y a une faille potentielle : ton utilisateur peut taper n'importe quoi et te pourrir ta base si tu injectes la valeur reçue directement. Comme on ne peut pas échapper un nom de table, il faudra ajouter un contrôle pour empêcher la requête de s'exécuter si ton utilisateur a effectivement tapé n'importe quoi.
    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
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Je pense que l'on s'est mal compris, une clarification s'impose.

    Ma remarque n'avait pas pour but de remettre en question l’échappement de caractères ni de valider les informations fournies dans le formulaire par un utilisateur, c'est une évidence. Par contre la documentation mentionne :

    Si vous utilisez cette fonction pour construire des requêtes SQL, vous êtes vivement invités à utiliser PDO::prepare() pour préparer les requêtes SQL avec des paramètres liés au lieu d'utiliser PDO::quote() pour interpréter les entrées utilisateur dans la requête SQL.

    D'où ma remarque sur le fait que mon code actuel n'utilise pas d’échappement.
    Exprimer une différence d'opinion vaut mieux que :

  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
    Ah ! oui, une requête préparée n'a pas besoin d'appeler de fonction d'échappement (genre PDO::quote), c'est la préparation de la requête qui fait l'échappement toute seule (sur les données envoyées par BindParam, BindValue ou en paramètres de la fonction execute). C'est bien ça que tu veux dire ?
    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]

  7. #7
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Oui.
    Exprimer une différence d'opinion vaut mieux que :

  8. #8
    Membre du Club
    Homme Profil pro
    Etudiant en Informatique
    Inscrit en
    Septembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Etudiant en Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2012
    Messages : 43
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Celira Voir le message
    Les requêtes préparées n'acceptent des variables que pour les données (par exemple la valeur dans une condition where ma_col = :val ou l'affectation dans une requête insert/update)
    Ce que tu veux rendre modifiable, c'est une composante de la requête. Donc, là, pas d'autre choix que la concaténation pure et simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $query = $pdo->prepare("SELECT id FROM ".$ma_table." ");
     
    $queryUser->execute();
    Concernant ce code il est préférable de réaliser ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query = $pdo->prepare(<<<SQL 
               SELECT id
               FROM :maTable;
    SQL
    );
     
    $query->execute(array(":maTable" => $maTable));
    Ceci evite d'utiliser la concaténation et offre une meilleure lisibilité du code.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par baba5180 Voir le message
    Concernant ce code il est préférable de réaliser ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query = $pdo->prepare(<<<SQL 
               SELECT id
               FROM :maTable;
    SQL
    );
     
    $query->execute(array(":maTable" => $maTable));
    Ceci evite d'utiliser la concaténation et offre une meilleure lisibilité du code.
    C'est intéressant de connaître la syntaxe heredoc mais de là à dire qu'elle est préférable, c'est surtout suivant les goûts et elle impose des contraintes.
    Et ne vient-on pas de dire qu'on ne peut pas lier un nom de table (ni de colonne) mais uniquement des variables ?

  10. #10
    Membre du Club
    Homme Profil pro
    Etudiant en Informatique
    Inscrit en
    Septembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Etudiant en Informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2012
    Messages : 43
    Points : 47
    Points
    47
    Par défaut
    Oui autant pour moi, je n'ai pas fait attention lorsque j'ai posté mon message.

    Comme dit plus haut les requetes préparées n'accepte que des variables que pour les données (where ma_col = :val);

Discussions similaires

  1. [MySQL] Php / Html Mettres des Variables PHP en Values sur des form
    Par Jimmy_S dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/03/2006, 11h18
  2. [SGBD] PHP/mysql additioner des variables
    Par picsoun dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 20/03/2006, 03h49
  3. peut on typer des variables en php
    Par cedre22 dans le forum Langage
    Réponses: 1
    Dernier message: 17/01/2006, 10h53
  4. [Swishmax] Récupérer des variables php
    Par denis finch dans le forum Flash
    Réponses: 3
    Dernier message: 23/12/2005, 15h29
  5. Réponses: 3
    Dernier message: 03/02/2005, 13h07

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