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 :

Execute() ou bindParam()


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Execute() ou bindParam()
    Bonjour, j'ai lu dans la doc PDO que la principale différence lors du lien des paramètres est que execute() les lie automatiquement avec l'option PARAM_STR, tandis que bindParam permet de les lier en PARAM_INT, ou autre.

    J'ai plusieurs questions :

    - Que se passe-t-il lorsque PDO rencontre une chaîne de caractère alors qu'il attend un INT (erreur ? cast ?) ?

    - Quel est le risque d'utiliser execute à la place de bindParam quand on utilise des INT ?

    Explication. J'ai une table 'table' avec un champ 'id', avec execute() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $db->prepare("SELECT * FROM `table` WHERE id=:id");
    $req->execute("id"=>$id);
    En supposant que $id vaut 5, ça donne : SELECT * FROM `table` WHERE id='5'.

    Alors que si j'avais utilisé bindParam(":id", $id, PDO::PARAM_INT), j'aurais eu : SELECT * FROM `table` WHERE id=5, avec vérification que $id est bien un INT.

    Dans aucun des deux cas une injection SQL n'est possible car PDO échappe tout ce qui est guillemet..., ce qui évite dans le premier cas de refermer ' et dans le deuxième cas, l'apostrophe ne pourra pas passe car ce n'est pas un INT.

    Y a-t-il un risque à utiliser execute() à la place de bindParam() ?

  2. #2
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam ;
    Que se passe-t-il lorsque PDO rencontre une chaîne de caractère alors qu'il attend un INT (erreur ? cast ?) ?
    automatiquement vous aurez un message d’erreur mettant en exergue d'incompatibilité de paramètre.
    bindParam — Lie un paramètre à un nom de variable spécifique avant d'exécuté la requête.
    Y a-t-il un risque à utiliser execute() à la place de bindParam() ?
    exemple :
    http://php.net/manual/fr/pdostatement.bindparam.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Exemple #1 Exécution d'une requête préparée avec des emplacements nommés
    <?php
    /* Exécution d'une requête préparée en liant des variables PHP */
    $calories = 150;
    $couleur = 'rouge';
    $sth = $dbh->prepare('SELECT nom, couleur, calories
        FROM fruit
        WHERE calories < :calories AND couleur = :couleur');
    $sth->bindParam(':calories', $calories, PDO::PARAM_INT);
    $sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12);
    $sth->execute();
    ?>

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Merci, cela réponde grande partie à ma question. En revanche, j'ai regardé du côté de PHP.net, et je n'ai rien vu qui indique si lier un entier avec execute() à la place de bindParam() rend la script plus vulnérables à certaines injections SQL.

  4. #4
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam ;
    avec PDO et les requêtes préparés pas de soucis pour les injections sql.
    l'avantage c'est l'utuilisation des exceptions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try
    {
         $connexion = new PDO ( ... );
         $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $sql = "...";
     
    }
    catch (PDOException $e)
    {
         echo $e->getMessage();
    }
    je crois qu'il faut passé par le bindparam ou bindvalue ensuite exécuté la requête éxecute() c'est l'idéal.
    je vous renvois a la doc une autre fois.
    http://www.php.net/manual/fr/pdo.setup.php

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. [Kylix] Demarrer en cliquant sur l'executable ???
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 26/04/2002, 11h24
  4. [Kylix] Execution d'une application hors de l'edi
    Par Sadam Sivaller dans le forum EDI
    Réponses: 1
    Dernier message: 20/04/2002, 23h22
  5. Réponses: 2
    Dernier message: 17/03/2002, 19h00

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