Php строки запроса sql

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. Не получилось показать оформленный запрос с табуляциями, увы не нашел как это делается

Источник

Читайте также:  Python module shared object
Оцените статью