The mysqli class

Содержание:

  • HTML
    • Что такое HTML
    • <!DOCTYPE>
    • Мета теги в <head>
    • Тег <base>
    • Текст в html
    • HTML списки
    • Ссылки
    • Картинки на сайте
    • Таблицы
    • Фреймы
    • Формы
    • DHTML
    • Музыка
    • Видео
    • Карты изображений
    • SVG карты
    • Графика в HTML
    • SSI .shtml
    • Таблица цветов RGB
    • Правильноесочетание цветов
    • Таблица«безопасных»цветов
    • Таблица символов
    • Примеры HTML, CSS
  • CSS
    • Таблицы стилей CSS
    • Свод стилей
    • Псевдоклассы CSS
    • Псевдоэлементы CSS
    • CSS-градиент
    • Flexbox
    • Адаптивная верстка
    • @media screen
  • JavaScript
    • Описание языка
    • Методы и функции
    • Объекты
    • Строки
    • Формы
    • Фреймы и окна
    • Регулярныевыражения
    • Условнаякомпиляция
    • Примеры скриптов
    • Отладка
    • Оптимизация
    • Игры на JS
    • CSS из JS
  • PHP + MySQL
    • Введение в PHP
    • Основы языка
    • Использованиемассивов
    • $_server
    • Создание функций
    • Строки
    • Функции работысо строками
    • Объектноепрограммирование
    • Формы
    • Файлы
    • Загрузка файлов на сервер
    • MySQL
      • Дата, время MySQL
      • Вопросы по MySQL
    • Cookie
    • htaccess
    • Безопасность
    • Сессии
    • Отправка почты
    • Кэширование
    • Дата, время
    • Математическиефункции
    • Дополнительныевозможности
    • Регулярныевыражения
    • Библиотека Curl
    • IMAP, POP3, NNTP
    • Оптимизация
    • Примеры скриптов
  • XML + XSLT
  • AJAX
    • Знакомство с Ajax
    • ОбъектXMLHttpRequest
    • СозданиеAjax-приложения
    • Отправка формы
    • Области применения
    • Ajax примеры
    • АльтернативныеAjax-у методы
    • Ошибки Ajax
    • Навигация на AJAX
  • Графика CorelDRAW
    • Типы графики
    • Пакет CorelDRAW GS
    • Зимняя картинка
    • Осколок стекла
  • SEO
    • Анализ сайта
    • WEB продвижение(оптимизация)
    • Информацияо домене
    • Информация обIP-адресе
    • Ping поисковыхсистем
    • Robots.txt
    • meta Robots
    • Каталоги ипоисковики
    • Особенности SAPE
    • Page Rank
    • Сервис созданияссылок
    • О Контекстнойрекламе
  • Сервисы
  • Разное
    • Движки сайтов (CMS)
    • Хостинг
    • Настройка DNS
    • ADSL
    • RSS
    • ActiveX и HTML
    • Паролированиестраницы
    • HTTP коды
    • HTTP протокол
    • HTTP заголовки
    • Прячем ссылки
    • Черный списоксайтов
    • ☭ Заработокв интернете
    • Термины иопределения
    • Продажа доменов
    • НастройкиЯндекс-почты
    • Кнопки социалок
    • Настроки SIPв телефоне
    • Созданиепоискового плугина
    • Сервискоротких ссылок
    • Telegram: бот, ссылки.
    • Друзья
    • Статьи Liex
    • Задания к л/р
    • Примерызачетных задач
  • Статьи, обзоры
    • Шаблоны сайтов
    • Новости

