Partage
  • Partager sur Facebook
  • Partager sur Twitter

BindValue sur un select avec SQL

Sujet résolu
    4 février 2021 à 1:34:30

    Bonsoir,

    J'ai un petit souci de correspondance avec les échappements de la fonction bindValue().

    Grosso modo pour faire simple, j'enregistre mes données avec ce code :

                    $reqprepenregistrement = "INSERT INTO nom(user_ID, nom) VALUES (:user_ID,:nom)";
    		$reqenregistrement = $bdd->prepare($reqprepenregistrement);
    				
    		
    		$reqenregistrement->bindValue('user_ID', $user_ID, PDO::PARAM_STR);
    		$reqenregistrement->bindValue('nom', $_nom, PDO::PARAM_STR);
    		
    		$reqenregistrement->execute();	


    Donc dans ma base de donnée, les données ne sont pas échappé. Si la personne s'appel P'tit Lutin "Malin", c'est P'tit Lutin "Malin" qui s'affichera.

    J'ai une autre fonction sur le même modèle que celui d'en haut mais avec un SELECT COUNT. Le problème c'est que dès que j'ai des caractères à échapper sur cette fonction, la correspondance ne se fait plus. Ma requête sera la suivante : 

    SELECT COUNT(*) as correspondance FROM nom WHERE user_ID = '3' AND nom = 'P\'tit Lutin \"Malin\"'

    Sans surprise la correspondance ne se fait pas (P'tit Lutin "Malin" != P\'tit Lutin \"Malin\").

    Du coup j'ai plusieurs solution mais je ne sais pas laquelle je doit opter. Je suis au début de mon projet et je veux pas faire de bêtise pour les requêtes suivantes.

    - Enregistrement dans la BDD avec une fonction type addslash(). J'ai lu que c'était déconseillé car on cherche à avoir les données en BDD les plus juste possibles.

    - Faire une requête sans BindValue (plutôt déconseillé aussi pour éviter les $user_ID = nom ' -- et autres joyeusetés :

    $req = "SELECT COUNT(*) as correspondance FROM serre WHERE user_ID ='". $user_ID.'" AND nom = '".$nom AND ...

    - Récupérer l'entièreté des noms, leurs appliquer un addslash et comparer avec le nom actuel. -> Pas top niveau opti

    A part ces trois solutions qui me semble pas bonne, je suis à court d'idée.

    Est ce que l'un d'entre vous peut m'éclairer pour trouver une piste pour ce problème d'échappement?

    -
    Edité par ArnaudSchram 4 février 2021 à 12:18:40

    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2021 à 12:40:28

      Salut, est ce que tes tables et les colonnes de tes tables ont l'interclassement utf8mb4_unicode_520_ci (si t'es sous mysql) ?

      j'ai testé ça et ça marche :

      $pdo = new PDO('mysql:host=127.0.0.1;dbname=tests;charset=utf8', 'root', 'root');
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $req = $pdo->prepare('select * from users where pseudo=:nom');
      $req->bindValue(':nom', 'P\'tit Lutin "Malin"');
      var_dump($req->execute());
      var_dump($req->fetch());



      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2021 à 13:28:28

        Hello, merci de ta réponse.

        En refaisant des tests ce matin, je me suis rendu compte que ce n'est pas P'tit Lutin Malin qui posait un problème dans mon script mais la taille de ce dit petit lutin. 

        En effet je n'ai poster qu'un bout de code car j'étais convaincu que le problème venais de l'échappement (faut pas coder à 2H du matin...). Or le problème vient de la taille qui est enregistrée sous forme de float '1.32'. Le problème vient de là car quand j'enlève ce paramètre, le script marche bien. 

        Après avoir chercher presque une heure, j'ai changer le format pour DECIMAL (5,2) et tada, tout le script marche. 

        Du coup le problème venait du format FLOAT, 4 heures de prise de tête pour ça...

        Merci encore de ton temps :D

        -
        Edité par ArnaudSchram 4 février 2021 à 13:37:21

        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2021 à 13:30:18

          Je ne vois pas en quoi l'interclassement jouerait sur les quotes.

          > Enregistrement dans la BDD avec une fonction type addslash().

          Surtout pas !

          Tu ne ferais pas un htmlspecialchars quelque part par hasard ?

          > Sans surprise la correspondance ne se fait pas (P'tit Lutin "Malin" != P\'tit Lutin \"Malin\").

          Si, ça correspond si P'tit Lutin "Malin" c'est ce qu'il y a en base et P\'tit Lutin \"Malin\" ce que tu mets en WHERE en dur et sans passer par un marqueur. Par contre si P\'tit Lutin \"Malin\" c'est le résultat d'un addslashes que tu bindes ensuite, non, c'est clair qu'avec l'échappement ça ne matchera jamais.

          EDIT : à ignorer, nos posts se sont "croisés"

          -
          Edité par julp 4 février 2021 à 13:53:39

          • Partager sur Facebook
          • Partager sur Twitter

          BindValue sur un select avec SQL

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown