На странице произошла ошибка #S51. Свяжитесь с вебмастером.На странице произошла ошибка #S51. Свяжитесь с вебмастером. PHP 5.6 и PHP 7 на русском: (none)

mysqli::real_escape_string

mysqli_real_escape_string

(PHP 5)

mysqli::real_escape_string -- mysqli_real_escape_string Экранирует специальные символы в строке для использования в SQL выражении, используя текущий набор символов соединения

Описание

Объектно-ориентированный стиль

string mysqli::escape_string ( string $escapestr )
string mysqli::real_escape_string ( string $escapestr )

Процедурный стиль

string mysqli_real_escape_string ( mysqli $link , string $escapestr )

Эта функция используется для создания допустимых в SQL строк, которые можно использовать в SQL выражениях. Заданная строка кодируется в экранированную SQL строку, используя текущий набор символов подключения.

Предостережение

Безопасность: набор символов по умолчанию

Набор символов должен быть задан либо на стороне сервера, либо с помощью API функции mysqli_set_charset(). В противном случае mysqli_real_escape_string() работать не будет. За дополнительной информацией обращайтесь к документации наборы символов.

Список параметров

link

Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()

escapestr

Строка, которую требуется экранировать.

Экранируемые символы NUL (ASCII 0), \n, \r, \, ', ", и Control-Z.

Возвращаемые значения

Возвращает экранированную строку.

Примеры

Пример #1 Пример использования mysqli::real_escape_string()

Объектно-ориентированный стиль

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");

$city "'s Hertogenbosch";

/* этот запрос вызовет ошибку, так как мы не экранировали $city */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("Ошибка: %s\n"$mysqli->sqlstate);
}

$city $mysqli->real_escape_string($city);

/* этот запрос отработает нормально */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("%d строк вставлено.\n"$mysqli->affected_rows);
}

$mysqli->close();
?>

Процедурный стиль

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

mysqli_query($link"CREATE TEMPORARY TABLE myCity LIKE City");

$city "'s Hertogenbosch";

/* этот запрос вызовет ошибку, так как мы не экранировали $city */
if (!mysqli_query($link"INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("Ошибка: %s\n"mysqli_sqlstate($link));
}

$city mysqli_real_escape_string($link$city);

/* этот запрос отработает нормально */
if (mysqli_query($link"INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("%d строк вставлено.\n"mysqli_affected_rows($link));
}

mysqli_close($link);
?>

Результат выполнения данных примеров:

Ошибка: 42000
1 строк вставлено.

Примечания

Замечание:

Тем, кто привык использовать функцию mysql_real_escape_string(), следует обратить внимание, что аргументы mysqli_real_escape_string() отличаются от аргументов mysql_real_escape_string(). Идентификатор link в mysqli_real_escape_string() идет первым, в то время как в mysql_real_escape_string() первой идет экранируемая строка.

Смотрите также

  • mysqli_set_charset() - Задает набор символов по умолчанию
  • mysqli_character_set_name() - Возвращает кодировку по умолчанию, установленную для соединения с БД

Коментарии

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.
2004-10-07 12:05:22
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html
Автор:
For percent sign and underscore I use this:
<?php
$more_escaped 
addcslashes($escaped'%_');
?>
2010-02-26 08:14:00
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html
Автор:
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.
2011-02-25 09:48:13
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html
Автор:
If you wonder why (besides \, ' and ")  NUL (ASCII 0), \n, \r, and Control-Z are escaped: it is not to prevent sql injection, but to prevent your sql logfile to get unreadable.
2015-03-25 23:20:02
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html
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

<?php
/**
 * 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 = "
27 = '
5C = \

Note: preg_replace() is in PCRE_UTF8 (UTF-8) mode (`u`).

Enhanced version:

When escaping strings for `LIKE` syntax, remember that you also need to escape the special characters _ and %

So this is a more fail-safe version (even when compared to mysqli::real_escape_string, because % characters in user input can cause unexpected results and even security violations via SQL injection in LIKE statements):

<?php

/**
 * 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:

25 = %
5F = _

Bonus function:

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.

<?php
// Modified from: https://stackoverflow.com/a/24672780/2726557
function mysql_utf8_sanitizer(string $str)
{
    return 
preg_replace('/[\x{10000}-\x{10FFFF}]/u'"\xEF\xBF\xBD"$str);
}
?>

Pick your poison and use at your own risk!
2017-07-19 23:22:46
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html
Caution when escaping the % and _ wildcard characters. According to an often overlooked note at the bottom of:
 
https://dev.mysql.com/doc/refman/5.7/en/string-literals.html#character-escape-sequences

the escape sequences \% and \_ will ONLY be interpreted as % and _, *if* they occur in a LIKE! (Same for MySQL 8.0)

In regular string literals, the escape sequences \% and \_ are treated as those two character pairs. So if those escape sequences appear in a WHERE "=" instead of a WHERE LIKE, they would NOT match a single % or _ character!

Consequently, one MUST use two "escape" functions: The real-escape-string (or equivalent) for regular string literals, and an amended escape function JUST for string literals that are intended to be used in LIKE.
2021-03-30 19:45:17
http://php5.kiev.ua/manual/ru/mysqli.real-escape-string.html

    Поддержать сайт на родительском проекте КГБ