Forum Programmation.SQL Mysql : insertion de simple quotes depuis bash

Posté par  .
Étiquettes : aucune
0
5
fév.
2008
Bonsoir à tous,

J'ai un petit problème (sûrement classique) et je n'en trouve pas la solution :

Depuis un script bash, je cherche à insérer des données dans une table mysql en procédant comme suit :


mysql -u xxx -pxxx photos -e"INSERT INTO p_photos (p_filename,p_path,p_checksum,p_exifdate) VALUES ('${filename}','${path}','${checksum}','${formatted_date}')"


Tout se passe très bien jusqu'au moment ou la variable filename contient une simple quote.
Comment dois-je protéger ce caractère afin d'éviter de me voir jeter une erreur de syntaxe à la face ?

Merci d'avance pour vos conseils...
  • # quote ?

    Posté par  . Évalué à 1.

    Salut,

    Je n'ai pas bcp d'expérience avec mysql.
    Mais j'essaie :-)
    Pourquoi pas un insert ... select en utilisant la fonction quote() .
    ->
    http://dev.mysql.com/doc/refman/5.0/fr/string-functions.html
    • [^] # Re: quote ?

      Posté par  . Évalué à 1.

      Bonjour,

      Puisque le lien fourni par stillbsd nous dit qu'il suffit de backslasher,
      dans l'esprit de la fonction mysql quote, il y a des choses possibles en Perl mais
      pour rester en Bourne Shell, je te propose cet exemple :

      filename="Don't, don't worry...";echo $filename;echo "${filename}"|sed "s/'/\\\'/g" >/tmp/taztoo;cat /tmp/taztoo
      Don't, don't worry...
      Don\'t, don\'t worry..

      --> Tu peux construire ta requête, la mettre dans un fichier temporaire.sql et le faire exécuter par myqsl
      Extrait du man :
      You can execute SQL statements in a script file (batch file) like this:
      shell> mysql db_name < script.sql > output.tab


      Ah! Il reste un "cas pourri" : si tu dois filtrer aussi les "...
      sh-3.1$ filename="Don't do it"
      sh-3.1$ path=' "pourri des hanetons" '
      sh-3.1$ checksum=1789
      sh-3.1$ formatted_date='28 aout 1664'
      sh-3.1$ sed -e "s/'/\\\'/g" -e 's/"/\\\"/g' <<UNE_SEQUENCE_DE_CARACTERES_QUI_TERMINE_L_ENTREE_ASYNCHRONE
      > INSERT INTO p_photos (p_filename,p_path,p_checksum,p_exifdate) VALUES (\\'${filename}\\',\\'${path}\\',\\'${checksum}\\',\\'${formatted_date}\\')
      > UNE_SEQUENCE_DE_CARACTERES_QUI_TERMINE_L_ENTREE_ASYNCHRONE
      INSERT INTO p_photos (p_filename,p_path,p_checksum,p_exifdate) VALUES (\\'Don\'t do it\\',\\' \"pourri des hanetons\" \\',\\'1789\\',\\'28 aout 1664\\')
      sh-3.1$

      ...Ca c'est facilement extensible à d'autres cas...

      Voili, voilà... Bon courage pour la suite, teste tout les cas pourris, surtout si ça doit aller en production ensuite, et plus encore si c'est exposé au Web...

      Qui dit mieux ?
      • [^] # Re: quote ?

        Posté par  (site web personnel) . Évalué à 2.

        Moi je te conseille plutôt de remplacer ' par '' (deux simple quotes) comme c'est prévu dans la norme SQL (il me semble).

        Pour cela, je vois:


        test="ab'cd'ef"
        echo "SELECT toto IN table WHERE test='${test//'/''}'"
        SELECT toto IN table WHERE test='ab''cd''ef'

        Mais cela ne doit marcher qu'avec bash (et zsh). Cela évite d'utiliser sed qui est plus lent.


        Comme j'oublie toujours ces opérateurs bien pratiques, en voila une liste:
        http://www.gnu.org/software/bash/manual/bashref.html#Shell-P(...)
        • [^] # Re: quote ?

          Posté par  . Évalué à 1.

          Merci à tous !

          C'est Mildred qui a vu la solution au plus simple.
          J'avais effectivement trouvé cette histoire de doublement de la quote dans la journée au boulot (Ah bravo !).

          Ca fonctionne impeccable... Merci encore.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.