Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Экранирование кавычек
 
 автор: Alexey_Tihonenko   (12.02.2010 в 14:02)   письмо автору
 
 

Добрый день! Хочу уточнить, правильно ли я понимаю принцип как php и mysql экранируют кавычки.
Если где-то ошибаюсь, поправьте пожалуйста.
Допустим есть вот такая строка:
$str = "O ' Reilly";


После обработки 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 на кавычку и обратный слеш никакого влияния не оказывает.

  Ответить  
 
 автор: Trianon   (12.02.2010 в 14:42)   письмо автору
 
   для: Alexey_Tihonenko   (12.02.2010 в 14:02)
 

>Добрый день! Хочу уточнить, правильно ли я понимаю принцип как php и mysql экранируют кавычки.
>Если где-то ошибаюсь, поправьте пожалуйста.
>Допустим есть вот такая строка:
>
$str = "O ' Reilly";

>
>После обработки 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

нет.

  Ответить  
 
 автор: Alexey_Tihonenko   (12.02.2010 в 15:39)   письмо автору
 
   для: 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);
?>


Какой в итоге запрос получит сервер?

  Ответить  
 
 автор: Trianon   (12.02.2010 в 15:54)   письмо автору
 
   для: Alexey_Tihonenko   (12.02.2010 в 15:39)
 

Я уже сказал.
mysql_query замените на echo

  Ответить  
 
 автор: Alexey_Tihonenko   (12.02.2010 в 16:03)   письмо автору
 
   для: Trianon   (12.02.2010 в 15:54)
 

Так, доперло))
Запрос будет вот такой:
SELECT * FROM test WHERE name = 'O \' Reilly';


mysql обработает конструкцию \' и в результате выведет все записи из таблицы, где name = 0 ' Reilly

  Ответить  
 
 автор: Trianon   (12.02.2010 в 16:19)   письмо автору
 
   для: Alexey_Tihonenko   (12.02.2010 в 16:03)
 

MySQL не станет обрабатыват конструкцию \'
MySQL будет работать с литеральной строкой 'O \' Reilly'
Что из себя представляет содержимое такой строки, можно (очень грубо говоря) посмотреть тем же приемом. echo 'O \' Reilly';

Можно и не очень грубо, а абсолютно корректно (в SQL-клиенте) сделать то же самое: SELECT 'O \' Reilly';

Смотрите.

  Ответить  
 
 автор: Alexey_Tihonenko   (12.02.2010 в 16:25)   письмо автору
 
   для: Trianon   (12.02.2010 в 16:19)
 

Но в процессе работы MySQL будет сравнивать значения поля name со строкой
O ' Reilly

а не со строкой
O  \'  Reilly

Верно?

  Ответить  
 
 автор: Trianon   (12.02.2010 в 16:26)   письмо автору
 
   для: Alexey_Tihonenko   (12.02.2010 в 16:25)
 

>Но в процессе работы MySQL будет сравнивать значения поля name со строкой
>
O ' Reilly

>а не со строкой
>
O  \'  Reilly

>Верно?

А где (какой программой) Вы получили второй вариант?

  Ответить  
 
 автор: Alexey_Tihonenko   (12.02.2010 в 16:30)   письмо автору
 
   для: Trianon   (12.02.2010 в 16:26)
 

Второй вариант я сам напечатал, специально, чтобы показать неправильный вариант. Я в SQL клиенте поэкспериментировал с различными запросами и разобрался что к чему)
Спасибо за совет!

  Ответить  
 
 автор: Trianon   (12.02.2010 в 18:05)   письмо автору
 
   для: Alexey_Tihonenko   (12.02.2010 в 16:30)
 

Значит Вы теперь вполне можете напечатать, какой оператор выдаст Вам Ваш второй вариант.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования