mysqli_real_escape_string
mysqli::real_escape_string — mysqli::escape_string — mysqli_real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
Описание
Эта функция используется для создания допустимых в SQL строк, которые можно использовать в SQL выражениях. Заданная строка кодируется для создания экранированной строки SQL с учётом текущего набора символов подключения.
Безопасность: набор символов по умолчанию
Набор символов должен быть задан либо на стороне сервера, либо с помощью API-функции mysqli_set_charset() . В противном случае mysqli_real_escape_string() работать не будет. За дополнительной информацией обращайтесь к документации наборы символов.
Список параметров
Только для процедурного стиля: объект mysqli , полученный с помощью mysqli_connect() или mysqli_init() .
Строка, которую требуется экранировать.
Экранируемые символы NUL (ASCII 0), \n, \r, \, ‘, «, и Control-Z .
Возвращаемые значения
Возвращает экранированную строку.
Примеры
Пример #1 Пример использования mysqli::real_escape_string()
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );
/* этот запрос с экранированным $city будет работать */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» ,
$mysqli -> real_escape_string ( $city ));
$result = $mysqli -> query ( $query );
printf ( «Возвращённые строки: %d.\n» , $result -> num_rows );
/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» , $city );
$result = $mysqli -> query ( $query );
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );
/* этот запрос с экранированным $city будет работать */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» ,
mysqli_real_escape_string ( $mysqli , $city ));
$result = mysqli_query ( $mysqli , $query );
printf ( «Возвращённые строки: %d.\n» , mysqli_num_rows ( $result ));
/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» , $city );
$result = mysqli_query ( $mysqli , $query );
Результатом выполнения данных примеров будет что-то подобное:
Возвращённые строки: 1. Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's-Hertogenbosch'' at line 1 in.
Смотрите также
User Contributed Notes 7 notes
You can avoid all character escaping issues (on the PHP side) if you use prepare() and bind_param(), as an alternative to placing arbitrary string values in SQL statements. This works because bound parameter values are NOT passed via the SQL statement syntax.
Note that this function will NOT escape _ (underscore) and % (percent) signs, which have special meanings in LIKE clauses.
As far as I know there is no function to do this, so you have to escape them yourself by adding a backslash in front of them.
Presenting several UTF-8 / Multibyte-aware escape functions.
These functions represent alternatives to mysqli::real_escape_string, as long as your DB connection and Multibyte extension are using the same character set (UTF-8), they will produce the same results by escaping the same characters as mysqli::real_escape_string.
This is based on research I did for my SQL Query Builder class:
https://github.com/twister-php/sql
/**
* Returns a string with backslashes before characters that need to be escaped.
* As required by MySQL and suitable for multi-byte character sets
* Characters encoded are NUL (ASCII 0), \n, \r, \, ‘, «, and ctrl-Z.
*
* @param string $string String to add slashes to
* @return $string with `\` prepended to reserved characters
*
* @author Trevor Herselman
*/
if ( function_exists ( ‘mb_ereg_replace’ ))
function mb_escape ( string $string )
return mb_ereg_replace ( ‘[\x00\x0A\x0D\x1A\x22\x27\x5C]’ , ‘\\\0’ , $string );
>
> else function mb_escape ( string $string )
return preg_replace ( ‘~[\x00\x0A\x0D\x1A\x22\x27\x5C]~u’ , ‘\\\$0’ , $string );
>
>
?>
Characters escaped are (the same as mysqli::real_escape_string):
00 = \0 (NUL)
0A = \n
0D = \r
1A = ctl-Z
22 default»>
/**
* Returns a string with backslashes before characters that need to be escaped.
* As required by MySQL and suitable for multi-byte character sets
* Characters encoded are NUL (ASCII 0), \n, \r, \, ‘, «, and ctrl-Z.
* In addition, the special control characters % and _ are also escaped,
* suitable for all statements, but especially suitable for `LIKE`.
*
* @param string $string String to add slashes to
* @return $string with `\` prepended to reserved characters
*
* @author Trevor Herselman
*/
if ( function_exists ( ‘mb_ereg_replace’ ))
function mb_escape ( string $string )
return mb_ereg_replace ( ‘[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]’ , ‘\\\0’ , $string );
>
> else function mb_escape ( string $string )
return preg_replace ( ‘~[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]~u’ , ‘\\\$0’ , $string );
>
>
?>
Additional characters escaped:
The original MySQL `utf8` character-set (for tables and fields) only supports 3-byte sequences.
4-byte characters are not common, but I’ve had queries fail to execute on 4-byte UTF-8 characters, so you should be using `utf8mb4` wherever possible.
However, if you still want to use `utf8`, you can use the following function to replace all 4-byte sequences.
Оформление SQL запросов в PHP
Доброго времени суток.
Решил рассказать о том, как я оформляю SQL запросы в PHP.
Итак каким критериям должен удовлетворять мой запрос:
1. Удобочитаемость
2. Возможность комментировать каждое действие в запросе
3. Возможность исключить одну из таблиц или действий при помощи комментария, не удаляя ничего из запроса
Вот пример запроса SELECT:
$sql = «SELECT m.id, m.text»
.», u.name, u.email»
.» FROM messages m»
.» LEFT JOIN users u ON u.id=m.user_id»
.» WHERE m.status=0″
.» AND u.id='».$user_id.»‘»
.» ORDER BY m.date»
.» LIMIT 10″
;
Итак каких правил оформления я придерживаюсь:
1. Каждый оператор находится на отдельной строке
2. Каждая страка заключается в «.» «», что дает возможность комментирования как любого действия
$sql = «SELECT m.id, m.text» // Выбираю ID и текст сообщения
.», u.name, u.email» // Выбираю имя и email пользователя
.» FROM messages m» // Таблица сообщений
.» LEFT JOIN users u ON u.id=m.user_id»
.» WHERE m.status=0″ // Со статусом 0 (прочитанные)
.» AND u.id='».$user_id.»‘» // Пользователя с указанным ID
.» ORDER BY m.date» // Сортировка по дате добавления сообщения
.» LIMIT 10″ // Выбираем 10 записей
;
так и отключения одной из строк запроса
$sql = «SELECT m.id, m.text»
.», u.name, u.email»
.» FROM messages m»
.» LEFT JOIN users u ON u.id=m.user_id»
.» WHERE m.status=0″
.» AND u.id='».$user_id.»‘»
// .» ORDER BY m.date»
.» LIMIT 10″
;
3. Любое обращение к таблице разделяется на отдельные строки с группировкой по таблицам, что дает возможность комментарием убрать одну из таблиц
$sql = «SELECT m.id, m.text»
// .», u.name, u.email»
.» FROM messages m»
// .» LEFT JOIN users u ON u.id=m.user_id»
.» WHERE m.status=0″
// .» AND u.id='».$user_id.»‘»
.» ORDER BY m.date»
.» LIMIT 10″
;
4. После «.»», перед операторами ставится пробел
.» FROM messages m»
а в
.», u.name, u.email»
запятая, что придает каждой строке назависимость от других.
Возможно кому-то покажется данный способ сложным и не привычным, но как показала практика, привыкнув к такому способу оформления запросов производительность разработки увеличивается в разы.
P.S. Не получилось показать оформленный запрос с табуляциями, увы не нашел как это делается