Содержание

  • mysqli::$affected_rows — Получает число строк, затронутых предыдущей операцией MySQL
  • mysqli::autocommit — Включает или отключает автоматическую фиксацию изменений базы данных
  • mysqli::begin_transaction — Стартует транзакцию
  • mysqli::change_user — Позволяет сменить пользователя подключенного к базе данных
  • mysqli::character_set_name — Возвращает кодировку по умолчанию, установленную для соединения с БД
  • mysqli::close — Закрывает ранее открытое соединение с базой данных
  • mysqli::commit — Фиксирует текущую транзакцию
  • mysqli::$connect_errno — Возвращает код ошибки последней попытки соединения
  • mysqli::$connect_error — Возвращает описание последней ошибки подключения
  • mysqli::__construct — Устанавливает новое соединение с сервером MySQL
  • mysqli::debug — Выполняет процедуры отладки
  • mysqli::dump_debug_info — Журналирование отладочной информации
  • mysqli::$errno — Возвращает код ошибки последнего вызова функции
  • mysqli::$error_list — Возвращает список ошибок выполнения последней запущенной команды
  • mysqli::$error — Возвращает строку с описанием последней ошибки
  • mysqli::$field_count — Возвращает число столбцов, затронутых последним запросом
  • mysqli::get_charset — Возвращает объект, описывающий кодировку
  • mysqli::$client_info — Получает информацию о клиенте MySQL
  • mysqli::$client_version — Возвращает информацию о клиенте MySQL в виде строки
  • mysqli::get_connection_stats — Возвращает статистику соединения с клиентом
  • mysqli::$host_info — Возвращает строку, содержащую тип используемого соединения
  • mysqli::$protocol_version — Возвращает версию используемого MySQL протокола
  • mysqli::$server_info — Возвращает версию MySQL сервера
  • mysqli::$server_version — Возвращает версию сервера MySQL, представленную в виде integer
  • mysqli::get_warnings — Получает результат SHOW WARNINGS
  • mysqli::$info — Извлекает информацию о последнем выполненном запросе
  • mysqli::init — Инициализирует MySQLi и возвращает ресурс для использования в функции mysqli_real_connect()
  • mysqli::$insert_id — Возвращает автоматически генерируемый ID, используя последний запрос
  • mysqli::kill — Запрос для сервера завершить выполнение процесса MySQL
  • mysqli::more_results — Проверка, есть ли еще результаты в мультизапросе
  • mysqli::multi_query — Выполняет запрос к базе данных
  • mysqli::next_result — Подготовка следующего доступного результирующего набора из multi_query
  • mysqli::options — Установка настроек
  • mysqli::ping — Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано
  • mysqli::poll — Опрос подключений
  • mysqli::prepare — Подготавливает SQL выражение к выполнению
  • mysqli::query — Выполняет запрос к базе данных
  • mysqli::real_connect — Устанавливает соединение с сервером mysql
  • mysqli::real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
  • mysqli::real_query — Выполнение SQL запроса
  • mysqli::reap_async_query — Получение результата асинхронного запроса
  • mysqli::refresh — Обновление
  • mysqli::release_savepoint — Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции
  • mysqli::rollback — Откат текущей транзакции
  • mysqli::rpl_query_type — Возвращает RPL тип запроса
  • mysqli::savepoint — Устанавливает именованную точку отката для текущей транзакции
  • mysqli::select_db — Устанавливает базу данных для выполняемых запросов
  • mysqli::send_query — Отправка запроса и возврат
  • mysqli::set_charset — Задает набор символов по умолчанию
  • mysqli::set_local_infile_default — Отмена привязки callback-функции для команды load local infile
  • mysqli::set_local_infile_handler — Задает callback-функцию для команды LOAD DATA LOCAL INFILE
  • mysqli::$sqlstate — Возвращает код состояния SQLSTATE последней MySQL операции
  • mysqli::ssl_set — Используется для установления безопасных соединений, используя SSL
  • mysqli::stat — Получение информации о текущем состоянии системы
  • mysqli::stmt_init — Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare
  • mysqli::store_result — Передает на клиента результирующий набор последнего запроса
  • mysqli::$thread_id — Возвращает ID процесса текущего подключения
  • mysqli::thread_safe — Показывает, безопасна ли работа с процессами
  • mysqli::use_result — Готовит результирующий набор на сервере к использованию
  • mysqli::$warning_count — Возвращает количество предупреждений из последнего запроса заданного подключения

