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 :

échappement dans requête préparée


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut échappement dans requête préparée
    Bonjour,

    Comment échapper les double quotes avec PDO?

    Avec l'exemple de de ma requête préparée ci-dessous si je fais un un update:

    c'est mon test cela marche

    c'est mon test "mais avec apostrophes" mais il me ne prend que c'est mon test et ne me retourne aucune erreur.

    Or j'ai bien:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self::$instance->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

    Je suis novice en PDO donc j'aimerai avoir un peu d'aide.
    Merci d'avance

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $i = 0;
    while($row = $sql_lg->fetch()){
        $sql = DbConnect::getInstance()->prepare("UPDATE pic_lang SET title=:title,alt=:alt WHERE id_pic=:id AND lang=:lang");
        $sql->bindParam(':title',$_POST['title'][$i],PDO::PARAM_STR);
        $sql->bindParam(':alt',$_POST['alt'][$i],PDO::PARAM_STR);
        $sql->bindParam(':id',$_GET['id_pic'],PDO::PARAM_INT);
        $sql->bindParam(':lang',$row->code,PDO::PARAM_STR);
        $exe = $sql->execute();
        $i++;
    }

    Ou encore

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $i = 0;
    while($row = $sql_lg->fetch()){
        $sql = DbConnect::getInstance()->prepare("UPDATE pic_lang SET title=:title,alt=:alt WHERE id_pic=:id AND lang=:lang");
        $exe = $sql->execute(array(
            ':title'=>$_POST['title'][$i],
            ':alt'=>$_POST['alt'][$i],
            ':id'=>$_GET['id_pic'],
            ':lang'=>$row->code
        ));
        $i++;
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ton problème ne vient pas de la requête préparée mais plutôt de la façon dont tu affiches tes résultats.

    Par contre ta boucle ne m'a pas l'air très sérieuse.
    Déjà, mettre la préparation d'une requête dans une boucle est une hérésie.
    Ensuite mettre à jour une table dans la boucle du fetch() d'autre autre table (de la même table ?) avec en plus un compteur $i qui suppose donc que tous les éléments sont existants en série ... c'est une autre hérésie.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Oui et?

    Effectivement toutes mes données sont connues. Voilà pq je fais ma boucle.

    Ma question: Est ce que je dois passer par une requete classique ou une requete préparée? Si préparée, ou est mon erreur?

    Merci

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Effectivement toutes mes données sont connues
    Que veux-tu dire ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    EDIT:

    Le coude source me donne ceci:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="text" name="title[]" id="title_1" value="c'est le temps du "test"">

    dans ma boucle while je fais une mise à jour.
    Le site est en multilingue, je guère plus de 10 langues et donc ne connaissant pas 1 langues certaines champs peuvent etre à NULL pour les traduction minimes.

    Cependant j'ai bien regardé ma requete. elle fonctionne.

    Par exemple dans ma base de donnée, je ai bien mon champ qui possède:

    c'est le temps du "test"

    Et quand je fqis ma requete pour afficher mon champ j'ai

    c'est le temps du

    Voici ma requete SELECT:

    Une idée Sabotage?

    Merci

    Code php : 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
     
    $sql_desc = DbConnect::getInstance()->query("SELECT title,alt 
                                                 FROM pic JOIN pic_lang 
                                                 ON pic.id_pic=pic_lang.id_pic 
                                                 WHERE pic.id_pic=".$_GET['id_pic']." 
                                                 ORDER BY lang ASC");
    $sql_lg = DbConnect::getInstance()->query("SELECT name FROM language_lang JOIN
                                               language ON id_language=language.id_language_lang 
                                               WHERE language_lang.code='".$_SESSION['lang']."' 
                                               GROUP BY language.code 
                                               ORDER BY language.code ASC");
    $i = 0;
    while($row_lg = $sql_lg->fetch()){
        $row_desc = $sql_desc->fetch();
        $title =!empty($_POST) ? $_POST['title'][$i] : $row_desc->title;
        $alt = !empty($_POST) ? $_POST['alt'][$i] : $row_desc->alt;
        print_r($title);
        echo '<div class="col col6">'."\n";
        echo '<label for="title_'.$i.'">'.TXT_TITLE_PIC.' '.TXT_IN.' '.$row_lg->name.'</label>'."\n";
        echo '<input type="text" name="title[]" id="title_'.$i.'" value="'.$title.'">'."\n";
        echo '</div>'."\n";
        echo '<div class="col col6">'."\n";
        echo '<label for="alt_'.$i.'">'.TXT_ALT_PIC.' '.TXT_IN.' '.$row_lg->name.'</label>'."\n";
        echo '<input type="text" name="alt[]" id="alt_'.$i.'" value="'.$alt.'">'."\n";
        echo '</div>'."\n";
        $i++;
    }

    C'est ceci qui pose problème à l'affichage:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $title =!empty($_POST) ? $_POST['title'][$i] : $row_desc->title;

  6. #6
    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 andaman Voir le message
    Ma question: Est ce que je dois passer par une requete classique ou une requete préparée? Si préparée, ou est mon erreur?
    Merci
    1/ Les requêtes préparées sont conçues pour accélérer le traitement des requêtes multiples en ne préparant qu'une fois le schéma de la requête. Donc oui les requêtes préparées sont indiquées dans ton cas par contre il faut sortir la préparation de la requête (toute la ligne qui inclus le prepare()) hors de la boucle, sinon comme dit sabotage c'est une hérésie (car dans ce cas cela serait moins performant que des requêtes classiques).

    2/ Les caractères spéciaux (doubles ou simples quotes) sont automatiquement échappés avec la préparation de la requête. Et donc si tu as un problème il vient d'autre part.

    3/ Pour le reste, le principe de ton code parait effectivement un peu suspect mais il faudrait nous en dire plus si tu veux plus de conseils.

    EDIT : J'ai posté avant de voir ta dernière réponse...

  7. #7
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    ABCIWEB ;-) Jene fait que suivre tes judicieux conseils lors des posts précédents.

    Cependant c'est un problème d'affichage; c'est certain. Mais comment je peux resoudre cette ligne ?

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="text" name="title[]" id="title_1" value="c'est la vie q "allo"">

    EDIT:

    Comme dit Sabotage, je suis d'accord que prepare doit etre en dehors de ma boucle. C'est une erreur de ma part. Mais que je passe par une requete classique ou une requete préparée, mon probleme d'affichage reste identique

    Voici le code complet qui me permet d'éditer en plusieurs langues les balises title et alt d'une image:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $sql_lg = DbConnect::getInstance()->query("SELECT code FROM language ORDER BY code ASC");
    $i=0;
    $sql = DbConnect::getInstance()->prepare("UPDATE pic_lang SET title=:title,alt=:alt WHERE id_pic=:id AND lang=:lang");
    while($row = $sql_lg->fetch()){
        $exe = $sql->execute(array(
            ':title'=>ucfirst($_POST['title'][$i]),
            ':alt'=>ucfirst($_POST['alt'][$i]),
            ':id'=>$_GET['id_pic'],
            ':lang'=>$row->code
        ));
        $i++;
    }

    Je m'y prends comme un pied ou c'est valable?

    ou faire ceci:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ':title'=>ucfirst(str_replace('"','', $_POST['title'][$i])),

    Dans ma base de donnée, les valeurs de title et alt son à NULL

    Merci de votre aide

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Mets toutes les langues à jour d'un coup au lieu de les faire une par une :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = DbConnect::getInstance()->prepare("UPDATE pic_lang SET title=:title,alt=:alt WHERE id_pic=:id");
     
    foreach ($_POST['title'] as $i=>$values) {
        $exe = $sql->execute(array(
            ':title'=>ucfirst($_POST['title'][$i]),
            ':alt'=>ucfirst($_POST['alt'][$i]),
            ':id'=>$_GET['id_pic'],
        ));
    }
    Pour l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<input type="text" name="title[]" id="title_'.$i.'" value="'.htmlspecialchars($title).'">'."\n";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  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
    @sabotage j'ai des doutes sur la dernière requête que tu propose. Si je regarde sa précédente requête j'ai bien l'impression que c'est le couple "id_pic" et "lang" qui forme une clé unique dans sa table. Aussi j'ai du mal à imaginer qu'une boucle d'update ciblant uniquement l'id donne quelque chose de cohérent.. ?

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La mise à jour est la même pour toutes les "lang" de chaque "id" non ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    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
    J'ai peut-être trop d'imagination mais il me semble que c'est une tentative de formulaire de traduction (même si le code est incomplet).

  12. #12
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    ABCIWEB ton imagination est bonne ;-) Ceci dit c'était dit plus haut Peut etre tu as d'autres conseils à donner
    SABOTAGE Je pense que ton code va m'aider. Je regare cela demain car ici 23h45

    J'ai fait ceci:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    htmlentities($title)

  13. #13
    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
    Je te conseille htmlspecialchars plutôt que htmlentities. D'une part c'est suffisant et d'autre part tu n'auras pas besoin de spécifier le charset si tu code en utf-8

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 372
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Moi aussi je suis novice en pdo, mais pour un affichage des erreurs, à la place de self::$instance->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); je ferais self::$instance->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

Discussions similaires

  1. Sqlite et utilisation de Like dans requête préparée
    Par joreveur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/05/2015, 21h37
  2. [MySQL] Erreur dans requête préparée
    Par skandaboy dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/01/2011, 12h33
  3. [PDO] Échappement dans une requête préparée
    Par shadeoner dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/05/2010, 21h16
  4. [PDO] LIKE dans requête préparée
    Par ddelec24 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/11/2008, 13h05
  5. Caractère d'échappement dans une requête ?
    Par RudyWI dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/04/2008, 22h26

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