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 stillbsd . Évalué à 1.
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 tguez . Évalué à 1.
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 Mildred (site web personnel) . Évalué à 2.
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 bugjargal . Évalué à 1.
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.