The Saving Grace

So long as you always explicitly set the SQL mode not to include , or quote MySQL string literals using the single-quote character, this bug cannot rear its ugly head: respectively will not be used, or its assumption about which quote characters require repeating will be correct.


For this reason, I recommend that anyone using also enables mode, as it will force habitual use of single-quoted string literals. Note that this does not prevent SQL injection in the event that double-quoted literals happen to be used—it merely reduces the likelihood of that happening (because normal, non-malicious queries would fail).

In PDO, both its equivalent function and its prepared statement emulator call upon —which does exactly this: it ensures that the escaped literal is quoted in single-quotes, so you can be certain that PDO is always immune from this bug.

As of MySQL v5.7.6, this bug has been fixed. See change log:

The Ugly

It gets worse. may not be all that uncommon in the wild owing to the necessity of its use for compatibility with standard SQL (e.g. see section 5.3 of the SQL-92 specification, namely the grammar production and lack of any special meaning given to backslash). Furthermore, its use was explicitly recommended as a workaround to the (long since fixed) bug that ircmaxell’s post describes. Who knows, some DBAs might even configure it to be on by default as means of discouraging use of incorrect escaping methods like .

Also, the is set by the server according to its configuration (which a user can change at any time); thus, to be certain of the server’s behaviour, you must always explicitly specify your desired mode after connecting.

Safe Examples

Taken together with the bug explained by ircmaxell, the following examples are entirely safe (assuming that one is either using MySQL later than 4.1.20, 5.0.22, 5.1.11; or that one is not using a GBK/Big5 connection encoding):

…because we’ve explicitly selected an SQL mode that doesn’t include .

…because we’re quoting our string literal with single-quotes.

…because PDO prepared statements are immune from this vulnerability (and ircmaxell’s too, provided either that you’re using PHP≥5.3.6 and the character set has been correctly set in the DSN; or that prepared statement emulation has been disabled).

…because PDO’s function not only escapes the literal, but also quotes it (in single-quote characters); note that to avoid ircmaxell’s bug in this case, you must be using PHP≥5.3.6 and have correctly set the character set in the DSN.

…because MySQLi prepared statements are safe.

Technical Details

Return Value: Returns the escaped string
PHP Version: 5+

Example — Procedural style

Escape special characters in strings:

<?php $con = mysqli_connect(«localhost»,»my_user»,»my_password»,»my_db»);if (mysqli_connect_errno()) {   echo «Failed to connect to MySQL: » . mysqli_connect_error();  exit(); } // Escape special characters, if any$firstname = mysqli_real_escape_string($con, $_POST); $lastname = mysqli_real_escape_string($con, $_POST);$age = mysqli_real_escape_string($con, $_POST);$sql=»INSERT INTO Persons (FirstName, LastName, Age) VALUES (‘$firstname’, ‘$lastname’, ‘$age’)»;if (!mysqli_query($con, $sql)) {  printf(«%d Row inserted.\n», mysqli_affected_rows($con));}mysqli_close($con); ?>

Некрасиво

это еще хуже. может быть не так уж редко в дикой природе из-за необходимости его использования для совместимости со стандартным SQL (например, см. раздел 5.3 спецификация SQL-92, а именно производство грамматики и отсутствие какого-либо специального значения, придаваемого обратной косой черте). Кроме того, его использование было явно рекомендовано в качестве обходного пути к (давно исправлено) ошибка это сообщение ircmaxell описывает. Кто знает, некоторые DBAs могут даже настроить его по умолчанию как средство предотвращения использования неправильных методов экранирования, таких как .

и устанавливается сервером в соответствии с его конфигурацией (которого пользователь может изменить в любое время); таким образом, чтобы быть уверенным в поведении сервера, вы должны всегда явно указать нужный режим после подключения.

Описание

mysql_real_escape_string

