|
|
|
|
|
для: cheops
(02.08.2008 в 11:20)
| | Спасибо.
>Функций очень много - разобраться со всеми сразу бывает поначалу не просто
что правда, то правда. | |
|
|
|
|
|
|
|
для: Николай2357
(02.08.2008 в 10:05)
| | Функций очень много - разобраться со всеми сразу бывает поначалу не просто, а работать-то надо. Замена одного символа другим решение универсальное для всех языков программирования, поэтому это первое, что приходит в голову. Однако, лучше использовать экранирование - к сожалению, в PHP из-за режима "магических кавычек" (которые будут исключены в PHP 6) - это не всегда просто сделать. | |
|
|
|
|
|
|
|
для: Николай2357
(01.08.2008 в 13:04)
| | Снедает меня нездоровое любопытство, пришлось поднять тему, извините.
По иронии судьбы наткнулся на подобное на этом форуме:
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=14373
Может быть я все таки пропускаю что-то важное?
Спасибо.
PS Не подумайте, что я невнимательно читал ответы, просто всетаки зачем-то это делается иногда? | |
|
|
|
|
|
|
|
для: Trianon
(01.08.2008 в 12:58)
| | Вот это да! Огромное спасибо!
Хорошо, что безграматные люди допускают много ошибок, если бы не опечатка, я долго бы наверное дурью маялся... | |
|
|
|
|
|
|
|
для: Николай2357
(01.08.2008 в 12:32)
| | Чистой воды костыль.
А надо читать вот что:
--------------------------------------------------------------------------------------------------------------------
Справочное руководство по MySQL
6.1.1.1 Cтроки
* 6 Справочник по языку MySQL
o 6.1 Структура языка
+ 6.1.1 Литералы: представление строк и чисел
# 6.1.1.1 Cтроки
# 6.1.1.2 Числа
# 6.1.1.3 Шестнадцатеричные величины
# 6.1.1.4 Значения NULL
|
Previous / Next / Up / Table of Contents
6.1.1.1 Cтроки
Строка представляет собой последовательность символов, заключенных либо в одинарные кавычки (`'') - апострофы, либо в двойные кавычки (`"'). При использовании диалекта ANSI SQL допустимы только одинарные кавычки. Например:
'a string'
"another string"
|
Внутри строки некоторые последовательности символов имеют специальное назначение. Каждая из этих последовательностей начинается обратным слешем (`\'), известным как escape-символ или символ перехода. MySQL распознает следующие escape-последовательности:
\0
Символ 0 (NUL) в ASCII коде.
\'
Символ одиночной кавычки (`'').
\"
Символ двойной кавычки (`"').
\b
Возврат на один символ.
\n
Символ новой строки (перевода строки).
\r
Символ перевода каретки.
\t
Символ табуляции.
\z
Символ (Control-Z) таблицы ASCII(26).
| Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename).
\\
Символ обратного слеша.
\%
Символ процентов `%'.
| Используется для поиска копий литерала `%' в контекстах, где выражение `%' в противном случае интерпретировалось бы как групповой символ (see section
6.3.2.1 Функции сравнения строк).
\`_'
Символ подчеркивания `_'. Используется для поиска копий литерала `_' в контекстах, где выражение `_' в противном случае интерпретировалось бы как групповой символ (see section 6.3.2.1 Функции сравнения строк).
Обратите внимание на то, что при использовании `\%' или `\_' в контекстах некоторых строк будут возвращаться значения строк `\%' и `\_', а не `%' и `_'.
Существует несколько способов включить кавычки в строку:
o Одиночная кавычка (апостроф) `'' внутри строки, заключенной в кавычки `'', может быть записана как `'''.
o Двойная кавычка `"' внутри строки, заключенной в двойные кавычки `"', может быть записана как `""'.
o Можно предварить символ кавычки символом экранирования (`\').
o Для символа `'' внутри строки, заключенной в двойные кавычки, не требуется специальной обработки; его также не требуется дублировать или предварять обратным слешем. Точно так же не требует специальной обработки двойная кавычка `"' внутри строки, заключенной в одиночные кавычки `''.
Ниже показаны возможные варианты применения кавычек и escape-символа на примерах выполнения команды SELECT:
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
|
Если необходимо вставить в строку двоичные данные (такие как BLOB), следующие символы должны быть представлены как escape-последовательности:
NUL
ASCII 0. Необходимо представлять в виде `\0' (обратный слеш и символ ASCII `0').
\
ASCII 92, обратный слеш. Представляется как `\\'.
'
ASCII 39, единичная кавычка. Представляется как `\''.
"
ASCII 34, двойная кавычка. Представляется как `\"'.
|
При написании программы на языке C для добавления символов экранирования в команде INSERT можно использовать функцию mysql_real_escape_string() из C API (see section 8.4.2 Обзор функций интерфейса C). При программировании на Perl можно использовать метод quote из пакета DBI для превращения специальных символов в соответствующие escape-последовательности (see section 8.2.2 Интерфейс DBI).
Не следует забывать, что указанное свойство escape-символа должно использоваться во всех строках, которые могут содержать любые специальные символы, перечисленные выше.
В качестве альтернативы многие интерфейсы прикладного программирования (API) для MySQL предоставляют определенную возможность использования символов-заменителей, что позволяет вносить специальные маркеры в строку запроса и затем связывать с ними значения данных при выдаче результатов запроса. | |
|
|
|
|
|
|
|
для: Trianon
(01.08.2008 в 11:47)
| | Вот дословно, что там написано:
Старайтесь не допускать внесения в базу данных символа одинарной кавычки ("'"), поскольку это служебный символ запросов БД. Перед внесением в базу поле можно обработать функцией str_replace:
$somefield = str_replace("'", "'", $somefield);
|
К тому же это лишний барьер на пути взломщиков вашего сайта. Пример "взлома" простой:
mysql_query("UPDATE users SET password=PASSWORD('$passwd') WHERE login='$login'");
|
Если кавычку не обработать на входе, злоумышленник может в качестве логина сунуть строку "vasya_pupkin' OR login LIKE '%". В базу данных залетит запрос:
mysql_query("UPDATE users SET password=PASSWORD('$passwd') WHERE login='vasya_pupkin' OR login LIKE '%'");
| То есть все пароли будут одинаковые.
Бред? | |
|
|
|
|
|
|
|
для: GeorgeIV
(01.08.2008 в 11:33)
| | Унифицированной , в том смысле что независимо от того, на какой СУБД?
Для этого классы-обертки применяют. Там детали реализации скрываются, наружу вылезает до той или иной степени унифицированный интерфейс. | |
|
|
|
|
|
|
|
для: Trianon
(01.08.2008 в 10:57)
| | я думаю, дело не в том, лучше-хуже, а в единообразии. В возможности какой то унифицированной обработки и т.п., где эти кавычки будут разными. Это из контекста задачи надо исходить. а так , вообще, это просто воздухатрясение | |
|
|
|
|
|
|
|
для: GeorgeIV
(01.08.2008 в 10:42)
| | В Oracle другой способ представления символа кавычки в текстовом литерале. Они там удваиваются перед обрамлением.
В любом случае - менять один символ на другой - бред.
Чем другой символ хуже первого? Его как тогда представлять? | |
|
|
|
|
|
|
|
для: Trianon
(01.08.2008 в 10:17)
| | Возможно имелась ввиду не MySQL. БД Оракл обратные кавычки не принимает (по крайней мере в девелопере точно) | |
|
|
|
|