URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7467
[ Назад ]

Исходное сообщение
"экранирование кавычек в sql-запросе"

Отправлено GHopper , 09-Июл-08 08:20 
Здравствуйте!
Есть некоторый sh-скрипт:
...
echo "select field FROM ttt WHERE name='$name';" | mysql --user=admin --host=localhost --database=test --password=**** | grep -v 'field'
...

Все работает, но до тех пор, пока в переменной $name не появится символ "'". Как обойти проблему?


Содержание

Сообщения в этом обсуждении
"экранирование кавычек в sql-запросе"
Отправлено Vitaly_loki , 09-Июл-08 08:50 
>Здравствуйте!
>Есть некоторый sh-скрипт:
>...
>echo "select field FROM ttt WHERE name='$name';" | mysql --user=admin --host=localhost --database=test
>--password=**** | grep -v 'field'
>...
>
>Все работает, но до тех пор, пока в переменной $name не появится
>символ "'". Как обойти проблему?

Обратный слеш "\"


"экранирование кавычек в sql-запросе"
Отправлено GHopper , 09-Июл-08 09:00 
>[оверквотинг удален]
>>Есть некоторый sh-скрипт:
>>...
>>echo "select field FROM ttt WHERE name='$name';" | mysql --user=admin --host=localhost --database=test
>>--password=**** | grep -v 'field'
>>...
>>
>>Все работает, но до тех пор, пока в переменной $name не появится
>>символ "'". Как обойти проблему?
>
>Обратный слеш "\"

ну так понятно, что обратный слеш. Как его поставить туда? В PHP есть функция addslashes(), а вот на shell... Тут-то функции такой нету. А как замену в строке сделать - не могу придумать.


"экранирование кавычек в sql-запросе"
Отправлено phpcoder , 09-Июл-08 09:24 
>А как замену в строке сделать - не могу придумать.

Например, так:

[c0der@xxx ~]$ echo "string with ' symbol" | sed "s|'|\\\'|g"
string with \' symbol


"экранирование кавычек в sql-запросе"
Отправлено GHopper , 09-Июл-08 11:16 
>>А как замену в строке сделать - не могу придумать.
>
>Например, так:
>
>[c0der@xxx ~]$ echo "string with ' symbol" | sed "s|'|\\\'|g"
>string with \' symbol

А вот какая загагулина:
echo $line | sed "s|'|\\\'|g" - работает норм;
var=`echo $line | sed "s|'|\\\'|g"` - присваевает переменной var значение $line (sed не выполняется).
Ничего не понимаю...


"экранирование кавычек в sql-запросе"
Отправлено zbl , 09-Июл-08 11:54 
>echo $line | sed "s|'|\\\'|g" - работает норм;
>var=`echo $line | sed "s|'|\\\'|g"` - присваевает переменной var значение $line (sed
>не выполняется).
>Ничего не понимаю...

Надо так:
line="kfkfkl ' jfjfkfkf"
var=$(echo $line | sed "s|'|\\\'|g")
echo $var
выведется:
kfkfkl \' jfjfkfkf


"экранирование кавычек в sql-запросе"
Отправлено zbl , 09-Июл-08 12:03 
>var=`echo $line | sed "s|'|\\\'|g"` - присваевает переменной var значение $line (sed
>не выполняется).
>Ничего не понимаю...

Тут дело в двух парах ковычек: одна ``, другая "".
Если `` обязательны вместо $(), то нужно писать так:
var=`echo $line | sed "s|'|\\\\\'|g"`
Только пять слешей будут работать правильно.


"экранирование кавычек в sql-запросе"
Отправлено GHopper , 09-Июл-08 12:06 
спасибо, добрые люди! ;)

"экранирование кавычек в sql-запросе"
Отправлено sasha , 20-Июл-09 18:19 
>>var=`echo $line | sed "s|'|\\\'|g"` - присваевает переменной var значение $line (sed
>>не выполняется).
>>Ничего не понимаю...
>
>Тут дело в двух парах ковычек: одна ``, другая "".
>Если `` обязательны вместо $(), то нужно писать так:
>var=`echo $line | sed "s|'|\\\\\'|g"`
>Только пять слешей будут работать правильно.

Объясни, пожалуйста, почему именно пять слешей?