Экранирует специальные символы в unescaped_string, принимая во внимание кодировку соединения, таким образом, что результат можно безопасно использовать в SQL-запросе в функци mysql_query(). Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию. mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ‘, » and \x1a

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ‘, » and \x1a.

Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.

Строка, которая должна быть экранирована.

The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.

Возвращает строку, в которой экранированы все необходимые символы, или FALSE в случае ошибки.

Пример 2. Пример взлома с использованием SQL Injection

Запрос, который будет отправлен в MySQL:

SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''

Это позволит кому угодно войти в систему без пароля.

Пример 3. Лучший вариант составления запроса

Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.

Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.

Описание

Отличное описание приведено в статье на habrahabr.ru :

SQL инъекция — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:

Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:

ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе

Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:

ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете

Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни 🙂 Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.

А теперь рассмотрим реальный пример, взятый с ru.wikipedia.org . Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

# Предыдущий код скрипта...
$id = $_REQUEST'id';
$res = mysql_query("SELECT * FROM news WHERE id_news =".$id);
# Следующий код скрипта...

Если на сервер передан параметр id, равный 5 ( например так: http://example.org/script.php?id=5 ), то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку (например, так: http://example.org/script.php?id=-1+OR+1=1 ), то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно — вычисления происходят по кратчайшему контуру в схеме

Нападение

начиная с демонстрацией…

это вернет все записи из таблица. Вскрытие:

выбор режима SQL

как описано в разделе Строковые Литералы:

если режим SQL сервера включает , затем третий из этих вариантов-который является обычным подходом, принятым — недоступно: вместо этого необходимо использовать один из первых двух вариантов

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

Груз

полезная нагрузка инициирует эту инъекцию буквально с помощью .

Запрос

что-то вроде формальности, отображаемый запрос:. как выразился мой ученый друг: поздравляю, вы только что успешно атаковали программу, используя ..

как выразился мой ученый друг: поздравляю, вы только что успешно атаковали программу, используя …

The Attack

Starting off with a demonstration…

This will return all records from the table. A dissection:

  1. Selecting an SQL Mode

    As documented under String Literals:

    If the server’s SQL mode includes , then the third of these options—which is the usual approach adopted by —is not available: one of the first two options must be used instead. Note that the effect of the fourth bullet is that one must necessarily know the character that will be used to quote the literal in order to avoid munging one’s data.

  2. The Payload

    The payload initiates this injection quite literally with the character. No particular encoding. No special characters. No weird bytes.


  3. mysql_real_escape_string()

    Fortunately, does check the SQL mode and adjust its behaviour accordingly. See :

    Thus a different underlying function, , is invoked if the SQL mode is in use. As mentioned above, such a function needs to know which character will be used to quote the literal in order to repeat it without causing the other quotation character from being repeated literally.

    However, this function arbitrarily assumes that the string will be quoted using the single-quote character. See :

    So, it leaves double-quote characters untouched (and doubles all single-quote characters) irrespective of the actual character that is used to quote the literal! In our case remains exactly the same as the argument that was provided to —it’s as though no escaping has taken place at all.

  4. The Query

    Something of a formality, the rendered query is:

As my learned friend put it: congratulations, you just successfully attacked a program using …

Неэффективные способы защиты от SQL-инъекций

Очевидно, самый худший вариант — не иметь никакой защиты от SQL инъекций и передавать данные, полученные от пользователя, напрямую в SQL-запрос.

Никогда так не делай! Любые данные перед подстановкой в SQL-запрос должны проходить фильтрацию и/или валидацию.

1. Функция htmlspecialchars()

Время от времени встречаю статьи, где авторы используют функцию htmlspecialchars() для экранирования данных:

Это опасно! Штука в том, что функция htmlspecialchars() пропускает без экранирования опасные символы: \ (слеш), \0 (nul-байт) и \b (backspace).

Вот полный пример кода, демонстрирующего уязвимость:

В итоге SQL-запрос будет таким:

С помощью / экранируется кавычка, идущая сразу после $login. `login` = ‘$login’ по факту превращается в `login` = ‘\’ AND `password` = ‘. После этого любой код, который мы напишем, будет выполнен, в нашем случае это просто OR 1=1. В конце добавляем # (комментарий), чтобы скрыть последнюю кавычку.

2. Фильтрация по чёрному списку символов

По каким-то непонятным мне причинам ещё существуют разработчики, использующие чёрные списки символов:

Все символы, входящие в чёрный список, удаляются из строки перед вставкой в базу.

Я не хочу сказать, что этот подход не будет работать, но его применение под большим вопросом:

  • Зачем вообще составлять какие-то списки, если есть более простые и надёжные способы защиты?
  • Нужно знать все потенциально опасные символы.
  • Что делать если нужно разрешить пользователям использовать какие-либо символы из списка?

Кроме этого, я считаю фильтрацию в SQL-запросах плохой идеей. Если в строке есть недопустимые символы — лучше сообщить о них пользователю и попросить исправить, а не просто обрезать часть контента.

К примеру, пользователь хочет использовать логин ~!Mega_!Pihar!_!9000!~, а после регистрации оказывается, что его ник превратился в MegaPihar9000.

Я считаю, лучше уточнить у пользователя, нравится ли ему такой отфильтрованный логин или он хотел бы что-то поменять. Короче, я за валидацию по белому списку вместо фильтрации по чёрному.

3. Функция stripslashes()

Редко, но встречается код, использующий stripslashes() перед записью в базу. Поскольку новички до сих пор копируют этот код в свои проекты, объясню, зачем эта функция нужна.

Раньше в PHP была такая штука как волшебные кавычки (Документация). Если эта директива была включена, то все данные, содержащиеся в $_GET, $_POST и $_COOKIE автоматически экранировались.

Сделано это было для защиты новичков, которые подставляли данные напрямую в SQL-запросы. На практике это было не самое удачное решение:

  • Не очень удобно, когда все данные по-умолчанию экранируются, ведь зачастую они нужны в исходном виде.
  • В идеале экранирование должно учитывать кодировку соединения с базой данных, о чём мы поговорим чуть позже. Из-за этого разработчикам приходилось убирать экранирование функцией stripslashes() и затем опять экранировать данные более подходящими функциями, в случае MySQL это была mysql_real_escape_string().

Вот почему функцию stripslashes() можно встретить в старых учебниках. Чтобы отменить экранирование символов и получить исходную строку.

Начиная с PHP 5.4 функционал волшебных кавычек удалён, поэтому использовать stripslashes() перед записью в базу нет никакого смысла.

4. Функция addslashes()

В некоторых книгах ещё можно встретить рекомендации экранировать данные функцией addslashes().

Эта функция надёжней, чем htmlspecialchars(), поскольку экранирует и обратный слеш, и nul-байт. Однако эта функция хуже, чем mysql_real_escape_string, поскольку не учитывает кодировку текущего соединения с базой.

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

Вырезка из документации про функцию addslashes()

Table of Contents

  • mysqli::$affected_rows — Gets the number of affected rows in a previous MySQL operation
  • mysqli::autocommit — Turns on or off auto-committing database modifications
  • mysqli::begin_transaction — Starts a transaction
  • mysqli::change_user — Changes the user of the specified database connection
  • mysqli::character_set_name — Returns the default character set for the database connection
  • mysqli::close — Closes a previously opened database connection
  • mysqli::commit — Commits the current transaction
  • mysqli::$connect_errno — Returns the error code from last connect call
  • mysqli::$connect_error — Returns a string description of the last connect error
  • mysqli::__construct — Open a new connection to the MySQL server
  • mysqli::debug — Performs debugging operations
  • mysqli::dump_debug_info — Dump debugging information into the log
  • mysqli::$errno — Returns the error code for the most recent function call
  • mysqli::$error_list — Returns a list of errors from the last command executed
  • mysqli::$error — Returns a string description of the last error
  • mysqli::$field_count — Returns the number of columns for the most recent query
  • mysqli::get_charset — Returns a character set object
  • mysqli::$client_info — Get MySQL client info
  • mysqli::$client_version — Returns the MySQL client version as an integer
  • mysqli::get_connection_stats — Returns statistics about the client connection
  • mysqli::$host_info — Returns a string representing the type of connection used
  • mysqli::$protocol_version — Returns the version of the MySQL protocol used
  • mysqli::$server_info — Returns the version of the MySQL server
  • mysqli::$server_version — Returns the version of the MySQL server as an integer
  • mysqli::get_warnings — Get result of SHOW WARNINGS
  • mysqli::$info — Retrieves information about the most recently executed query
  • mysqli::init — Initializes MySQLi and returns a resource for use with mysqli_real_connect()
  • mysqli::$insert_id — Returns the auto generated id used in the latest query
  • mysqli::kill — Asks the server to kill a MySQL thread
  • mysqli::more_results — Check if there are any more query results from a multi query
  • mysqli::multi_query — Performs a query on the database
  • mysqli::next_result — Prepare next result from multi_query
  • mysqli::options — Set options
  • mysqli::ping — Pings a server connection, or tries to reconnect if the connection has gone down
  • mysqli::poll — Poll connections
  • mysqli::prepare — Prepare an SQL statement for execution
  • mysqli::query — Performs a query on the database
  • mysqli::real_connect — Opens a connection to a mysql server
  • mysqli::real_escape_string — Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection
  • mysqli::real_query — Execute an SQL query
  • mysqli::reap_async_query — Get result from async query
  • mysqli::refresh — Refreshes
  • mysqli::release_savepoint — Removes the named savepoint from the set of savepoints of the current transaction
  • mysqli::rollback — Rolls back current transaction
  • mysqli::rpl_query_type — Returns RPL query type
  • mysqli::savepoint — Set a named transaction savepoint
  • mysqli::select_db — Selects the default database for database queries
  • mysqli::send_query — Send the query and return
  • mysqli::set_charset — Sets the default client character set
  • mysqli::set_local_infile_default — Unsets user defined handler for load local infile command
  • mysqli::set_local_infile_handler — Set callback function for LOAD DATA LOCAL INFILE command
  • mysqli::$sqlstate — Returns the SQLSTATE error from previous MySQL operation
  • mysqli::ssl_set — Used for establishing secure connections using SSL
  • mysqli::stat — Gets the current system status
  • mysqli::stmt_init — Initializes a statement and returns an object for use with mysqli_stmt_prepare
  • mysqli::store_result — Transfers a result set from the last query
  • mysqli::$thread_id — Returns the thread ID for the current connection
  • mysqli::thread_safe — Returns whether thread safety is given or not
  • mysqli::use_result — Initiate a result set retrieval
  • mysqli::$warning_count — Returns the number of warnings from the last query for the given link

Спасительная Благодать

пока ты всегда явно установите режим SQL не включать , или цитировать строковые литералы MySQL, используя символ одной кавычки, эта ошибка не может поднять свою уродливую голову: соответственно не будет использоваться, или его предположение о том, какие символы цитаты требуют повторения, будет правильным.

по этой причине я рекомендую всем, кто использует также позволяет mode, так как это заставит привычное использование одинарных строковых литералов

Обратите внимание, что это не предотвращает SQL-инъекцию в случае использования литералов с двойными кавычками-это просто уменьшает вероятность этого (потому что обычные, не вредоносные запросы потерпят неудачу)

в PDO, как его эквивалентная функция и его подготовленный эмулятор заявления призывают -который делает именно это: он гарантирует, что экранированный литерал цитируется в одинарных кавычках, поэтому вы можете быть уверены, что PDO всегда защищен от этой ошибки.

начиная с MySQL v5.7.6, Эта ошибка была исправлена. См.изменение входа:


С этим читают