|
|
|
| Добрый день! Хочу уточнить, правильно ли я понимаю принцип как php и mysql экранируют кавычки.
Если где-то ошибаюсь, поправьте пожалуйста.
Допустим есть вот такая строка:
После обработки mysql_escape_string строка будет выглядеть вот так:
$str = mysq_escape_string($str);
echo $str; // O \' Reilly
|
Далее, если я выполню вот такой запрос:
$query = "SELECT * FROM test WHERE name = '$str' ";
|
То mysql получит его вот в таком виде:
SELECT * FROM test WHERE name = O \' Reilly
|
Далее mysql видит, что перед одинарной кавычкой стоит обратный слеш, и поэтому ищет записи, где поле name имеет значение O ' Reilly, а не O \' Reilly.
Т.е. mysql от php получает на обработку запрос SELECT * FROM test WHERE name = O \' Reilly и сам принимает решение о том, какую роль тут играет обратный слеш и одинарная кавычка. php после передачи mysql серверу вот этого запроса SELECT * FROM test WHERE name = O \' Reilly на кавычку и обратный слеш никакого влияния не оказывает. | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(12.02.2010 в 14:02)
| | >Добрый день! Хочу уточнить, правильно ли я понимаю принцип как php и mysql экранируют кавычки.
>Если где-то ошибаюсь, поправьте пожалуйста.
>Допустим есть вот такая строка:
>
>
>После обработки mysql_escape_string строка будет выглядеть вот так:
>
$str = mysq_escape_string($str);
>echo $str; // O \' Reilly
|
>
>Далее, если я выполню вот такой запрос:
>
$query = "SELECT * FROM test WHERE name = '$str' ";
|
Это не запрос . Это php-код.
Если Вы и вправду хотите разобраться - напишите именно запрос, в виде echo $query
>То mysql получит его вот в таком виде:
>
SELECT * FROM test WHERE name = O \' Reilly
|
нет. | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2010 в 14:42)
| | Тогда сначала уточню на счет того, какой запрос попадет mysql серверу в результате выполнения вот такого скрипта:
<?php
$str = "O ' Reilly";
$str = mysq_escape_string($str);
$query = "SELECT * FROM test WHERE name = '$str' ";
mysql_query($query);
?>
|
Какой в итоге запрос получит сервер? | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(12.02.2010 в 15:39)
| | Я уже сказал.
mysql_query замените на echo | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2010 в 15:54)
| | Так, доперло))
Запрос будет вот такой:
SELECT * FROM test WHERE name = 'O \' Reilly';
|
mysql обработает конструкцию \' и в результате выведет все записи из таблицы, где name = 0 ' Reilly | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(12.02.2010 в 16:03)
| | MySQL не станет обрабатыват конструкцию \'
MySQL будет работать с литеральной строкой 'O \' Reilly'
Что из себя представляет содержимое такой строки, можно (очень грубо говоря) посмотреть тем же приемом. echo 'O \' Reilly';
Можно и не очень грубо, а абсолютно корректно (в SQL-клиенте) сделать то же самое: SELECT 'O \' Reilly';
Смотрите. | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2010 в 16:19)
| | Но в процессе работы MySQL будет сравнивать значения поля name со строкой
а не со строкой
Верно? | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(12.02.2010 в 16:25)
| | >Но в процессе работы MySQL будет сравнивать значения поля name со строкой
>
>а не со строкой
>
>Верно?
А где (какой программой) Вы получили второй вариант? | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2010 в 16:26)
| | Второй вариант я сам напечатал, специально, чтобы показать неправильный вариант. Я в SQL клиенте поэкспериментировал с различными запросами и разобрался что к чему)
Спасибо за совет! | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(12.02.2010 в 16:30)
| | Значит Вы теперь вполне можете напечатать, какой оператор выдаст Вам Ваш второй вариант. | |
|
|
|