Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 138 · С нуля → справочник

MySQLi: полный справочник MySQL, запросов и результатов

От первого SELECT до всех функций, методов, свойств, констант, prepared statements, транзакций, CALL, mysqlnd и настройки соединений.

Как запустить любую карточку: файлы, схема и каталог

Все новые карточки используют один небольшой каталог мастерской. Пример можно запускать отдельно: его архив содержит example.php, catalog.php, schema.sql и README. Молоток имеет остаток 8, Перчатки — 15, Кисть — 0. Ноль здесь означает известное отсутствие товара, а не пропавшую строку.

Кто за что отвечает
  1. schema.sql: структура и три известные строки
  2. catalog.php: подключение и создание учебных данных
  3. example.php: один изучаемый механизм
  4. stdout: название товара, остаток или понятный отказ

require выполняет подключаемый PHP-файл. __DIR__ — папка текущего файла, . склеивает строки. SQL в schema.sql описывает таблицу: id отличает товары, name хранит название, stock — целое неотрицательное количество. INSERT заполняет строки. Код подключения показан полностью: никаких скрытых таблиц урок не предполагает.

Нужны собственный локальный MySQL 8.0.16+ и PHP с mysqli/mysqlnd. В этой редакции серверные сценарии MySQL отмечены как проверенные только синтаксически. Ожидаемые строки ниже описывают результат на заданных учебных данных, а не доказательство запуска на MySQL.

Требуется собственный локальный MySQL 8.0.16+ и PHP 8.2+ с mysqli/mysqlnd.
Это отдельная учебная база; запросы к серверу здесь не проверялись, проверен синтаксис PHP.
В MySQL-клиенте администратор создаёт учебное окружение один раз:
CREATE DATABASE php_reference_lesson CHARACTER SET utf8mb4;
CREATE USER 'lesson_user'@'127.0.0.1' IDENTIFIED BY 'replace-with-your-local-password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES ON php_reference_lesson.* TO 'lesson_user'@'127.0.0.1';
Если сервер сопоставляет TCP-подключение другой локальной host-записи пользователя,
используйте согласованные с администратором локальные account/host, не открывайте доступ '%'.
Укажите выбранные учебные параметры в config.php. Файл не помещают в публичный каталог сайта.
Из папки архива: php example.php
catalog.php создаёт TEMPORARY products только в текущем соединении. Схема есть в schema.sql.
Содержимое исчезает после закрытия соединения; существующая постоянная products не изменяется.
Специальный пример может требовать дополнительные права/другую СУБД: читайте его описание.

Сохраните параметры как config.php, а подключение как connect.php. Пароль замените своим локальным учебным паролем; файл не должен попадать в веб-каталог.

<?php
return [
    'host' => '127.0.0.1',
    'port' => 3306,
    'database' => 'php_reference_lesson',
    'user' => 'lesson_user',
    'password' => 'replace-with-your-local-password',
];
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'],
    $config['database'], $config['port']);
$db->set_charset('utf8mb4');

schema.sql

CREATE TEMPORARY TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(80) NOT NULL,
    stock INT NOT NULL CHECK (stock >= 0)
) ENGINE=InnoDB;
INSERT INTO products (id, name, stock) VALUES
    (1, 'Молоток', 8), (2, 'Перчатки', 15), (3, 'Кисть', 0);

catalog.php

<?php
require __DIR__ . '/connect.php';
$db->query('CREATE TEMPORARY TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(80) NOT NULL,
    stock INT NOT NULL CHECK (stock >= 0)
) ENGINE=InnoDB');
$db->query("INSERT INTO products (id, name, stock) VALUES
    (1, 'Молоток', 8), (2, 'Перчатки', 15), (3, 'Кисть', 0)");

Команда php example.php выводит результат в терминал. Для HTML нужен отдельный обработчик и веб-сервер — переход от строк базы к странице каталога. В рабочем сайте создание постоянной схемы выполняют отдельно от посещения страницы; здесь временные исходные данные нужны для воспроизводимого урока.

Фильтр каталога: от подготовки запроса к человеку

После настройки собственного MySQL покажем только товары с остатком хотя бы 1. Три объекта решают три разные задачи: db держит соединение, statement — SQL с входным параметром, result — набор найденных строк.

Фильтр каталога: от подготовки запроса к человеку
  1. config.php/connect.php → соединение MySQL
  2. catalog.php → временные products с 3 товарами
  3. bind_param: i связывает minimum1 с единственным ?
  4. execute → get_result → две строки → вывод названий и остатков

bind_param принимает строку типов i (целое) и переменную, связанную по ссылке. fetch_all(MYSQLI_ASSOC) создаёт небольшой массив с ключами колонок; foreach выводит каждую строку. Оба вида буфера приемлемы для 3 товаров, но требуют отдельного решения для большого каталога.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
foreach ($rows as $row)Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Фильтр каталога: от подготовки запроса к человекуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$minimum = 1;
$statement = $db->prepare('SELECT name, stock FROM products WHERE stock >= ? ORDER BY id');
$statement->bind_param('i', $minimum);
$statement->execute();
$result = $statement->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
$result->free();
$statement->close();
foreach ($rows as $row) {
    echo $row['name'], ' — ', $row['stock'], " шт.
";
}
if ($rows === []) { echo "Подходящих товаров нет
"; }
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Кисть имеет 0 и не проходит stock>=1. Читатель видит найденные записи, а не bool успешного execute. Полная подготовка сервера, схема и данные включены в ZIP; запрос к MySQL в проверочной среде не исполнялся.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.

Проверьте изменение требования. Задание: minimum20 — сообщение «Подходящих товаров нет»; minimum0 — все три товара. Пустой массив не означает ошибку SQL; SQL-ошибка в выбранном режиме вызывает исключение. Следующий шаг — безопасный HTML: экранируйте имя при выводе, как в проверенном HTTP-маршруте каталога.

Почему следующий запрос нельзя начать до завершения предыдущего ответа

При обычном SELECT можно получить один набор строк. CALL способен вернуть несколько наборов плюс завершающий статус. free освобождает текущий набор, а next_result переключает соединение или statement к следующему. Эти действия не взаимозаменяемы.

Один CALL, несколько ответов
  1. CALL → товары: прочитать строки и освободить result
  2. следующий набор → total3: прочитать и освободить
  3. завершающий статус без таблицы → завершить последовательность
  4. теперь соединение готово для нового запроса

Именно переход от двух обычных SELECT к двум CALL вызвал «Commands out of sync» в прочитанном вопросе. Решение зависит от выбранного API: для query/multi_query — методы соединения, для подготовленного CALL — методы statement. Наши примеры содержат сам CREATE PROCEDURE и перечисляют дополнительные права.

Самостоятельная процедура с двумя таблицами результата; Последовательность результатов соединения. Не вставляйте случайный next_result после каждого запроса: сначала определите, выдаёт ли команда несколько результатов, и обработайте ошибки переключения.

Сначала работающий каталог, затем справочник

Если база данных для вас новая тема, начните с последовательного каталога товаров. Там показаны создание файла и таблицы, добавление записей, чтение в массив, foreach, готовая HTML-страница и ошибки каждого этапа. Здесь — подробные возможности MySQLi; их удобнее изучать, когда уже видна общая задача.

Зачем MySQLi: сохранить данные за пределами одного запроса

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

Таблица похожа на картотеку: одна строка — один товар, колонки — поля id, name, price. id помогает отличить записи с одинаковым названием. SQL — язык команд серверу: SELECT читает/вычисляет, INSERT добавляет, UPDATE меняет, DELETE удаляет. Сервер также проверяет ограничения и согласует одновременную работу клиентов; обычный бумажный органайзер этого не делает.

Путь данных. PHP создаёт соединение $db → query отправляет SELECT 42 AS answer → MySQL возвращает одну строку → fetch_assoc создаёт [answer => 42] → echo читает answer.

До кода разберём запись. $db = сохраняет значение в переменную; new mysqli(...) создаёт объект соединения. В круглых скобках адрес, пользователь базы, его пароль, имя базы и порт. -> обращается к методу/свойству объекта. У метода есть скобки: query(...); строка SQL внутри кавычек исполняется сервером MySQL. $row['answer'] берёт поле массива. echo выводит его, "\n" добавляет перевод строки. Первая строка mysqli_report включает понятные исключения при SQL-ошибке; | объединяет два флага. set_charset('utf8mb4') согласует кодировку текста. Эти действия подключения повторяются в контекстных примерах, чтобы код можно было сохранить отдельным файлом.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. SELECT здесь вычисляет число без создания таблицы. AS answer задаёт подпись колонки. query возвращает набор, fetch_assoc переносит одну строку в массив, echo показывает поле answer. Это контекстный пример с учебным сервером, не автономная PHP-база в памяти.

Первое полезное действие: получить значение от базыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS answer');
$row = $result->fetch_assoc();
echo $row['answer'], "\n";
Ожидаемый результат
42

Если эти обозначения новые, рядом есть начальные объяснения: переменная и присваивание, массив, объект и стрелочка, исключение. Следующий шаг — запись настоящего товара и его чтение по ID. Поиск по именам API находится в указателе ниже; он не требует проходить урок заново.

API, расширение, драйвер и сервер: что находится между PHP и таблицей

API — набор действий, которыми пользуется программа. Расширение PHP реализует этот набор; драйвер/клиентская библиотека передаёт команды по протоколу; MySQL-сервер выполняет SQL и хранит таблицы. Веб-браузер не должен подключаться прямо к базе: HTTP приходит вашему PHP-коду, тот проверяет пользователя и вызывает базу от ограниченной серверной учётной записи.

Путь данных. Браузер отправляет HTTP → PHP вызывает MySQLi API → mysqlnd передаёт протокол → MySQL выполняет SQL → Строки возвращаются PHP → PHP формирует HTML/JSON.

КомпонентЧто делает
mysqliРасширение PHP, с PHP 5.0. OO и процедурная запись, native prepared statements, транзакции, CALL, multi_query, mysqlnd async.
mysqlndНизкоуровневая клиентская библиотека, ориентированная на PHP. С 8.2 единственный вариант mysqli; не самостоятельная замена mysqli_query.
libmysqlclientИсторическая клиентская C-библиотека, поддерживалась mysqli до PHP 8.1 включительно.
PDO + pdo_mysqlДругой API доступа к MySQL; PDO умеет разные драйверы, но SQL и особенности СУБД остаются. У MySQLi нет эмуляции prepare, у PDO MySQL есть native/emulated варианты.
MySQL/MariaDB-серверОтдельный процесс/служба. Совместимость протокола не делает все функции и версии двух серверов одинаковыми.
Старое mysql_*Иное расширение: deprecated в PHP 5.5, удалено в 7.0. Не используйте mysql_query из старого урока в новой программе.

OO и процедурный интерфейсы MySQLi используют один механизм и не имеют существенного преимущества скорости друг перед другом. PDO удобен единым API драйверов, MySQLi — прямыми возможностями MySQL; оба пригодны для безопасной разработки. Старое утверждение, что PDO вообще не поддерживает несколько результатов/команд, нельзя переносить как абсолютное правило: конкретный PDO MySQL имеет свои возможности и ограничения. Выбирайте по существующему проекту, необходимым функциям и сопровождению. Историческое преимущество mysqlnd по памяти GEOMETRY связано с отсутствием чрезмерного предварительного выделения libmysqlclient; оно не означает одинаковую экономию в любом запросе.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Установка и учебное окружение: что нужно до первого подключения

Нужны PHP с расширением mysqli и отдельно работающий MySQL-сервер. mysqlnd включён в семейство PHP с 5.3; расширение mysqli появилось в 5.0. В Linux обычно ставят пакет MySQL-модулей для конкретной установленной версии PHP через пакетный менеджер дистрибутива; название и команда зависят от выпуска. Исторические php5-mysql из старого текста не являются рекомендацией современному серверу. При сборке PHP 8.2+ используют --with-mysqli, mysqlnd — единственный поддерживаемый клиент.

Версии PHPИсторическая сборка MySQLi
8.2+mysqlnd, --with-mysqli; libmysqlclient больше не поддерживается.
5.4–8.1mysqlnd по умолчанию; --with-mysqli=/path/to/mysql_config выбирал libmysqlclient.
5.3libmysqlclient default; --with-mysqli=mysqlnd включал native driver.
5.0–5.2Только libmysqlclient; mysqlnd ещё не был доступен.

В Windows включают подходящую php_mysqli.dll через extension=mysqli в используемом php.ini; extension_dir должен указывать на каталог DLL этой же сборки PHP. Версия, архитектура и TS/NTS должны совпадать. Сообщение Unable to load dynamic library означает проблему пути/совместимости/зависимостей, а не неверный пароль MySQL. После изменения конфигурации перезапускают соответствующий PHP-FPM/Apache/worker; запуск нового CLI читает ini заново. PDO MySQL и mysqli — разные расширения: включение одного не создаёт функции другого.

Как читать этот вариант. Проверено в PHP 8.5.11 с процессным подключением bundled php_mysqli.dll; системный php.ini не изменялся. Веб-PHP и CLI могут отличаться: проверяйте именно среду приложения.

Проверить расширение и нужные методы без сетиСамостоятельный пример
<?php
echo extension_loaded('mysqli') ? 'MySQLi загружено' : 'Нет расширения mysqli';
echo "\n";
var_dump(method_exists(mysqli::class, 'execute_query'));
var_dump(method_exists(mysqli_stmt::class, 'get_result'));
Ожидаемый результат
MySQLi загружено
bool(true)
bool(true)

Как читать этот вариант. Для ручной локальной диагностики можно посмотреть сам $ini; публичный phpinfo не оставляют доступным всему интернету.

Узнать путь конфигурации без вывода паролейСамостоятельный пример
<?php
$ini = php_ini_loaded_file();
echo is_string($ini) ? 'Файл ini загружен' : 'Основного ini нет';
echo "\n";
echo extension_loaded('mysqli') ? 'mysqli доступно' : 'mysqli отсутствует';
echo "\n";
Ожидаемый результат
Файл ini загружен
mysqli доступно

Для самостоятельного повторения попросите администратора отдельной учебной среды создать базу course_demo и пользователя course_user с паролем, который вы укажете вместо course_password. Для обычных примеров нужны SELECT/INSERT/UPDATE/DELETE и CREATE TEMPORARY TABLES в этой базе. Примеры используют собственные временные таблицы и не обращаются к существующим товарам. Для урока CALL отдельно нужны CREATE ROUTINE/ALTER ROUTINE; административные FLUSH/KILL/debug рассматриваются только в специальном учебном сервере. Не запускайте эти примеры с реквизитами рабочего магазина.

Проверочная среда этого текста — PHP 8.5.11 без подключённого учебного MySQL: примеры SQL имеют ожидаемый результат при указанных условиях и пройденный PHP lint, но сервер не вызывался. Client-only примеры исполнялись изолированно. Отдельно отмечена функция quote_string из опубликованной ветки PHP 8.6: в 8.5.11 её ещё нет. Старая проблема authentication caching_sha2_password касалась PHP до 7.1.16/7.2.4; полная поддержка есть с 7.4.4. Современному приложению обновляют совместимый клиент, а не ослабляют серверную аутентификацию по совету десятилетнего примера.

php.ini: полная конфигурация MySQLi и область её действия

INI_SYSTEM меняют в конфигурации администратора, а не ini_set внутри запроса. INI_ALL допускает более гибкое изменение, но хранить пароль в публичном коде/выводе всё равно нельзя. Пропущенные аргументы соединения берутся из default-настроек; явные параметры проще проверить. Настройки количества относятся к процессу: десятки PHP-FPM workers могут суммарно открыть гораздо больше соединений.

Настройка / default / доступДействие
mysqli.allow_local_infile / 0 / SYSTEMРазрешение чтения клиентских локальных файлов серверным LOAD DATA LOCAL. До 7.2.16/7.3.3 default был 1.
mysqli.local_infile_directory / пусто / SYSTEMPHP 8.1+: ограниченный каталог LOCAL; не заменяет отдельную политику доверия серверу.
mysqli.allow_persistent / 1 / SYSTEMРазрешает p:-соединения.
mysqli.max_persistent / −1 / SYSTEMЛимит активных+кешированных persistent в процессе; −1 без лимита. В PHP 8.5.11 значение 0 не означает unlimited, несмотря на старую строку документации: реализация проверяет != −1.
mysqli.max_links / −1 / SYSTEMОбщее число соединений процесса; −1 без лимита.
mysqli.default_port / 3306 / ALLПорт TCP при отсутствии явного. Историческая цепочка fallback: MYSQL_TCP_PORT → mysql-tcp в /etc/services → MYSQL_PORT сборки; Windows использует compile-time default.
mysqli.default_socket / null / ALLПуть Unix socket или имя Windows pipe, если не передан явно.
mysqli.default_host / null / ALLХост по умолчанию; localhost выбирает локальный транспорт по платформе.
mysqli.default_user / null / ALLПользователь MySQL по умолчанию.
mysqli.default_pw / null / ALLПароль MySQL по умолчанию; берегите доступ к ini и диагностике.
mysqli.reconnect / удалена 8.2Раньше default 0 / SYSTEM, mysqlnd игнорировал; автоматическое продолжение транзакции не гарантировалось.
mysqli.rollback_on_cached_plink / 0 / SYSTEMПри 1 незавершённая транзакция откатывается при возврате соединения в persistent-пул; при 0 — при повторном использовании либо физическом закрытии.

Внизу старой configuration-страницы осталось утверждение о недоступности read timeout. В актуальном API есть MYSQLI_OPT_READ_TIMEOUT с PHP 7.2; задайте его до real_connect. Единицы — секунды, а истечение ожидания клиента не доказывает отмену SQL на сервере. Не путайте PHP max_execution_time, connect timeout, read timeout, server wait_timeout и транзакционный lock timeout: они ограничивают разные участки пути.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Для ручной локальной диагностики можно посмотреть сам $ini; публичный phpinfo не оставляют доступным всему интернету.

Узнать путь конфигурации без вывода паролейСамостоятельный пример
<?php
$ini = php_ini_loaded_file();
echo is_string($ini) ? 'Файл ini загружен' : 'Основного ini нет';
echo "\n";
echo extension_loaded('mysqli') ? 'mysqli доступно' : 'mysqli отсутствует';
echo "\n";
Ожидаемый результат
Файл ini загружен
mysqli доступно

Из таблицы в массив: почему query ещё не возвращает товар

Когда форма заказа присылает номер товара, PHP должен найти строку, прочитать название/цену и продолжить работу. Сервер возвращает табличный результат, а не сразу удобную переменную каждого поля. Объект mysqli_result хранит этот набор и позицию чтения. fetch_assoc переносит одну строку в массив: подписи колонок становятся ключами. Следующий fetch читает следующую строку. null означает конец строк; SQL NULL внутри поля тоже превращается в null, но это значение поля, не весь результат.

Путь данных. course_items содержит id=1/name=Pen → SELECT выбирает строку → query возвращает mysqli_result → fetch_assoc возвращает массив → item[name] даёт Pen.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. CREATE определяет таблицу, INSERT добавляет одну строку, WHERE выбирает ID. TEMPORARY видна только этому соединению и исчезнет с ним. Настоящую постоянную схему создают миграциями, а не при каждом HTTP-запросе.

Сохранить и прочитать один учебный товарПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_items (id INT PRIMARY KEY, name VARCHAR(80))');
$db->query("INSERT INTO course_items VALUES (1, 'Pen')");
$result = $db->query('SELECT id, name FROM course_items WHERE id = 1');
$item = $result->fetch_assoc();
echo $item['name'], "\n";
Ожидаемый результат
Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ? — место одного значения. SQL-шаблон и список значений передаются отдельно: строка посетителя не становится частью синтаксиса SQL. Метод сам готовит statement и возвращает результат.

Найти товар по переданному IDПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->execute_query('SELECT name FROM course_products WHERE id = ?', [2]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
Notebook

Сначала SQL постоянный, затем появляется внешнее значение. Вариант execute_query(..., [2]) связывает его с ?, а не дописывает в SQL-текст. Массив параметров и массив результата — разные контейнеры: первый идёт к серверу, второй приходит обратно. Сравните JSON и массив: в JSON API перед выдачей массив результата можно преобразовать json_encode. Данные из БД не становятся безопасным HTML автоматически; выводят через экранирование по контексту.

Соединение: адрес, транспорт, кодировка, срок жизни

На Unix localhost специально означает socket; 127.0.0.1 явно выбирает TCP. На Windows точка как hostname исторически означает named pipe, а socket-параметр задаёт его имя; обычное TCP подключение использует хост/порт. Параметр socket сам по себе не переключает транспорт, если hostname уже выбрал TCP. Пустые параметры идут через ini defaults и библиотечные значения; локальный socket исторически /tmp/mysql.sock, Windows pipe \.\pipe\MySQL, TCP default 3306. Реальные пути зависят от установки.

Для тайм-аутов/TLS сначала выделяют объект без сети, затем задают options/ssl_set, затем real_connect. После подключения set_charset согласует utf8mb4. Подключение не создаёт пользователя базы и не подтверждает право посетителя читать чужой заказ: серверная учётная запись и авторизация приложения находятся на разных уровнях. Непостоянный handle закрывается явно close или при уничтожении; persistent возвращается в пул.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Timeout выбирают до открытия. После него код не превращается в гарантированно трёхсекундный HTTP-ответ: SQL, обработка данных и сеть имеют другие границы.

Открыть соединение с ограничением ожиданияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. utf8mb4 может передавать четырёхбайтовые Unicode-символы. Кодировка таблицы/колонки также должна подходить: одна настройка соединения не переделывает старую latin1-схему.

Сохранить русское название без потери символовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ? AS name');
$s->execute(['Тетрадь 📘']);
echo $s->get_result()->fetch_assoc()['name'], "\n";
Ожидаемый результат
Тетрадь 📘

В рабочих файлах реквизиты берут из закрытой конфигурации/секретов окружения. Вопрос «где хранить $db» решают передачей зависимости или локальной областью действия, а не распространением глобального пароля. Подробнее mysqli_connect, mysqli_options, mysqli_ssl_set.

Два интерфейса: функция с $db и метод объекта

Процедурная запись mysqli_query($db, $sql) передаёт соединение первым аргументом. Объектная $db->query($sql) ставит то же соединение перед стрелкой. Оба варианта используют один и тот же объект mysqli и один драйвер, их можно технически смешивать. Для читаемости выберите последовательный стиль. Название procedural не означает копирование логики: функции тоже можно выносить в модули и вызывать повторно.

ЗаписьСмысл
mysqli_query($db, $sql) ↔ $db->query($sql)Одна команда соединения.
mysqli_fetch_assoc($result) ↔ $result->fetch_assoc()Чтение строки результата.
mysqli_affected_rows($db) ↔ $db->affected_rowsФункция-геттер против свойства без скобок.
mysqli_stmt_execute($s, $params) ↔ $s->execute($params)Запуск подготовленной команды.
mysqli_poll(...) ↔ mysqli::poll(...)Статический опрос нескольких соединений, а не метод одного результата.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new создаёт объект соединения. query выполняет SQL, fetch_assoc превращает строку результата в массив; по ключу answer читаем её значение. Данные доступа здесь учебные.

Соединение и одно прочитанное значениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS answer');
echo $result->fetch_assoc()['answer'], "\n";
$db->close();
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Объект соединения теперь первый аргумент функции. Процедурный стиль не требует копировать SQL-логику и не имеет существенной разницы скорости с методами.

Та же работа через процедурные функцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
mysqli_set_charset($db, 'utf8mb4');
$result = mysqli_query($db, "SELECT 'Готово' AS status");
$row = mysqli_fetch_assoc($result);
echo $row['status'], "\n";
mysqli_close($db);
Ожидаемый результат
Готово

Классы можно оборачивать своим сервисом/репозиторием и передавать соединение через конструктор; это локализует параметры и ответственность. Не наследуйте от mysqli только ради доступа к запросам, если достаточно хранить его как зависимость: композиция сохраняет ясное различие между вашим сервисом и транспортом к базе. Сравнение скорости стилей не должно отвлекать от сетевых обращений, индексов и количества возвращённых строк.

Обычные запросы: буфер, поток, типы значений и стоимость

query совмещает real_query и store_result: отправляет один SQL и по умолчанию полностью получает набор. Буфер освобождает сервер от ожидания медленного PHP-чтения и даёт data_seek, но занимает клиентскую память. use_result или MYSQLI_USE_RESULT передаёт строки по мере чтения; до конца/free нельзя отправить новую команду по тому же соединению. Это обмен расхода памяти на время удержания серверной работы. Медленный HTTP внутри цикла чтения может ухудшить общую производительность.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Все строки уже получены клиентом: доступны счётчик и перемотка. Цена — память для набора; это не вариант по умолчанию для экспорта миллионов записей.

Сосчитать строки сразу после буферизацииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->store_result();
echo $result->num_rows, "\n";
$result->data_seek(2);
echo $result->fetch_column(), "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Поток уменьшает клиентский буфер, но соединение занято до завершения. Медленные внешние HTTP-вызовы внутри цикла удлинят SQL-операцию и жизнь серверных ресурсов; для таких задач читайте ограниченные страницы.

Читать товар за товаром без полного буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->use_result();
while ($row = $result->fetch_assoc()) { echo $row['name'], "\n"; }
$result->free();
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
Pen
Notebook
Box
42

В обычном текстовом протоколе COM_QUERY числа чаще приходят строками. MYSQLI_OPT_INT_AND_FLOAT_NATIVE в mysqlnd возвращает подходящие целые/float в диапазоне PHP; DECIMAL и огромные BIGINT требуют сохранения точности. SQL NULL остаётся null. В prepared binary protocol сервер передаёт типы иначе, поэтому int может сразу стать PHP int. Проверки === требуют понимания типов, а не случайного приведения всех значений.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Опция mysqlnd превращает подходящие числовые значения обычного query в PHP-числа. Для больших чисел/DECIMAL сохраняйте точность; опция не является универсальным преобразователем любых денежных строк.

Согласовать PHP-типы текстового протоколаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$row = $db->query('SELECT 42 AS quantity')->fetch_assoc();
var_dump($row['quantity']);
Ожидаемый результат
int(42)

Для большого экспорта выберите лишь нужные колонки и ограниченные страницы. ORDER BY задаёт детерминированный порядок; LIMIT ограничивает объём; индекс ускоряет подходящий поиск. fetch_all создаёт полный PHP-массив, SELECT COUNT(*) считает на сервере. Эти способы не взаимозаменяемы: сначала сформулируйте, нужен ли счётчик, одна строка или весь набор.

Подготовленные запросы: шаблон отдельно, данные отдельно

Потребность проста: найти товар по значению из формы так, чтобы апостроф или SQL-похожий текст оставался данными. prepare отправляет шаблон с ?, сервер разбирает его; execute передаёт значения и запускает. Плейсхолдер обозначает целое значение. Имя колонки, направление ORDER BY и имя таблицы параметром не становятся: их выбирают из фиксированного разрешённого списка. Набор IN (?, ?, ?) требует отдельного места на каждое значение; строка «1,2,3» в одном ? остаётся одним значением.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_param сохраняет связь с переменной, не её одноразовую копию. execute читает текущее значение $id. Передать литерал 1 вместо переменной по ссылке нельзя.

Привязать переменную и изменить её перед повторомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$id = 1;
$statement->bind_param('i', $id);
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
$id = 3;
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Pen
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. params добавлен в PHP 8.1. Это список, а не словарь имён :id; число элементов должно совпадать с ?. Параметры этого варианта передаются как строки; null остаётся NULL.

Передать список значений при запускеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([2]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Notebook

bind_param принимает переменные по ссылке и буквы i/d/s/b. При каждом execute берётся текущее значение этих переменных; временное выражение не может быть привязанной изменяемой переменной. execute(array) PHP 8.1+ удобен для списка без управления ссылками. execute_query PHP 8.2+ сокращает единичное prepare→execute→get_result. Параметры не нужно дополнительно real_escape_string: двойная обработка исказит текст. В MySQLi нет клиентской эмуляции prepare и именованных PDO-маркеров :name.

После execute есть две дорожки выхода: get_result (mysqlnd, полный буфер mysqli_result) либо bind_result+fetch (переменные колонок, без полного буфера по умолчанию). Вторая дорожка получает внутренний буфер через store_result при необходимости; не соединяйте оба способа получения одного набора. Prepared SELECT обычно использует бинарный протокол и возвращает native int/float там, где они соответствуют диапазону PHP.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_result не читает строку: он указывает, куда fetch запишет каждую колонку. Порядок совпадает с SELECT. Здесь не создаётся массив строки.

Получить два значения в заранее выбранные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->prepare("SELECT 'Pen' AS name, 120 AS price");
$statement->execute();
$statement->bind_result($name, $price);
$statement->fetch();
echo $name, ':', $price, "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. get_result забирает весь набор в mysqli_result, после чего применимы обычные fetch_assoc/fetch_all. Требуется mysqlnd; это не нейтральный к памяти поток.

Превратить подготовленный SELECT в удобный результатПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
$statement->execute([2]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ':', $row['price'], "\n";
Ожидаемый результат
Notebook:350

Для повторов prepare экономит повторную подготовку, но единичный запрос имеет дополнительный сетевой этап: безопасность и удобство не означают автоматического ускорения любого SQL. Массовый INSERT с несколькими VALUES иногда уменьшает round trips сильнее, чем одиночный execute в цикле; ограничивайте размер пакета max_allowed_packet и разумной транзакцией. Закрывайте больше не нужные statements, потому что они удерживают серверные ресурсы.

Метаданные: откуда взять имена и типы колонок для экспорта

Строки — данные товаров, метаданные — описание их колонок. Если построить универсальный CSV-экспорт, нужны имена заголовков даже когда фильтр нашёл ноль товаров. fetch_fields возвращает массив объектов: name — имя результата, orgname — исходное поле, table/orgtable/db — происхождение, type/flags/charsetnr — тип и признаки. AS изменяет подпись, но сохраняет orgname. MySQLi почти не нормализует различия серверных версий, поэтому не считайте все числа и длины универсальными.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внешний массив содержит объекты описаний. Не путайте его с fetch_all, где внешний массив содержит реальные строки данных.

Получить всю схему одним массивомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products LIMIT 0');
$fields = $result->fetch_fields();
echo $fields[0]->name, ':', $fields[1]->name, "\n";
Ожидаемый результат
id:name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Метаданные доступны после prepare. Этот объект не содержит строки с товарами, а только описание результата.

Узнать колонки до чтения данныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id = ?');
$metadata = $s->result_metadata();
foreach ($metadata->fetch_fields() as $field) { echo $field->name, "\n"; }
$metadata->free();
Ожидаемый результат
id
name

У prepared statement result_metadata даёт описание без самих строк. В объекте результата отдельны курсор колонок fetch_field/field_seek и курсор строк fetch/data_seek. length описывает ширину в байтах с учётом charset, lengths — реальные длины последней строки. max_length с PHP 8.1 всегда 0: старые дампы, где он равен максимальной ширине, нельзя использовать для расчёта современной таблицы. Полный состав полей и битовые признаки разобраны в mysqli_fetch_fields.

Транзакции: заказ не должен сохраниться наполовину

Если действие изменяет несколько связанных записей, нужно определить одну границу успеха. begin_transaction открывает её, commit подтверждает всё, rollback отменяет неподтверждённое. InnoDB поддерживает транзакции; MyISAM не приобретает эту возможность от вызова API. MySQL 5.5 сделал InnoDB default, но существующая таблица может иметь иной движок. CREATE/ALTER и другие команды с implicit commit нельзя бездумно смешивать с откатываемой бизнес-операцией.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Транзакция соединяет несколько SQL-действий в один итог: сохранить оба либо откатить. Временная таблица InnoDB создана до начала. Транзакция не включает отправленное письмо или внешний HTTP-запрос.

Два изменения цены как одно действиеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [130, 1]);
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [360, 2]);
    $db->commit();
} catch (Throwable $error) {
    $db->rollback(); throw $error;
}
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
690

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После rollback исходная цена возвращается. Это работает для транзакционного движка InnoDB; MyISAM не откатывает изменения таким способом. AUTO_INCREMENT может сохранять пропуски, даже если вставка откатилась.

Отменить промежуточное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [999, 1]);
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Вызовы API видны обёрткам/плагинам транзакционного распределения нагрузки лучше, чем произвольная строка SET AUTOCOMMIT; поэтому режимом управляют методами. Исторические mysqlnd replication plugins не являются обязательной частью современного проекта. Вложенный begin не даёт независимой вложенной транзакции: для частичного отказа есть savepoint и ROLLBACK TO. READ ONLY, READ WRITE и WITH CONSISTENT SNAPSHOT относятся к семантике сервера/изоляции, не к настройке PHP-массива.

Избегайте долгих внешних вызовов и sleep внутри открытой транзакции. Два одновременных заказа требуют ограничений/блокировок или условного атомарного UPDATE; обычный SELECT остатка и последующий UPDATE без согласования могут продать последний товар дважды. При deadlock иногда допустим повтор всей идемпотентной транзакции с ограничением попыток; при неизвестном исходе commit сначала проверяют бизнес-ключ. Подробнее транзакционная модель заказа.

Несколько SQL в пакете: все ответы должны быть обработаны

multi_query отправляет доверенный список команд через ;. Это оптимизация сетевого обмена/инструмент обслуживания, а не механизм безопасно вставить всё из формы. query/real_query специально не включают multi-statements, real_connect удаляет соответствующий флаг; такая граница уменьшает часть последствий инъекции, но одинарный SQL тоже уязвим при склеивании данных. Защита — параметры, разрешённые идентификаторы и ограниченные права.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Пакет может смешивать наборы строк и статусы UPDATE. Для текущего ответа store_result/use_result получает строки, affected_rows описывает изменение. more_results проверяет наличие следующего ответа, next_result переходит и может сообщить ошибку поздней команды. До обработки всех ответов соединение занято. Multi-query не является транзакцией; успех первой команды не гарантирует успех оставшихся. Prepared statement поддерживает одну SQL-команду, хотя эта команда CALL может вернуть несколько наборов.

Хранимые процедуры: IN, OUT, INOUT и несколько наборов

Процедура — код, сохранённый на сервере MySQL и вызываемый командой CALL. Она может объединить серверное действие, вернуть наборы строк или выходные параметры. PHP-функция исполняется в PHP-процессе; процедура — внутри базы, со своими правами и SQL-семантикой. Наличие процедуры не гарантирует ни оптимизацию, ни безопасность: проверяют параметры, права invoker/definer и контракт результата.

IN передаёт значение внутрь; OUT возвращает значение; INOUT делает оба действия. У MySQLi нет отдельного универсального PHP-режима этих параметров, как у некоторых других драйверов: понятная совместимая дорожка использует серверные @session variables, затем SELECT этих переменных. Для IN подготовленный ? отделяет данные от SQL. Поддержка конкретных форм CALL зависит от версии сервера, а все результаты нужно полностью обработать до следующей команды.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база с CREATE ROUTINE/ALTER ROUTINE. IN получает цену, INOUT принимает 2 и возвращает 3, OUT выдаёт 360. @course_quantity — переменная серверной сессии, не PHP $quantity. Фиксированное имя создаётся без DROP чужой существующей процедуры; если CREATE отказал, finally не запущен.

Вход и выход процедуры через серверные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_total(IN price INT, INOUT quantity INT, OUT total INT) BEGIN SET quantity = quantity + 1; SET total = price * quantity; END');
try {
    $db->query('SET @course_quantity = 2, @course_total = 0');
    $s = $db->prepare('CALL course_ref_total(?, @course_quantity, @course_total)');
    $s->execute([120]);
    do {
        if ($result = $s->get_result()) { $result->free(); }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
    $row = $db->query('SELECT @course_quantity AS quantity, @course_total AS total')->fetch_assoc();
    echo $row['quantity'], ':', $row['total'], "\n";
} finally { $db->query('DROP PROCEDURE course_ref_total'); }
Ожидаемый результат
3:360

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база, нужны CREATE ROUTINE/ALTER ROUTINE. Если имя уже существует, CREATE откажет до try: чужая процедура не удаляется. CALL возвращает два набора и завершающий статус без строк; обработайте все.

Прочитать несколько наборов процедурыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_two() BEGIN SELECT 12 AS value; SELECT 25 AS value; END');
try {
    $s = $db->prepare('CALL course_ref_two()'); $s->execute();
    do {
        if ($result = $s->get_result()) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_two'); }
Ожидаемый результат
12
25

Даже CALL с одним SELECT может добавить завершающий статус. query автоматически буферизует только первый набор: он не является полным обработчиком процедуры. real_query/multi_query с more_results/next_result либо подготовленный CALL с соответствующими stmt-методами обрабатывают весь поток. Обёртка, которая каждый раз исследует системный каталог ради параметров процедуры, добавляет запросы и стоимость; явный контракт метода приложения часто проще. Полученные объекты mysqli_result надо освободить, затем завершить statement, затем можно читать OUT-переменные.

Persistent-соединения: повторное использование сессии и его цена

Установление TCP/TLS/аутентификации имеет стоимость. Persistent p:-соединение после освобождения помещается в пул текущего PHP-процесса и может использоваться снова при совпадении хоста, пользователя, пароля, порта, socket и default database. Другой worker имеет собственный пул; короткий CLI-процесс обычно не выигрывает от кеша, который исчезнет вместе с ним. Пул не хранит бизнес-транзакцию между HTTP-запросами по вашему желанию.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Нужно mysqli.allow_persistent=1. p: относится к запросу на повторное использование; это не общий глобальный пул для всех PHP workers.

Запросить соединение из пула процессаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('p:127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
$db->close();
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается для стандартной сборки с очисткой состояния при повторном использовании. Специальный MYSQLI_NO_CHANGE_USER_ON_PCONNECT меняет эту гарантию, и такой нестандартный пул требует собственной политики очистки.

Не рассчитывать на прежние session variables после возвратаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$first = new mysqli('p:127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$first->query('SET @course_marker = 42'); $first->close();
$second = new mysqli('p:127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
var_dump($second->query('SELECT @course_marker')->fetch_column());
$second->close();
Ожидаемый результат
NULL

По умолчанию при повторном получении MySQLi очищает сессию через mysql_change_user: откатывает активные транзакции, удаляет временные таблицы, снимает table locks, сбрасывает session variables, закрывает prepared statements и handlers, освобождает GET_LOCK. У этой очистки есть стоимость. Compile-time MYSQLI_NO_CHANGE_USER_ON_PCONNECT может её отключить; это не безусловное ускорение без последствий, а перенос обязанности очистки на приложение. mysqli.rollback_on_cached_plink определяет, откатить ли транзакцию уже при возврате в пул или дождаться повторного использования/физического закрытия.

Число соединений ограничивают mysqli.max_links и mysqli.max_persistent на процесс; общий серверный лимит должен выдерживать число workers × нужные соединения с запасом. Не оставляйте скрытые незавершённые транзакции и чужой session state. Флаг p: полезен только после измерения стоимости соединений и понимания модели развёртывания. Для наблюдения есть mysqli_get_links_stats и mysqli_get_connection_stats.

mysqli: одно соединение с собственным состоянием

Объект mysqli представляет соединение, но new mysqli() без аргументов только выделяет handle: реальная сеть начинается в real_connect после options. Объект хранит текущую базу, кодировку, транзакцию и результат последней команды. Два объекта могут представлять две независимые сессии; настройки одного не становятся параметрами другого. Исключения: driver report_mode — общий, а connect_errno/connect_error описывают последнюю попытку соединения вне зависимости от экземпляра.

Все перечисленные диагностические свойства mysqli только для чтения: affected_rows, client_info, client_version, connect_errno, connect_error, errno, error, error_list, field_count, host_info, info, insert_id, server_info, server_version, sqlstate, protocol_version, thread_id, warning_count. Операцию выполняет метод, свойство сообщает состояние. Пароль помечен SensitiveParameter в актуальном API, что помогает скрыть аргумент в стандартной трассировке; это не разрешение писать конфигурацию подключения в публичный журнал. С PHP 8.5 повторный __construct на уже построенном объекте вызывает Error; создавайте новый экземпляр вместо повторной инициализации.

Как читать этот вариант. Инициализация ещё не доказывает доступность MySQL. Здесь сеть не используется: сохраняется опция для будущего соединения.

Создать объект без обращения к серверуСамостоятельный пример
<?php
$db = mysqli_init();
var_dump($db instanceof mysqli);
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new создаёт объект соединения. query выполняет SQL, fetch_assoc превращает строку результата в массив; по ключу answer читаем её значение. Данные доступа здесь учебные.

Соединение и одно прочитанное значениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS answer');
echo $result->fetch_assoc()['answer'], "\n";
$db->close();
Ожидаемый результат
42

Это наглядный смысл объекта: один настроенный клиент хранит свою связь с сервером. Процедурная форма столь же работоспособна — mysqli_query($db, ...) получает тот же объект первым аргументом. Объектный стиль не гарантирует более быстрый SQL; выбор стиля служит ясности структуры.

mysqli_stmt: шаблон, входные значения и результат

Statement хранит подготовленный SQL и состояние конкретной команды. Сначала prepare определяет, что сделать; bind_param или execute(array) поставляют входные значения; execute запускает; get_result либо bind_result+fetch забирают выход. Вход и выход — разные наборы переменных. Объект принадлежит соединению и удерживает серверные ресурсы. readonly-свойства: affected_rows, insert_id, num_rows, param_count, field_count, errno, error, error_list, sqlstate; одноимённые процедурные функции читают то же состояние. Это практическая польза объекта: шаблон и его данные не разнесены по несвязанным глобальным переменным.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

mysqli_result: набор строк, позиция и схема

Объект результата похож на лоток карточек: каждая строка — отдельная карточка, колонки — подписанные поля. fetch перемещает чтение на следующую карточку. STORE хранит весь лоток у клиента, USE получает карточки из сервера по мере чтения; аналогия не означает, что сервер обязан держать весь результат в памяти. Результат не является соединением и не равен уже извлечённому массиву. Свойства current_field, field_count, lengths, num_rows доступны только для чтения; type сообщает режим. После free операции с объектом недействительны.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. foreach получает строки как ассоциативные массивы. С PHP 8.0 класс implements IteratorAggregate; вызов getIterator обычно делает сам язык.

Пройти строки через foreachПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
foreach ($result as $row) { echo $row['name'], "\n"; }
Ожидаемый результат
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная отдельная страница документирует лишь сигнатуру. Поведение обхода здесь согласовано с классом и реализацией PHP 8.5.11; для потокового результата нельзя рассчитывать на повторную перемотку.

Передать явный итератор коду обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen' AS name");
$iterator = $result->getIterator();
foreach ($iterator as $row) { echo $row['name'], "\n"; }
Ожидаемый результат
Pen

mysqli_driver: общий драйвер, а не отдельное соединение

Объект mysqli_driver даёт доступ к общему состоянию MySQLi. Это monostate: изменение report_mode через один экземпляр видно через другой. readonly client_info/client_version описывают библиотеку; driver_version deprecated с 8.1. embedded удалён в 8.0, reconnect — в 8.2, embedded_server_start/end — в 7.4. Класс final. Его не используют как Repository магазина и не передают вместо mysqli в query: он не представляет сетевую сессию.

Как читать этот вариант. С PHP 8.1 это default, но явная настройка делает зависимость проекта заметной. Соединение не открывается.

Включить явную политику исключенийСамостоятельный пример
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$driver = new mysqli_driver();
var_dump($driver->report_mode === (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT));
Ожидаемый результат
bool(true)

Как читать этот вариант. mysqli_driver — monostate: экземпляров много, настройка общая внутри PHP-контекста. Библиотека не должна молча отключать ошибки соседнего кода.

Два объекта настройки видят одно состояниеСамостоятельный пример
<?php
$first = new mysqli_driver();
$second = new mysqli_driver();
$previous = $first->report_mode;
$first->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
var_dump($first->report_mode === $second->report_mode);
$first->report_mode = $previous;
Ожидаемый результат
bool(true)

mysqli_warning: предупреждение не равно остановке запроса

Сервер иногда выполняет SQL, но сообщает, что значение преобразовано или часть данных проигнорирована. У warning есть текст message, категория sqlstate и код errno. Класс final, конструктор private. Объект получают от API, затем do...while читает первый элемент и последующие next. Для импорта предупреждение может быть существенной потерей данных, хотя исключения не было; решение о допустимости принимает приложение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная документация рекомендует SHOW WARNINGS с LIMIT для сообщений. Получайте их сразу, пока другой SQL не изменил состояние. get_warnings и SHOW WARNINGS — две альтернативы, не два обязательных шага.

Получить ограниченный список SHOW WARNINGSПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
echo mysqli_warning_count($db), "\n";
$rows = $db->query('SHOW WARNINGS LIMIT 10')->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) { echo $row['Level'], ':', $row['Code'], "\n"; }
Ожидаемый результат
1
Warning:1292

mysqli_sql_exception: ошибка как объект с причиной

При строгом режиме отказ базы прерывает текущую последовательность и попадает в ближайший подходящий catch. Ошибка — объект с кодом сервера, сообщением, SQLSTATE, местом и стеком вызовов. Конструктор унаследован от Exception: message, code, previous; создавая свою обёртку, сохраняйте previous. Самостоятельно new mysqli_sql_exception не воспроизводит серверную диагностику: protected sqlstate по умолчанию 00000. Класс final, напрямую наследоваться от него нельзя; используйте композицию причины. Для транзакции обработчик обязан решить вопрос rollback. Не повторяйте любое исключение автоматически: повтор платежа без идемпотентности опаснее исходного отказа.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. getCode — числовой MySQL-код, getSqlState — пятисимвольная категория. Исключение хранит сведения даже после того, как состояние соединения изменится.

Разделить код сервера и SQLSTATE исключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $error->getCode(), ':', $error->getSqlState(), "\n";
}
Ожидаемый результат
1064:42000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внутренняя причина передана третьим параметром previous. Внешнее сообщение понятнее пользователю; лог может связать его с исходным SQL-отказом.

Сохранить причину в исключении уровня приложенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
        throw new RuntimeException('Не удалось подготовить отчёт', 0, $error);
    }
} catch (RuntimeException $error) {
    $cause = $error->getPrevious();
    echo $error->getMessage(), "\n";
    if ($cause instanceof mysqli_sql_exception) { echo $cause->getSqlState(), "\n"; }
}
Ожидаемый результат
Не удалось подготовить отчёт
42000

Константы: имена режимов вместо непонятных чисел

Константа — заранее заданное расширением имя значения. MYSQLI_ASSOC говорит, как представить строку в массиве; MYSQLI_NOT_NULL_FLAG обозначает признак колонки; это разные договоры и их нельзя произвольно смешивать. Все имена ниже имеют тип int, кроме явно отмеченного MYSQLI_IS_MARIADB (bool). Расширение должно быть загружено. Сохраняем и исторические имена, чтобы старый проект можно было понять, но не предлагаем удалённый API новому приложению.

Как читать этот вариант. В PHP 8.5.11 VECTOR определён, INTERVAL удалён, CLIENT_MULTI_QUERIES не экспортируется. Старый перечень имён не равен наличию каждого имени в вашей сборке.

Проверить константу без вызова новой возможностиСамостоятельный пример
<?php
var_dump(defined('MYSQLI_TYPE_VECTOR'));
var_dump(defined('MYSQLI_TYPE_INTERVAL'));
var_dump(defined('MYSQLI_CLIENT_MULTI_QUERIES'));
Ожидаемый результат
bool(true)
bool(false)
bool(false)

Как читать этот вариант. | объединяет биты, & проверяет конкретный бит. Константа режима FETCH — другое семейство; MYSQLI_ASSOC не прибавляют к report_mode.

Собрать политику из независимых флаговСамостоятельный пример
<?php
$flags = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
var_dump((bool) ($flags & MYSQLI_REPORT_ERROR));
var_dump((bool) ($flags & MYSQLI_REPORT_STRICT));
Ожидаемый результат
bool(true)
bool(true)

Параметры соединения

ИмяНазначение и границы
MYSQLI_READ_DEFAULT_GROUPИмя группы my.cnf для исторической libmysqlclient; mysqlnd не читает эти option files.
MYSQLI_READ_DEFAULT_FILEПуть option file для старой libmysqlclient; в современной mysqlnd не заменяет конфигурацию приложения.
MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDSРазрешить протокол ограниченного режима смены истёкшего пароля; это не обычный доступ к данным.
MYSQLI_OPT_LOAD_DATA_LOCAL_DIRРазрешённый каталог LOCAL INFILE (PHP 8.1+); ограничение важно при выключенном общем разрешении LOCAL.
MYSQLI_OPT_CONNECT_TIMEOUTТайм-аут подключения в секундах, задаётся до real_connect.
MYSQLI_OPT_READ_TIMEOUTТайм-аут ожидания чтения результата в секундах; PHP 7.2+. Не является автоматическим откатом уже принятого сервером SQL.
MYSQLI_OPT_LOCAL_INFILEРазрешение LOAD DATA LOCAL INFILE на клиенте. Доступ к локальным файлам расширяет доверие к серверу, потому по умолчанию выключен.
MYSQLI_OPT_INT_AND_FLOAT_NATIVEmysqlnd: преобразовывать подходящие целые/float колонки текстового протокола в PHP-числа в допустимом диапазоне.
MYSQLI_OPT_NET_CMD_BUFFER_SIZEmysqlnd: размер внутреннего командного/сетевого буфера в байтах; не max_allowed_packet сервера.
MYSQLI_OPT_NET_READ_BUFFER_SIZEmysqlnd: максимальная порция чтения тела сетевого пакета в байтах.
MYSQLI_OPT_SSL_VERIFY_SERVER_CERTПроверка сертификата сервера TLS; не отключайте её ради устранения ошибки настройки доверенного CA.
MYSQLI_INIT_COMMANDДоверенный SQL при установлении сессии; исторически повторялся при reconnect. mysqlnd сам не восстанавливает потерянную бизнес-транзакцию.
MYSQLI_SET_CHARSET_NAMEНачальный charset соединения; после подключения предпочтителен set_charset.
MYSQLI_SERVER_PUBLIC_KEYПуть доверенного открытого RSA-ключа сервера для соответствующего authentication exchange; это не TLS CA и не приватный ключ.

Все опции: когда задать, что передать и чего не ждать

Опции подключения задают после new mysqli()/mysqli_init и до real_connect. Значение options имеет тип string|int; для переключателя передают 0/1, для тайм-аута целые секунды, для файлов и charset — строки. Метод возвращает bool, но принятие настройки ещё не доказывает удачный handshake или существование файла сертификата. MYSQLI_READ_DEFAULT_FILE/GROUP не реализованы mysqlnd: настройки задаются PHP-конфигурацией и API. Не смешивайте опции с флагами real_connect: первые отдельные вызовы, вторые битовая маска последнего аргумента. Список выше включает и доступность по версии. Доступ к LOCAL файлам разрешается отдельно и только доверенному серверу; не включайте его для любого загруженного CSV без ограничения каталога.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Помимо учебного MySQL нужны сертификаты, совпадающее имя сервера и TLS-политика сервера. Проверка cipher подтверждает согласование шифрования, но доверие строится проверкой сертификата и требований клиента/сервера, а не только этой строкой.

Подключить клиентский сертификат и проверить выбранный шифрПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli();
$db->ssl_set('/etc/course-db/client-key.pem', '/etc/course-db/client-cert.pem', '/etc/course-db/ca.pem', null, null);
$db->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, 1);
$db->real_connect('db.example.test', 'course_user', 'course_password', 'course_demo', 3306, null, MYSQLI_CLIENT_SSL);
$row = $db->query("SHOW SESSION STATUS LIKE 'Ssl_cipher'")->fetch_assoc();
if ($row['Value'] === '') { throw new RuntimeException('TLS не согласован'); }
echo "TLS согласован\n";
Ожидаемый результат
TLS согласован

Флаги real_connect

ИмяНазначение и границы
MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDSФлаг клиента, готового к sandbox смены истёкшего пароля.
MYSQLI_CLIENT_FOUND_ROWSУ UPDATE счётчик найденных строк вместо только реально изменённых.
MYSQLI_CLIENT_SSL_VERIFY_SERVER_CERTЗапрос проверки сертификата сервера; конфигурация доверенного CA должна соответствовать серверу.
MYSQLI_CLIENT_SSLБит использования TLS; обычно устанавливается библиотекой на основании TLS-настроек. Не доказывает согласованное шифрование сам по себе.
MYSQLI_CLIENT_COMPRESSЗапрос сжатия протокола; цена CPU может превышать выигрыш на коротких локальных запросах.
MYSQLI_CLIENT_INTERACTIVEДля сессии исходный wait_timeout берётся из interactive_timeout; PHP-страница от этого не становится интерактивной консолью.
MYSQLI_CLIENT_IGNORE_SPACEРазрешает пробел перед скобкой встроенных SQL-функций, меняя трактовку их имён как зарезервированных.
MYSQLI_CLIENT_NO_SCHEMAИсторический режим запрета записи db.table.column; не средство авторизации приложения.
MYSQLI_CLIENT_MULTI_QUERIESИсторическое имя в перечне документации. В PHP 8.5.11 не экспортируется; multi_query включает нужный протокол своим API, query/real_query не превращаются в multi от этой записи.
MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERTИсторический флаг отключения проверки (MySQL 5.6.5+). Убирает подтверждение личности сервера; не предлагается как исправление TLS.

Режимы результата и массивов

ИмяНазначение и границы
MYSQLI_STORE_RESULT0: полный клиентский буфер, доступен num_rows и data_seek.
MYSQLI_USE_RESULT1: поток строк; соединение занято до чтения/free, произвольной перемотки нет.
MYSQLI_STORE_RESULT_COPY_DATAИсторическая копия данных из mysqlnd-буфера; с 8.1 не влияет, deprecated 8.4 вместе с mode у store_result.
MYSQLI_ASYNCmysqlnd: запуск query без немедленного набора, ожидание poll и получение reap_async_query.
MYSQLI_ASSOCИмена колонок становятся ключами массива.
MYSQLI_NUMКолонки получают номера с 0.
MYSQLI_BOTHВ одной строке одновременно числовые и именные ключи; это не две строки данных.

Битовые признаки метаданных

ИмяНазначение и границы
MYSQLI_NOT_NULL_FLAGСтолбец объявлен NOT NULL.
MYSQLI_PRI_KEY_FLAGУчаствует в PRIMARY KEY.
MYSQLI_UNIQUE_KEY_FLAGУчаствует в уникальном индексе.
MYSQLI_MULTIPLE_KEY_FLAGУчаствует в индексе, допускающем повторения.
MYSQLI_BLOB_FLAGBLOB-подобный тип по серверным метаданным.
MYSQLI_UNSIGNED_FLAGБеззнаковое число.
MYSQLI_ZEROFILL_FLAGИсторическое объявление ZEROFILL; это свойство SQL-колонки, не функция дополнения PHP-строки.
MYSQLI_AUTO_INCREMENT_FLAGАвтоматически увеличиваемый ключ.
MYSQLI_TIMESTAMP_FLAGПризнак TIMESTAMP.
MYSQLI_SET_FLAGТип SET.
MYSQLI_NUM_FLAGПризнак числового поля.
MYSQLI_PART_KEY_FLAGПоле является частью ключа/индекса.
MYSQLI_GROUP_FLAGСлужебный признак GROUP BY; не подменяет анализ исходного SQL.
MYSQLI_NO_DEFAULT_VALUE_FLAGНет DEFAULT; nullable и AUTO_INCREMENT имеют особые неявные значения, поэтому признак не просто отсутствие текста DEFAULT.
MYSQLI_ENUM_FLAGТип ENUM.
MYSQLI_BINARY_FLAGДвоичные данные/двоичная семантика поля.
MYSQLI_ON_UPDATE_NOW_FLAGАвтоматическое обновление текущим временем при изменении строки.

Коды типов серверных колонок

ИмяНазначение и границы
MYSQLI_TYPE_DECIMALИсторический DECIMAL.
MYSQLI_TYPE_NEWDECIMALТочный DECIMAL/NUMERIC; сохраняйте точность строкой, не переводите деньги бездумно во float.
MYSQLI_TYPE_BITBIT; не предполагает автоматически обычный PHP bool.
MYSQLI_TYPE_TINYTINYINT, включая числовое хранение некоторых булевых полей.
MYSQLI_TYPE_SHORTSMALLINT.
MYSQLI_TYPE_LONGINT; слово LONG здесь не гарантирует PHP int для любого диапазона.
MYSQLI_TYPE_FLOATFLOAT.
MYSQLI_TYPE_DOUBLEDOUBLE.
MYSQLI_TYPE_NULLNULL-тип выражения/поля; проверка значения всё равно выполняется по полученным данным.
MYSQLI_TYPE_TIMESTAMPTIMESTAMP.
MYSQLI_TYPE_LONGLONGBIGINT; значения вне PHP_INT_MAX сохраняйте строками.
MYSQLI_TYPE_INT24MEDIUMINT.
MYSQLI_TYPE_DATEDATE.
MYSQLI_TYPE_TIMETIME.
MYSQLI_TYPE_DATETIMEDATETIME.
MYSQLI_TYPE_YEARYEAR.
MYSQLI_TYPE_NEWDATEИсторический код DATE.
MYSQLI_TYPE_INTERVALБывший alias ENUM, удалён с PHP 8.4.
MYSQLI_TYPE_ENUMENUM.
MYSQLI_TYPE_SETSET.
MYSQLI_TYPE_TINY_BLOBTINYBLOB/TINYTEXT по серверной кодировке.
MYSQLI_TYPE_MEDIUM_BLOBMEDIUMBLOB/MEDIUMTEXT.
MYSQLI_TYPE_LONG_BLOBLONGBLOB/LONGTEXT.
MYSQLI_TYPE_BLOBBLOB/TEXT; различие уточняют charset/flags.
MYSQLI_TYPE_VAR_STRINGПеременная строка, например VARCHAR.
MYSQLI_TYPE_STRINGCHAR/BINARY.
MYSQLI_TYPE_CHARИсторическое имя кода TINYINT; для SQL CHAR нужен MYSQLI_TYPE_STRING.
MYSQLI_TYPE_GEOMETRYГеометрия, не готовый PHP-объект точки.
MYSQLI_TYPE_JSONJSON, mysqlnd и MySQL 5.7.8+; текст при необходимости декодируют json_decode.
MYSQLI_TYPE_VECTORVECTOR: PHP 8.4+, сервер MySQL 9.0+; наличие константы не добавляет тип старому серверу.

Курсоры и служебные значения statement

ИмяНазначение и границы
MYSQLI_CURSOR_TYPE_NO_CURSORОбычное выполнение без серверного курсора.
MYSQLI_CURSOR_TYPE_READ_ONLYСерверный курсор только для чтения; задаётся через STMT_ATTR_CURSOR_TYPE до execute.
MYSQLI_CURSOR_TYPE_FOR_UPDATEУдалён с PHP 8.4; не используйте как обещание доступного обновляемого курсора.
MYSQLI_CURSOR_TYPE_SCROLLABLEУдалён с PHP 8.4; перемотка MySQLi обычно относится к клиентскому буферу.
MYSQLI_STMT_ATTR_CURSOR_TYPEВыбор NO_CURSOR/READ_ONLY через attr_set.
MYSQLI_STMT_ATTR_PREFETCH_ROWSИсторический размер порции курсора (1..unsigned long, default 1), удалён с PHP 8.4.
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTHИсторическое обновление max_length при store_result; в современном PHP 8.1+ max_length всегда 0.
MYSQLI_NEED_DATAСтарое служебное имя потребности bind в данных; в PHP 8.5.11 не экспортируется. send_long_data работает своим API.
MYSQLI_NO_DATAНеиспользуемая константа, deprecated с 8.1; PHP stmt_fetch возвращает null в конце, не это число.
MYSQLI_DATA_TRUNCATEDНеиспользуемая константа, deprecated с 8.1; не сравнивайте с ней bool/null stmt_fetch.

Диагностика и сведения о сборке

ИмяНазначение и границы
MYSQLI_REPORT_INDEXСообщать о запросах без подходящего индекса; не заменяет EXPLAIN.
MYSQLI_REPORT_ERRORСообщать отказы MySQLi.
MYSQLI_REPORT_STRICTВ сочетании с ERROR превращать отказы в mysqli_sql_exception.
MYSQLI_REPORT_ALLВсе виды отчётности, включая INDEX.
MYSQLI_REPORT_OFFВыключить автоматическую отчётность; не отменяет отказ, код должен проверять результаты.
MYSQLI_DEBUG_TRACE_ENABLED1 при поддержке mysqli_debug сборкой; не признак уже созданного файла трассы.
MYSQLI_IS_MARIADBbool PHP 8.1.2+: сборка против клиентской библиотеки MariaDB, не подключение к MariaDB-серверу. В PHP 8.5.11 с mysqlnd имеет значение false.
MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USEDНеиспользуемый серверный бит, deprecated 8.1; анализируйте EXPLAIN/отчётность.
MYSQLI_SERVER_QUERY_NO_INDEX_USEDНеиспользуемый серверный бит, deprecated 8.1.
MYSQLI_SERVER_QUERY_WAS_SLOWНеиспользуемый серверный бит, deprecated 8.1; не таймер PHP-функции.
MYSQLI_SERVER_PS_OUT_PARAMSНеиспользуемый признак OUT-параметров, deprecated 8.1; читайте результаты CALL предусмотренным API.

Границы транзакций

ИмяНазначение и границы
MYSQLI_TRANS_COR_AND_CHAINДобавить AND CHAIN к commit/rollback: сразу новая транзакция с теми же характеристиками.
MYSQLI_TRANS_COR_AND_NO_CHAINЯвно запретить продолжение цепочки.
MYSQLI_TRANS_COR_RELEASEПосле завершения освободить серверную сессию.
MYSQLI_TRANS_COR_NO_RELEASEЯвно сохранить сессию.
MYSQLI_TRANS_START_READ_ONLYSTART TRANSACTION READ ONLY; MySQL 5.6+.
MYSQLI_TRANS_START_READ_WRITESTART TRANSACTION READ WRITE; MySQL 5.6+.
MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOTЗапрос согласованного снимка по правилам движка и уровня изоляции.

Исторические административные флаги refresh

Флаги MYSQLI_REFRESH_* deprecated с PHP 8.4. Выбирайте явные поддерживаемые сервером SQL-команды и административный контекст; не выполняйте их в обработчике посетителя.

ИмяНазначение и границы
MYSQLI_REFRESH_GRANTПеречитать таблицы прав.
MYSQLI_REFRESH_LOGСбросить/переоткрыть журналы, аналог категории FLUSH LOGS.
MYSQLI_REFRESH_TABLESОсвободить кеш таблиц, категория FLUSH TABLES.
MYSQLI_REFRESH_HOSTSСбросить host cache; доступность FLUSH HOSTS зависит от версии сервера.
MYSQLI_REFRESH_REPLICAAlias SLAVE с PHP 8.1; меняет состояние репликации.
MYSQLI_REFRESH_STATUSСбросить статусные счётчики.
MYSQLI_REFRESH_THREADSСбросить кеш потоков.
MYSQLI_REFRESH_SLAVEИсторический сброс сведений upstream/состояния replica, не обычная очистка памяти PHP.
MYSQLI_REFRESH_MASTERИсторический сброс/удаление записей binary logs и индекса — потенциально разрушительное административное действие.
MYSQLI_REFRESH_BACKUP_LOGЗакрыть и переоткрыть backup logs для поддерживающей версии сервера.

Версии, удалённые возможности и корректное чтение старых примеров

ВерсияЧто меняет код
8.6 (ветка документации)quote_string создаёт полный строковый литерал; отсутствует в проверочной 8.5.11.
8.5Повторный __construct mysqli вызывает Error; alias mysqli_execute deprecated.
8.4kill/ping/refresh deprecated; mode store_result deprecated (не действует с 8.1); COPY_DATA и REFRESH-константы deprecated. Удалены TYPE_INTERVAL, CURSOR_FOR_UPDATE/SCROLLABLE, STMT_ATTR_PREFETCH_ROWS. TYPE_VECTOR добавлен для MySQL 9.0+. Сервер MySQL 8.0.24+ может сообщать wait_timeout кодом 4031 вместо 2006.
8.3fetch_object с constructor_args без конструктора: ValueError вместо Exception; poll без read/error тоже ValueError.
8.2execute_query; mysqlnd единственная клиентская библиотека mysqli. Удалены mysqli.reconnect и driver::$reconnect; get_charset state всегда 1.
8.1.2mysqli_sql_exception::getSqlState; MYSQLI_IS_MARIADB.
8.1По умолчанию ERROR|STRICT; execute принимает params. fetch_all и stmt_next_result поддерживали также libmysqlclient. connect возвращает true вместо null. Deprecated OO init/get_client_info, аргумент mysqli_get_client_info, driver_version и неиспользуемые служебные константы. max_length всегда 0, COPY_DATA больше не действует. local_infile_directory доступна.
8.0fetch_object допускает [] для конструктора без параметров. field_seek/stmt_close/close/debug при нормальном вызове возвращают true. query у stmt-конструктора и name у транзакционных методов nullable. mysqli_result implements IteratorAggregate; driver embedded удалён.
7.4Все аргументы connect/real_connect nullable; embedded_server_start/end удалены. 7.4.4 полностью поддерживает caching_sha2_password; до 7.4.13 для различения ошибок get_result применялся mysqli_errno из-за ошибки реализации.
7.2OPT_READ_TIMEOUT. Начиная с 7.2.16/7.3.3 local infile по умолчанию выключен.
5.6 / 5.5 / 5.4get_links_stats / begin_transaction и savepoints / error_list и mysqlnd default.
5.3 / 5.1 / 5.0mysqlnd, fetch_all, async, get_result и статистика / warnings и исторический embedded / появление mysqli.

Версия PHP, клиентской библиотеки и MySQL-сервера — три разные оси. Наличие функции проверяют в нужном SAPI, требуемую серверную возможность — на учебном сервере этой версии. Константа VECTOR не добавляет поддержку VECTOR старому MySQL; актуальный клиент не меняет движок старой MyISAM-таблицы. Полный указатель сохраняет исторические имена с метками, чтобы переход на современный API был осознанным.

Как читать этот вариант. В проверочной PHP 8.5.11 execute_query есть, quote_string относится к PHP 8.6. Проверка символа яснее сравнения старого driver_version.

Проверить нужную возможность напрямуюСамостоятельный пример
<?php
var_dump(method_exists(mysqli::class, 'execute_query'));
var_dump(method_exists(mysqli::class, 'quote_string'));
Ожидаемый результат
bool(true)
bool(false)

Как читать этот вариант. В PHP 8.5.11 VECTOR определён, INTERVAL удалён, CLIENT_MULTI_QUERIES не экспортируется. Старый перечень имён не равен наличию каждого имени в вашей сборке.

Проверить константу без вызова новой возможностиСамостоятельный пример
<?php
var_dump(defined('MYSQLI_TYPE_VECTOR'));
var_dump(defined('MYSQLI_TYPE_INTERVAL'));
var_dump(defined('MYSQLI_CLIENT_MULTI_QUERIES'));
Ожидаемый результат
bool(true)
bool(false)
bool(false)

Весь справочник MySQLi: функции, объекты, свойства и aliases

Обе записи одной операции доступны в поиске отдельно. Карточка раскрывает назначение, параметры, возврат, ограничения и минимум два примера операции. Устаревшие/удалённые имена сохранены для чтения старых проектов с явной заменой; их наличие здесь не обещает работоспособность в PHP 8.5.11.

Процедурные функции

mysqli

mysqli_stmt

mysqli_result

mysqli_driver

mysqli_warning

mysqli_sql_exception

Частые практические затруднения и куда перейти

СитуацияСледующий шаг
Нужен товар по IDmysqli_execute_query разделяет SQL и значения.
Нужно выполнить один шаблон много разmysqli_prepare → mysqli_stmt_bind_param → mysqli_stmt_execute.
Commands out of syncmysqli_store_result / mysqli_use_result; у CALL обработать mysqli_stmt_next_result.
Ноль строк и NULL путаютсяmysqli_fetch_assoc / mysqli_fetch_column показывают разные признаки конца.
Ноль affected_rows при успешном UPDATEmysqli_affected_rows отличает найденные и изменённые строки.
Слишком много памяти при экспортеmysqli_use_result или ограниченные порции; не бесконечный fetch_all.
Кириллица/emoji теряютсяmysqli_set_charset плюс charset колонок и корректные исходные байты.
Нужен заказ из нескольких действийmysqli_begin_transaction → mysqli_commit / mysqli_rollback.
  • Обсуждение практической проблемы: После незавершённого потока нельзя отправлять другой SQL по тому же соединению; полный буфер или ограниченные порции решают разные задачи.
  • Обсуждение практической проблемы: get_result получают один раз и сохраняют объект; повторный get_result не является чтением того же буфера.
  • Обсуждение практической проблемы: bind_param требует ссылки; для обычного динамического списка в PHP 8.1+ удобен execute(array), а типизированные привязки остаются отдельным вариантом.
  • Обсуждение практической проблемы: Ноль affected_rows при записи прежнего значения не означает отказ SQL. Некоторые ответы в обсуждении ошибочно запрещают чтение affected_rows у statement; API это поддерживает.
  • Обсуждение практической проблемы: У JOIN одноимённые колонки теряются в ассоциативном ключе; назначьте разные SQL aliases. Старые mysql_* из обсуждения удалены и не используются в новых примерах.
  • Обсуждение практической проблемы: Исторически одного присутствия mysqlnd было мало: именно mysqli должна была использовать его. В PHP 8.2+ mysqlnd единственный вариант; всё равно проверяйте PHP веб-сервера отдельно от CLI.
  • Обсуждение практической проблемы: CALL может оставить несколько наборов и финальный статус: освободить лишь первую таблицу недостаточно. Обрабатывайте весь протокол, не скрывайте ошибку оператором @.

Обсуждения использованы как источник реально встречающихся вопросов; правила API сверены с официальными страницами и исходниками PHP 8.5.11. В старых ответах есть удалённые функции, неверные обобщения и настройки старых сборок — их не переносим без разбора. Следующий проект: отделите класс чтения каталога от HTTP-обработчика, передайте ему готовое соединение, проверьте право пользователя на товар, затем выдайте JSON или экранированный HTML. Класс помогает держать обязанности вместе, но не заменяет SQL-параметры, индексы и транзакции.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

mysqli_connectОткрыть соединение сайта с конкретной базой MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

new mysqli(?string $hostname=null, ?string $username=null, ?string $password=null, ?string $database=null, ?int $port=null, ?string $socket=null); mysqli_connect(...): mysqli|false

Подключиться к учебному MySQL и прочитать товар. new mysqli сразу устанавливает соединение. Параметры из config.php обозначают адрес, пользователя, пароль, существующую базу и порт. mysqli_connect даёт ту же возможность процедурно.

Данные и действие: mysqli_connect
  1. $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подключиться к учебному MySQL и прочитать товарПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Открыть соединение сайта с конкретной базой MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$hostnameАдрес/имя сервера, null берёт mysqli.default_host. p: перед именем включает persistent. На Unix localhost обычно выбирает сокет, 127.0.0.1 — TCP.
$username / $passwordУчётная запись MySQL; null использует mysqli.default_user/default_pw. Это не логин посетителя сайта.
$databaseБаза по умолчанию или null. Без неё SQL должен указывать схему либо вызвать select_db.
$portTCP-порт, null использует mysqli.default_port.
$socketПуть сокета/именованного канала или default_socket; сам аргумент не выбирает транспорт, это определяется hostname.

new mysqli с аргументами открывает соединение; без аргументов только инициализирует объект для options/real_connect. Конструктор возвращает объект даже при неуспехе в режиме без исключений: тогда проверяют connect_errno. mysqli_connect возвращает mysqli либо false. Метод connect возвращает true/false (до PHP 8.1 null при успехе). С PHP 8.5 повторный вызов __construct на уже сконструированном объекте — Error. Для настроек TLS/timeout сначала создайте пустой объект, задайте options, затем real_connect.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Адрес и учётные данные выбирают сервер и базу → Соединение сохраняется в $db → SQL выполняется через это соединение → Результат отдельно читается в PHP.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new создаёт объект соединения. query выполняет SQL, fetch_assoc превращает строку результата в массив; по ключу answer читаем её значение. Данные доступа здесь учебные.

Соединение и одно прочитанное значениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS answer');
echo $result->fetch_assoc()['answer'], "\n";
$db->close();
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Объект соединения теперь первый аргумент функции. Процедурный стиль не требует копировать SQL-логику и не имеет существенной разницы скорости с методами.

Та же работа через процедурные функцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
mysqli_set_charset($db, 'utf8mb4');
$result = mysqli_query($db, "SELECT 'Готово' AS status");
$row = mysqli_fetch_assoc($result);
echo $row['status'], "\n";
mysqli_close($db);
Ожидаемый результат
Готово

Связанные операции: mysqli_init, mysqli_real_connect, mysqli_set_charset.

Оба входа к этой операции: mysqli_connect, mysqli::__construct.

mysqli::__constructОткрыть соединение сайта с конкретной базой MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

new mysqli(?string $hostname=null, ?string $username=null, ?string $password=null, ?string $database=null, ?int $port=null, ?string $socket=null); mysqli_connect(...): mysqli|false

Подключиться к учебному MySQL и прочитать товар. new mysqli сразу устанавливает соединение. Параметры из config.php обозначают адрес, пользователя, пароль, существующую базу и порт. mysqli_connect даёт ту же возможность процедурно.

Данные и действие: mysqli::__construct
  1. $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подключиться к учебному MySQL и прочитать товарПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Открыть соединение сайта с конкретной базой MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$hostnameАдрес/имя сервера, null берёт mysqli.default_host. p: перед именем включает persistent. На Unix localhost обычно выбирает сокет, 127.0.0.1 — TCP.
$username / $passwordУчётная запись MySQL; null использует mysqli.default_user/default_pw. Это не логин посетителя сайта.
$databaseБаза по умолчанию или null. Без неё SQL должен указывать схему либо вызвать select_db.
$portTCP-порт, null использует mysqli.default_port.
$socketПуть сокета/именованного канала или default_socket; сам аргумент не выбирает транспорт, это определяется hostname.

new mysqli с аргументами открывает соединение; без аргументов только инициализирует объект для options/real_connect. Конструктор возвращает объект даже при неуспехе в режиме без исключений: тогда проверяют connect_errno. mysqli_connect возвращает mysqli либо false. Метод connect возвращает true/false (до PHP 8.1 null при успехе). С PHP 8.5 повторный вызов __construct на уже сконструированном объекте — Error. Для настроек TLS/timeout сначала создайте пустой объект, задайте options, затем real_connect.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Адрес и учётные данные выбирают сервер и базу → Соединение сохраняется в $db → SQL выполняется через это соединение → Результат отдельно читается в PHP.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new создаёт объект соединения. query выполняет SQL, fetch_assoc превращает строку результата в массив; по ключу answer читаем её значение. Данные доступа здесь учебные.

Соединение и одно прочитанное значениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS answer');
echo $result->fetch_assoc()['answer'], "\n";
$db->close();
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Объект соединения теперь первый аргумент функции. Процедурный стиль не требует копировать SQL-логику и не имеет существенной разницы скорости с методами.

Та же работа через процедурные функцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
mysqli_set_charset($db, 'utf8mb4');
$result = mysqli_query($db, "SELECT 'Готово' AS status");
$row = mysqli_fetch_assoc($result);
echo $row['status'], "\n";
mysqli_close($db);
Ожидаемый результат
Готово

Связанные операции: mysqli_init, mysqli_real_connect, mysqli_set_charset.

Оба входа к этой операции: mysqli_connect, mysqli::__construct.

mysqli::connectСоединить уже инициализированный mysqli с сервером.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli::connect(?string $hostname=null, ?string $username=null, ?string $password=null, ?string $database=null, ?int $port=null, ?string $socket=null): bool

Подключиться к учебному MySQL и прочитать товар. new mysqli сразу устанавливает соединение. Параметры из config.php обозначают адрес, пользователя, пароль, существующую базу и порт. mysqli_connect даёт ту же возможность процедурно.

Данные и действие: mysqli::connect
  1. $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подключиться к учебному MySQL и прочитать товарПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Соединить уже инициализированный mysqli с сервером.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$hostnameАдрес/имя сервера, null берёт mysqli.default_host. p: перед именем включает persistent. На Unix localhost обычно выбирает сокет, 127.0.0.1 — TCP.
$username / $passwordУчётная запись MySQL; null использует mysqli.default_user/default_pw. Это не логин посетителя сайта.
$databaseБаза по умолчанию или null. Без неё SQL должен указывать схему либо вызвать select_db.
$portTCP-порт, null использует mysqli.default_port.
$socketПуть сокета/именованного канала или default_socket; сам аргумент не выбирает транспорт, это определяется hostname.

new mysqli с аргументами открывает соединение; без аргументов только инициализирует объект для options/real_connect. Конструктор возвращает объект даже при неуспехе в режиме без исключений: тогда проверяют connect_errno. mysqli_connect возвращает mysqli либо false. Метод connect возвращает true/false (до PHP 8.1 null при успехе). С PHP 8.5 повторный вызов __construct на уже сконструированном объекте — Error. Для настроек TLS/timeout сначала создайте пустой объект, задайте options, затем real_connect.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. new mysqli без аргументов готовит объект → connect получает адрес и учётные данные → true подтверждает открытие; затем можно выполнять SQL.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для параметров открытия/флагов используйте real_connect. Метод connect — исторический дополнительный вход, а не повторный ручной запуск конструктора.

Открыть предварительно созданный объект методом connectПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli();
$ok = $db->connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
var_dump($ok);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
bool(true)
7

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Объект соединения теперь первый аргумент функции. Процедурный стиль не требует копировать SQL-логику и не имеет существенной разницы скорости с методами.

Та же работа через процедурные функцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
mysqli_set_charset($db, 'utf8mb4');
$result = mysqli_query($db, "SELECT 'Готово' AS status");
$row = mysqli_fetch_assoc($result);
echo $row['status'], "\n";
mysqli_close($db);
Ожидаемый результат
Готово

Связанные операции: mysqli_real_connect, mysqli_connect.

mysqli_initОтделить настройку будущего соединения от его открытия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_init(): mysqli|false; mysqli::init(): ?bool

Отделить создание объекта от сетевого подключения. mysqli_init создаёт объект настройки без соединения. После options нужно real_connect: один init ещё не даёт доступа к таблицам.

Данные и действие: mysqli_init
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Отделить создание объекта от сетевого подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Отделить настройку будущего соединения от его открытия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
АргументыНет.

Процедурный вызов даёт объект либо false. Объектный init даёт null/false и deprecated с PHP 8.1; в наследнике заменяют parent::init() на parent::__construct() без аргументов. До real_connect разрешены подготовительные options/ssl_set, операции запросов ещё невозможны. Это объект состояния, а не работающий сервер.

Путь данных. Инициализировать mysqli → Настроить timeout/TLS → real_connect открывает сервер → query становится доступен.

Как читать этот вариант. Инициализация ещё не доказывает доступность MySQL. Здесь сеть не используется: сохраняется опция для будущего соединения.

Создать объект без обращения к серверуСамостоятельный пример
<?php
$db = mysqli_init();
var_dump($db instanceof mysqli);
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. В новом коде new mysqli() заменяет устаревший объектный init. Процедурный mysqli_init по-прежнему поддерживается. READ_TIMEOUT в mysqlnd ограничивает ожидание результата, а не всё бизнес-действие.

Подготовить объект в стиле ООПСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 5));
echo "Настройка сохранена, подключения пока нет\n";
Ожидаемый результат
bool(true)
Настройка сохранена, подключения пока нет

Связанные операции: mysqli_options, mysqli_ssl_set, mysqli_real_connect.

Оба входа к этой операции: mysqli_init, mysqli::init.

mysqli::initОтделить настройку будущего соединения от его открытия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_init(): mysqli|false; mysqli::init(): ?bool

Отделить создание объекта от сетевого подключения. mysqli_init создаёт объект настройки без соединения. После options нужно real_connect: один init ещё не даёт доступа к таблицам.

Данные и действие: mysqli::init
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Отделить создание объекта от сетевого подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Отделить настройку будущего соединения от его открытия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
АргументыНет.

Процедурный вызов даёт объект либо false. Объектный init даёт null/false и deprecated с PHP 8.1; в наследнике заменяют parent::init() на parent::__construct() без аргументов. До real_connect разрешены подготовительные options/ssl_set, операции запросов ещё невозможны. Это объект состояния, а не работающий сервер.

Путь данных. Инициализировать mysqli → Настроить timeout/TLS → real_connect открывает сервер → query становится доступен.

Как читать этот вариант. Инициализация ещё не доказывает доступность MySQL. Здесь сеть не используется: сохраняется опция для будущего соединения.

Создать объект без обращения к серверуСамостоятельный пример
<?php
$db = mysqli_init();
var_dump($db instanceof mysqli);
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. В новом коде new mysqli() заменяет устаревший объектный init. Процедурный mysqli_init по-прежнему поддерживается. READ_TIMEOUT в mysqlnd ограничивает ожидание результата, а не всё бизнес-действие.

Подготовить объект в стиле ООПСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 5));
echo "Настройка сохранена, подключения пока нет\n";
Ожидаемый результат
bool(true)
Настройка сохранена, подключения пока нет

Связанные операции: mysqli_options, mysqli_ssl_set, mysqli_real_connect.

Оба входа к этой операции: mysqli_init, mysqli::init.

mysqli_real_connectОткрыть заранее настроенное соединение, в том числе с флагами протокола.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_connect(mysqli $mysql, ?string $hostname=null, ?string $username=null, ?string $password=null, ?string $database=null, ?int $port=null, ?string $socket=null, int $flags=0): bool; mysqli::real_connect(...): bool

Применить настройки до подключения. real_connect выполняет сетевой шаг после создания объекта и установки options. Три секунды относятся к ожиданию соединения, не к длительности каждого SELECT.

Данные и действие: mysqli_real_connect
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Применить настройки до подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Открыть заранее настроенное соединение, в том числе с флагами протокола.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlИнициализированный mysqli; первый аргумент только процедурной функции.
$hostnameАдрес/имя сервера, null берёт mysqli.default_host. p: перед именем включает persistent. На Unix localhost обычно выбирает сокет, 127.0.0.1 — TCP.
$username / $passwordУчётная запись MySQL; null использует mysqli.default_user/default_pw. Это не логин посетителя сайта.
$databaseБаза по умолчанию или null. Без неё SQL должен указывать схему либо вызвать select_db.
$portTCP-порт, null использует mysqli.default_port.
$socketПуть сокета/именованного канала или default_socket; сам аргумент не выбирает транспорт, это определяется hostname.
$flagsБитовое | флагов CLIENT_COMPRESS, FOUND_ROWS, IGNORE_SPACE, INTERACTIVE, SSL; подробности в константах.

true/false. Параметры nullable с PHP 7.4. MULTI_STATEMENT не включают флагом соединения в PHP: для нескольких команд есть отдельный multi_query. SSL_DONT_VERIFY_SERVER_CERT ослабляет проверку и не подходит как исправление неверного сертификата; транспорт/socket определяется hostname. Настройки должны быть сохранены до real_connect.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. mysqli_init создаёт пустой объект → options выбирает ожидание → real_connect открывает с нужными флагами → Команды используют согласованный режим.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Timeout выбирают до открытия. После него код не превращается в гарантированно трёхсекундный HTTP-ответ: SQL, обработка данных и сеть имеют другие границы.

Открыть соединение с ограничением ожиданияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. FOUND_ROWS считает совпавшую строку, хотя quantity не изменилось. Без флага для этого UPDATE счётчик обычно 0. Флаг выбирается осознанно, он не доказывает новое изменение.

Выбрать договор счётчика UPDATE при открытииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_real_connect($db, '127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306, null, MYSQLI_CLIENT_FOUND_ROWS);
$db->query('CREATE TEMPORARY TABLE course_stock (id INT PRIMARY KEY, quantity INT)');
$db->query('INSERT INTO course_stock VALUES (1, 2)');
$db->query('UPDATE course_stock SET quantity = 2 WHERE id = 1');
echo $db->affected_rows, "\n";
Ожидаемый результат
1

Связанные операции: mysqli_options, mysqli_ssl_set, mysqli_affected_rows.

Оба входа к этой операции: mysqli_real_connect, mysqli::real_connect.

mysqli::real_connectОткрыть заранее настроенное соединение, в том числе с флагами протокола.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_connect(mysqli $mysql, ?string $hostname=null, ?string $username=null, ?string $password=null, ?string $database=null, ?int $port=null, ?string $socket=null, int $flags=0): bool; mysqli::real_connect(...): bool

Применить настройки до подключения. real_connect выполняет сетевой шаг после создания объекта и установки options. Три секунды относятся к ожиданию соединения, не к длительности каждого SELECT.

Данные и действие: mysqli::real_connect
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Применить настройки до подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Открыть заранее настроенное соединение, в том числе с флагами протокола.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlИнициализированный mysqli; первый аргумент только процедурной функции.
$hostnameАдрес/имя сервера, null берёт mysqli.default_host. p: перед именем включает persistent. На Unix localhost обычно выбирает сокет, 127.0.0.1 — TCP.
$username / $passwordУчётная запись MySQL; null использует mysqli.default_user/default_pw. Это не логин посетителя сайта.
$databaseБаза по умолчанию или null. Без неё SQL должен указывать схему либо вызвать select_db.
$portTCP-порт, null использует mysqli.default_port.
$socketПуть сокета/именованного канала или default_socket; сам аргумент не выбирает транспорт, это определяется hostname.
$flagsБитовое | флагов CLIENT_COMPRESS, FOUND_ROWS, IGNORE_SPACE, INTERACTIVE, SSL; подробности в константах.

true/false. Параметры nullable с PHP 7.4. MULTI_STATEMENT не включают флагом соединения в PHP: для нескольких команд есть отдельный multi_query. SSL_DONT_VERIFY_SERVER_CERT ослабляет проверку и не подходит как исправление неверного сертификата; транспорт/socket определяется hostname. Настройки должны быть сохранены до real_connect.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. mysqli_init создаёт пустой объект → options выбирает ожидание → real_connect открывает с нужными флагами → Команды используют согласованный режим.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Timeout выбирают до открытия. После него код не превращается в гарантированно трёхсекундный HTTP-ответ: SQL, обработка данных и сеть имеют другие границы.

Открыть соединение с ограничением ожиданияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. FOUND_ROWS считает совпавшую строку, хотя quantity не изменилось. Без флага для этого UPDATE счётчик обычно 0. Флаг выбирается осознанно, он не доказывает новое изменение.

Выбрать договор счётчика UPDATE при открытииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_real_connect($db, '127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306, null, MYSQLI_CLIENT_FOUND_ROWS);
$db->query('CREATE TEMPORARY TABLE course_stock (id INT PRIMARY KEY, quantity INT)');
$db->query('INSERT INTO course_stock VALUES (1, 2)');
$db->query('UPDATE course_stock SET quantity = 2 WHERE id = 1');
echo $db->affected_rows, "\n";
Ожидаемый результат
1

Связанные операции: mysqli_options, mysqli_ssl_set, mysqli_affected_rows.

Оба входа к этой операции: mysqli_real_connect, mysqli::real_connect.

mysqli_optionsЗадать параметры соединения и mysqlnd до открытия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_options(mysqli $mysql, int $option, string|int $value): bool; mysqli::options(int $option, string|int $value): bool

Ограничить ожидание недоступного сервера. options/set_opt принимают имя настройки и значение до real_connect. В примере выбран CONNECT_TIMEOUT 3; после успешного подключения читаем обычный товар.

Данные и действие: mysqli_options
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Ограничить ожидание недоступного сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Задать параметры соединения и mysqlnd до открытия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlПустой mysqli после init/new.
$optionОдна из MYSQLI_OPT_*, MYSQLI_INIT_COMMAND и прочих строк таблицы констант.
$valueЗначение нужного типа: секунды, байты, строка SQL/пути/кодировки или 0/1.

true/false. Можно вызвать несколько раз; после init и до real_connect. READ_DEFAULT_FILE/GROUP относятся к libmysqlclient, mysqlnd не читает my.cnf. OPT_INT_AND_FLOAT_NATIVE, сетевые буферы — mysqlnd. MYSQLI_OPT_READ_TIMEOUT доступен с PHP 7.2: старая заметка общей конфигурационной страницы об отсутствии такого API не описывает современный options. Включение LOCAL INFILE разрешает чтение файлов PHP-процесса и требует отдельной политики доверия.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Выбрать смысл настройки → Передать значение с единицами → Сохранить до открытия → real_connect использует подготовленный объект.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Опция mysqlnd превращает подходящие числовые значения обычного query в PHP-числа. Для больших чисел/DECIMAL сохраняйте точность; опция не является универсальным преобразователем любых денежных строк.

Согласовать PHP-типы текстового протоколаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$row = $db->query('SELECT 42 AS quantity')->fetch_assoc();
var_dump($row['quantity']);
Ожидаемый результат
int(42)

Связанные операции: mysqli_real_connect, mysqli_set_charset.

Оба входа к этой операции: mysqli_options, mysqli::options.

mysqli::optionsЗадать параметры соединения и mysqlnd до открытия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_options(mysqli $mysql, int $option, string|int $value): bool; mysqli::options(int $option, string|int $value): bool

Ограничить ожидание недоступного сервера. options/set_opt принимают имя настройки и значение до real_connect. В примере выбран CONNECT_TIMEOUT 3; после успешного подключения читаем обычный товар.

Данные и действие: mysqli::options
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Ограничить ожидание недоступного сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Задать параметры соединения и mysqlnd до открытия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlПустой mysqli после init/new.
$optionОдна из MYSQLI_OPT_*, MYSQLI_INIT_COMMAND и прочих строк таблицы констант.
$valueЗначение нужного типа: секунды, байты, строка SQL/пути/кодировки или 0/1.

true/false. Можно вызвать несколько раз; после init и до real_connect. READ_DEFAULT_FILE/GROUP относятся к libmysqlclient, mysqlnd не читает my.cnf. OPT_INT_AND_FLOAT_NATIVE, сетевые буферы — mysqlnd. MYSQLI_OPT_READ_TIMEOUT доступен с PHP 7.2: старая заметка общей конфигурационной страницы об отсутствии такого API не описывает современный options. Включение LOCAL INFILE разрешает чтение файлов PHP-процесса и требует отдельной политики доверия.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Выбрать смысл настройки → Передать значение с единицами → Сохранить до открытия → real_connect использует подготовленный объект.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Опция mysqlnd превращает подходящие числовые значения обычного query в PHP-числа. Для больших чисел/DECIMAL сохраняйте точность; опция не является универсальным преобразователем любых денежных строк.

Согласовать PHP-типы текстового протоколаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$row = $db->query('SELECT 42 AS quantity')->fetch_assoc();
var_dump($row['quantity']);
Ожидаемый результат
int(42)

Связанные операции: mysqli_real_connect, mysqli_set_charset.

Оба входа к этой операции: mysqli_options, mysqli::options.

mysqli_set_optПрочитать старый код с альтернативным именем options.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_set_opt(mysqli $mysql, int $option, string|int $value): bool; mysqli::set_opt(int $option, string|int $value): bool

Ограничить ожидание недоступного сервера. options/set_opt принимают имя настройки и значение до real_connect. В примере выбран CONNECT_TIMEOUT 3; после успешного подключения читаем обычный товар.

Данные и действие: mysqli_set_opt
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Ограничить ожидание недоступного сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Прочитать старый код с альтернативным именем options.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
АргументыПолностью совпадают с mysqli_options.

Алиас mysqli_options: те же сроки вызова, параметры, return и ошибки. Новому коду удобнее единообразное options; два примера показывают целевую операцию, менять логику при переименовании не нужно.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. set_opt выбирает ту же операцию options → Параметры сохраняются до соединения → Открытие использует эти настройки.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Опция mysqlnd превращает подходящие числовые значения обычного query в PHP-числа. Для больших чисел/DECIMAL сохраняйте точность; опция не является универсальным преобразователем любых денежных строк.

Согласовать PHP-типы текстового протоколаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$row = $db->query('SELECT 42 AS quantity')->fetch_assoc();
var_dump($row['quantity']);
Ожидаемый результат
int(42)

Связанные операции: mysqli_options.

Оба входа к этой операции: mysqli_set_opt, mysqli::set_opt.

mysqli::set_optПрочитать старый код с альтернативным именем options.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_set_opt(mysqli $mysql, int $option, string|int $value): bool; mysqli::set_opt(int $option, string|int $value): bool

Ограничить ожидание недоступного сервера. options/set_opt принимают имя настройки и значение до real_connect. В примере выбран CONNECT_TIMEOUT 3; после успешного подключения читаем обычный товар.

Данные и действие: mysqli::set_opt
  1. $db = mysqli_init();
  2. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
  3. После выполнения: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Ограничить ожидание недоступного сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$db = mysqli_init();
$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Создание базы/пользователя и права описаны в README. mysqli_report выбирает исключения; отказ адреса, пароля и прав нужно обработать на границе приложения и не выводить секреты посетителю.

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

Прочитать старый код с альтернативным именем options.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
АргументыПолностью совпадают с mysqli_options.

Алиас mysqli_options: те же сроки вызова, параметры, return и ошибки. Новому коду удобнее единообразное options; два примера показывают целевую операцию, менять логику при переименовании не нужно.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. set_opt выбирает ту же операцию options → Параметры сохраняются до соединения → Открытие использует эти настройки.

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

Разделить ожидание соединения и чтенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3));
var_dump($db->options(MYSQLI_OPT_READ_TIMEOUT, 10));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Опция mysqlnd превращает подходящие числовые значения обычного query в PHP-числа. Для больших чисел/DECIMAL сохраняйте точность; опция не является универсальным преобразователем любых денежных строк.

Согласовать PHP-типы текстового протоколаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$db->real_connect('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$row = $db->query('SELECT 42 AS quantity')->fetch_assoc();
var_dump($row['quantity']);
Ожидаемый результат
int(42)

Связанные операции: mysqli_options.

Оба входа к этой операции: mysqli_set_opt, mysqli::set_opt.

mysqli_ssl_setНастроить TLS для передачи запросов и учётных данных.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_ssl_set(mysqli $mysql, ?string $key, ?string $certificate, ?string $ca_certificate, ?string $ca_path, ?string $cipher_algos): true; mysqli::ssl_set(?string $key, ?string $certificate, ?string $ca_certificate, ?string $ca_path, ?string $cipher_algos): true

Подготовить проверяемое TLS-соединение к базе. До real_connect задаётся доверенный корневой сертификат сервера. ssl_set только сохраняет параметры, поэтому его успех ещё не означает установленный TLS.

Данные и действие: mysqli_ssl_set
  1. $db->ssl_set(null, null, $ca, null, null)
  2. CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.
  3. После выполнения: После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить проверяемое TLS-соединение к базеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$ca = __DIR__ . '/certs/ca.pem';
if (!is_file($ca)) { throw new RuntimeException('Добавьте выданный администратором CA в certs/ca.pem'); }
$db = mysqli_init();
$db->ssl_set(null, null, $ca, null, null);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port'], null, MYSQLI_CLIENT_SSL);
$db->set_charset('utf8mb4');
$ssl = $db->query("SHOW STATUS LIKE 'Ssl_cipher'")->fetch_row();
if (!$ssl || $ssl[1] === '') { throw new RuntimeException('TLS не подтверждён'); }
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
После установки собственного доверенного CA и настройки MySQL TLS: Молоток8 шт.

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

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

Настроить TLS для передачи запросов и учётных данных.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$key / $certificateПуть закрытого ключа и сертификата клиента либо null.
$ca_certificate / $ca_pathФайл CA либо каталог доверенных сертификатов PEM.
$cipher_algosДопустимые алгоритмы шифрования, null для настроек библиотеки.

Всегда true; неверная конфигурация проявится при real_connect. Вызывается до соединения, без поддержки OpenSSL не выполняет нужной TLS-настройки. null значит отсутствие конкретного параметра, не отключение всех проверок. Закрытый ключ хранится с ограниченными правами и не в публичном каталоге.

Путь данных. ssl_set сохраняет доверенные файлы → real_connect выполняет TLS handshake → Сертификат подтверждает сервер → SQL передаётся по согласованному защищённому соединению.

Как читать этот вариант. ssl_set не открывает соединение и всегда возвращает true. Существование/пригодность CA подтвердится только при real_connect; успешный setter не доказывает шифрование.

Сохранить доверенные пути TLS до соединенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->ssl_set(null, null, '/etc/course-db/ca.pem', null, null));
echo "Пути заданы; TLS ещё не проверен\n";
Ожидаемый результат
bool(true)
Пути заданы; TLS ещё не проверен

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Помимо учебного MySQL нужны сертификаты, совпадающее имя сервера и TLS-политика сервера. Проверка cipher подтверждает согласование шифрования, но доверие строится проверкой сертификата и требований клиента/сервера, а не только этой строкой.

Подключить клиентский сертификат и проверить выбранный шифрПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli();
$db->ssl_set('/etc/course-db/client-key.pem', '/etc/course-db/client-cert.pem', '/etc/course-db/ca.pem', null, null);
$db->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, 1);
$db->real_connect('db.example.test', 'course_user', 'course_password', 'course_demo', 3306, null, MYSQLI_CLIENT_SSL);
$row = $db->query("SHOW SESSION STATUS LIKE 'Ssl_cipher'")->fetch_assoc();
if ($row['Value'] === '') { throw new RuntimeException('TLS не согласован'); }
echo "TLS согласован\n";
Ожидаемый результат
TLS согласован

Связанные операции: mysqli_real_connect, mysqli_options.

Оба входа к этой операции: mysqli_ssl_set, mysqli::ssl_set.

mysqli::ssl_setНастроить TLS для передачи запросов и учётных данных.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_ssl_set(mysqli $mysql, ?string $key, ?string $certificate, ?string $ca_certificate, ?string $ca_path, ?string $cipher_algos): true; mysqli::ssl_set(?string $key, ?string $certificate, ?string $ca_certificate, ?string $ca_path, ?string $cipher_algos): true

Подготовить проверяемое TLS-соединение к базе. До real_connect задаётся доверенный корневой сертификат сервера. ssl_set только сохраняет параметры, поэтому его успех ещё не означает установленный TLS.

Данные и действие: mysqli::ssl_set
  1. $db->ssl_set(null, null, $ca, null, null)
  2. CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.
  3. После выполнения: После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить проверяемое TLS-соединение к базеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$config = require __DIR__ . '/config.php';
$ca = __DIR__ . '/certs/ca.pem';
if (!is_file($ca)) { throw new RuntimeException('Добавьте выданный администратором CA в certs/ca.pem'); }
$db = mysqli_init();
$db->ssl_set(null, null, $ca, null, null);
$db->real_connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port'], null, MYSQLI_CLIENT_SSL);
$db->set_charset('utf8mb4');
$ssl = $db->query("SHOW STATUS LIKE 'Ssl_cipher'")->fetch_row();
if (!$ssl || $ssl[1] === '') { throw new RuntimeException('TLS не подтверждён'); }
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
После установки собственного доверенного CA и настройки MySQL TLS: Молоток8 шт.

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

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

Настроить TLS для передачи запросов и учётных данных.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$key / $certificateПуть закрытого ключа и сертификата клиента либо null.
$ca_certificate / $ca_pathФайл CA либо каталог доверенных сертификатов PEM.
$cipher_algosДопустимые алгоритмы шифрования, null для настроек библиотеки.

Всегда true; неверная конфигурация проявится при real_connect. Вызывается до соединения, без поддержки OpenSSL не выполняет нужной TLS-настройки. null значит отсутствие конкретного параметра, не отключение всех проверок. Закрытый ключ хранится с ограниченными правами и не в публичном каталоге.

Путь данных. ssl_set сохраняет доверенные файлы → real_connect выполняет TLS handshake → Сертификат подтверждает сервер → SQL передаётся по согласованному защищённому соединению.

Как читать этот вариант. ssl_set не открывает соединение и всегда возвращает true. Существование/пригодность CA подтвердится только при real_connect; успешный setter не доказывает шифрование.

Сохранить доверенные пути TLS до соединенияСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->ssl_set(null, null, '/etc/course-db/ca.pem', null, null));
echo "Пути заданы; TLS ещё не проверен\n";
Ожидаемый результат
bool(true)
Пути заданы; TLS ещё не проверен

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Помимо учебного MySQL нужны сертификаты, совпадающее имя сервера и TLS-политика сервера. Проверка cipher подтверждает согласование шифрования, но доверие строится проверкой сертификата и требований клиента/сервера, а не только этой строкой.

Подключить клиентский сертификат и проверить выбранный шифрПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli();
$db->ssl_set('/etc/course-db/client-key.pem', '/etc/course-db/client-cert.pem', '/etc/course-db/ca.pem', null, null);
$db->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, 1);
$db->real_connect('db.example.test', 'course_user', 'course_password', 'course_demo', 3306, null, MYSQLI_CLIENT_SSL);
$row = $db->query("SHOW SESSION STATUS LIKE 'Ssl_cipher'")->fetch_assoc();
if ($row['Value'] === '') { throw new RuntimeException('TLS не согласован'); }
echo "TLS согласован\n";
Ожидаемый результат
TLS согласован

Связанные операции: mysqli_real_connect, mysqli_options.

Оба входа к этой операции: mysqli_ssl_set, mysqli::ssl_set.

mysqli_set_charsetСогласовать кодировку данных между PHP и MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_set_charset(mysqli $mysql, string $charset): bool; mysqli::set_charset(string $charset): bool

Получить русское название без повреждённых символов. Кодировка соединения задаёт, как клиент и сервер обмениваются текстом. Это не кодировка HTML-страницы и не изменение старых повреждённых значений.

Данные и действие: mysqli_set_charset
  1. $db->set_charset('utf8mb4')
  2. Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить русское название без повреждённых символовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->set_charset('utf8mb4');
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не заменяйте настройку случайным SET NAMES: set_charset согласует и клиентскую библиотеку, включая экранирование. Для HTTP отдельно задайте charset UTF-8.

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

Согласовать кодировку данных между PHP и MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$charsetИмя набора символов MySQL, обычно utf8mb4 для современного Unicode.

true/false. Выбирайте сразу после открытия. Это кодировка соединения, а не перекодировка всех PHP-файлов и столбцов БД; ошибочные байты не исправляются магически. SET NAMES не заменяет вызов API для безопасности escape_string.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. PHP содержит текст Тетрадь 📘 → Соединение объявляет utf8mb4 → Параметр приходит в SQL без потери emoji → Чтение возвращает тот же текст.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. utf8mb4 может передавать четырёхбайтовые Unicode-символы. Кодировка таблицы/колонки также должна подходить: одна настройка соединения не переделывает старую latin1-схему.

Сохранить русское название без потери символовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ? AS name');
$s->execute(['Тетрадь 📘']);
echo $s->get_result()->fetch_assoc()['name'], "\n";
Ожидаемый результат
Тетрадь 📘

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. set_charset предпочтительнее ручного SET NAMES, потому что согласует состояние клиентского API, в том числе экранирования. Collation определяет сравнение/сортировку и не равна имени charset.

Явно подтвердить кодировку после подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_set_charset($db, 'utf8mb4');
echo mysqli_character_set_name($db), "\n";
Ожидаемый результат
utf8mb4

Связанные операции: mysqli_character_set_name, mysqli_get_charset, mysqli_real_escape_string.

Оба входа к этой операции: mysqli_set_charset, mysqli::set_charset.

mysqli::set_charsetСогласовать кодировку данных между PHP и MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_set_charset(mysqli $mysql, string $charset): bool; mysqli::set_charset(string $charset): bool

Получить русское название без повреждённых символов. Кодировка соединения задаёт, как клиент и сервер обмениваются текстом. Это не кодировка HTML-страницы и не изменение старых повреждённых значений.

Данные и действие: mysqli::set_charset
  1. $db->set_charset('utf8mb4')
  2. Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить русское название без повреждённых символовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->set_charset('utf8mb4');
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не заменяйте настройку случайным SET NAMES: set_charset согласует и клиентскую библиотеку, включая экранирование. Для HTTP отдельно задайте charset UTF-8.

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

Согласовать кодировку данных между PHP и MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$charsetИмя набора символов MySQL, обычно utf8mb4 для современного Unicode.

true/false. Выбирайте сразу после открытия. Это кодировка соединения, а не перекодировка всех PHP-файлов и столбцов БД; ошибочные байты не исправляются магически. SET NAMES не заменяет вызов API для безопасности escape_string.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. PHP содержит текст Тетрадь 📘 → Соединение объявляет utf8mb4 → Параметр приходит в SQL без потери emoji → Чтение возвращает тот же текст.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. utf8mb4 может передавать четырёхбайтовые Unicode-символы. Кодировка таблицы/колонки также должна подходить: одна настройка соединения не переделывает старую latin1-схему.

Сохранить русское название без потери символовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ? AS name');
$s->execute(['Тетрадь 📘']);
echo $s->get_result()->fetch_assoc()['name'], "\n";
Ожидаемый результат
Тетрадь 📘

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. set_charset предпочтительнее ручного SET NAMES, потому что согласует состояние клиентского API, в том числе экранирования. Collation определяет сравнение/сортировку и не равна имени charset.

Явно подтвердить кодировку после подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_set_charset($db, 'utf8mb4');
echo mysqli_character_set_name($db), "\n";
Ожидаемый результат
utf8mb4

Связанные операции: mysqli_character_set_name, mysqli_get_charset, mysqli_real_escape_string.

Оба входа к этой операции: mysqli_set_charset, mysqli::set_charset.

mysqli_character_set_nameПрочитать текущую кодировку соединения при диагностике текста.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_character_set_name(mysqli $mysql): string; mysqli::character_set_name(): string

Проверить кодировку перед импортом русских названий. Читаем текущую клиентскую настройку. get_charset возвращает объект сведений, character_set_name — непосредственно строку имени.

Данные и действие: mysqli_character_set_name
  1. $db->character_set_name()
  2. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить кодировку перед импортом русских названийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$charset = $db->character_set_name();
if ($charset !== 'utf8mb4') { throw new RuntimeException('Перед импортом нужен utf8mb4'); }
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверка соединения не подтверждает collation каждой колонки. Для сортировки и сравнения учитывайте схему, индексы и колляции сервера.

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

Прочитать текущую кодировку соединения при диагностике текста.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытое соединение в процедурной записи.

Строка имени текущего charset. Она не сообщает отдельно collation/кодировку всех таблиц и не доказывает, что входной PHP-текст действительно в UTF-8.

Путь данных. set_charset выбирает utf8mb4 → Getter читает имя → Имя сравнивают с договором интеграции.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. set_charset предпочтительнее ручного SET NAMES, потому что согласует состояние клиентского API, в том числе экранирования. Collation определяет сравнение/сортировку и не равна имени charset.

Явно подтвердить кодировку после подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_set_charset($db, 'utf8mb4');
echo mysqli_character_set_name($db), "\n";
Ожидаемый результат
utf8mb4

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. utf8mb4 может передавать четырёхбайтовые Unicode-символы. Кодировка таблицы/колонки также должна подходить: одна настройка соединения не переделывает старую latin1-схему.

Сохранить русское название без потери символовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ? AS name');
$s->execute(['Тетрадь 📘']);
echo $s->get_result()->fetch_assoc()['name'], "\n";
Ожидаемый результат
Тетрадь 📘

Связанные операции: mysqli_set_charset, mysqli_get_charset.

Оба входа к этой операции: mysqli_character_set_name, mysqli::character_set_name.

mysqli::character_set_nameПрочитать текущую кодировку соединения при диагностике текста.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_character_set_name(mysqli $mysql): string; mysqli::character_set_name(): string

Проверить кодировку перед импортом русских названий. Читаем текущую клиентскую настройку. get_charset возвращает объект сведений, character_set_name — непосредственно строку имени.

Данные и действие: mysqli::character_set_name
  1. $db->character_set_name()
  2. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить кодировку перед импортом русских названийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$charset = $db->character_set_name();
if ($charset !== 'utf8mb4') { throw new RuntimeException('Перед импортом нужен utf8mb4'); }
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверка соединения не подтверждает collation каждой колонки. Для сортировки и сравнения учитывайте схему, индексы и колляции сервера.

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

Прочитать текущую кодировку соединения при диагностике текста.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытое соединение в процедурной записи.

Строка имени текущего charset. Она не сообщает отдельно collation/кодировку всех таблиц и не доказывает, что входной PHP-текст действительно в UTF-8.

Путь данных. set_charset выбирает utf8mb4 → Getter читает имя → Имя сравнивают с договором интеграции.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. set_charset предпочтительнее ручного SET NAMES, потому что согласует состояние клиентского API, в том числе экранирования. Collation определяет сравнение/сортировку и не равна имени charset.

Явно подтвердить кодировку после подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_set_charset($db, 'utf8mb4');
echo mysqli_character_set_name($db), "\n";
Ожидаемый результат
utf8mb4

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. utf8mb4 может передавать четырёхбайтовые Unicode-символы. Кодировка таблицы/колонки также должна подходить: одна настройка соединения не переделывает старую latin1-схему.

Сохранить русское название без потери символовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ? AS name');
$s->execute(['Тетрадь 📘']);
echo $s->get_result()->fetch_assoc()['name'], "\n";
Ожидаемый результат
Тетрадь 📘

Связанные операции: mysqli_set_charset, mysqli_get_charset.

Оба входа к этой операции: mysqli_character_set_name, mysqli::character_set_name.

mysqli_get_charsetПолучить подробности текущего набора символов.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_charset(mysqli $mysql): ?object; mysqli::get_charset(): ?object

Проверить кодировку перед импортом русских названий. Читаем текущую клиентскую настройку. get_charset возвращает объект сведений, character_set_name — непосредственно строку имени.

Данные и действие: mysqli_get_charset
  1. $db->get_charset()
  2. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить кодировку перед импортом русских названийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$charset = $db->get_charset()->charset;
if ($charset !== 'utf8mb4') { throw new RuntimeException('Перед импортом нужен utf8mb4'); }
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверка соединения не подтверждает collation каждой колонки. Для сортировки и сравнения учитывайте схему, индексы и колляции сервера.

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

Получить подробности текущего набора символов.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение.

Объект (сигнатура допускает null): charset, collation, dir (путь описания или пусто для встроенного), min_length/max_length в байтах, number (внутренний номер), state (с 8.2 всегда 1). Названия свойств важнее их порядка. Для байтовых лимитов API это справка, а для числа букв нужны строковые функции Unicode.

Путь данных. Getter читает описание charset → PHP получает объект с min/max_length → Диагностика понимает границу байты/символы.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Размер указан в байтах, один символ может занимать несколько. strlen считает байты, а не обещанное число видимых букв.

Посмотреть размер символа и имя набораПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$charset = $db->get_charset();
echo $charset->charset, ':', $charset->min_length, ':', $charset->max_length, "\n";
Ожидаемый результат
utf8mb4:1:4

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Точное имя collation зависит от сервера/клиента. С PHP 8.2 state всегда 1; номер не предназначен для бизнес-логики.

Разделить набор символов и правило сравненияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$charset = mysqli_get_charset($db);
echo 'charset=', $charset->charset, "\n";
echo 'collation=', $charset->collation, "\n";
echo 'state=', $charset->state, "\n";
Ожидаемый результат
charset=utf8mb4
collation=<активная collation клиента>
state=1

Связанные операции: mysqli_character_set_name, mysqli_set_charset.

Оба входа к этой операции: mysqli_get_charset, mysqli::get_charset.

mysqli::get_charsetПолучить подробности текущего набора символов.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_charset(mysqli $mysql): ?object; mysqli::get_charset(): ?object

Проверить кодировку перед импортом русских названий. Читаем текущую клиентскую настройку. get_charset возвращает объект сведений, character_set_name — непосредственно строку имени.

Данные и действие: mysqli::get_charset
  1. $db->get_charset()
  2. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить кодировку перед импортом русских названийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$charset = $db->get_charset()->charset;
if ($charset !== 'utf8mb4') { throw new RuntimeException('Перед импортом нужен utf8mb4'); }
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверка соединения не подтверждает collation каждой колонки. Для сортировки и сравнения учитывайте схему, индексы и колляции сервера.

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

Получить подробности текущего набора символов.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение.

Объект (сигнатура допускает null): charset, collation, dir (путь описания или пусто для встроенного), min_length/max_length в байтах, number (внутренний номер), state (с 8.2 всегда 1). Названия свойств важнее их порядка. Для байтовых лимитов API это справка, а для числа букв нужны строковые функции Unicode.

Путь данных. Getter читает описание charset → PHP получает объект с min/max_length → Диагностика понимает границу байты/символы.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Размер указан в байтах, один символ может занимать несколько. strlen считает байты, а не обещанное число видимых букв.

Посмотреть размер символа и имя набораПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$charset = $db->get_charset();
echo $charset->charset, ':', $charset->min_length, ':', $charset->max_length, "\n";
Ожидаемый результат
utf8mb4:1:4

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Точное имя collation зависит от сервера/клиента. С PHP 8.2 state всегда 1; номер не предназначен для бизнес-логики.

Разделить набор символов и правило сравненияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$charset = mysqli_get_charset($db);
echo 'charset=', $charset->charset, "\n";
echo 'collation=', $charset->collation, "\n";
echo 'state=', $charset->state, "\n";
Ожидаемый результат
charset=utf8mb4
collation=<активная collation клиента>
state=1

Связанные операции: mysqli_character_set_name, mysqli_set_charset.

Оба входа к этой операции: mysqli_get_charset, mysqli::get_charset.

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

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_select_db(mysqli $mysql, string $database): bool; mysqli::select_db(string $database): bool

Выбрать учебную базу для следующих запросов. select_db меняет базу по умолчанию у соединения; не создаёт её и не переносит туда таблицы. Имя базы приходит из доверенной конфигурации.

Данные и действие: mysqli_select_db
  1. $db->select_db($config['database'])
  2. Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Выбрать учебную базу для следующих запросовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$config = require __DIR__ . '/config.php';
$db->select_db($config['database']);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Для разных приложений безопаснее явные отдельные соединения. Не выбирайте базу по произвольной строке посетителя; у пользователя должны быть только необходимые права.

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

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

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$databaseСуществующая доступная база MySQL.

true/false; действует на соединение и неквалифицированные имена последующих запросов. Если база задана конструктору и не меняется, отдельный вызов не нужен.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Открытое соединение выбирает course_demo → DATABASE() подтверждает текущую схему → Следующий неквалифицированный SELECT работает в ней.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выбор базы не создаёт её и не выдаёт пользователю дополнительные права. Имя задаёт конфигурация, не произвольный параметр HTTP.

Явно выбрать рабочую базу на открытом соединенииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->select_db('course_demo');
echo $db->query('SELECT DATABASE()')->fetch_column(), "\n";
Ожидаемый результат
course_demo

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для разных арендаторов нельзя выбирать любую базу по пользовательскому имени. Пул и состояние соединения требуют явного владения; квалифицированные имена схем остаются доверенными.

Вернуть ожидаемый контекст перед заданием workerПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_select_db($db, 'course_demo');
$result = mysqli_query($db, 'SELECT DATABASE() AS db_name, 42 AS item_id');
$row = mysqli_fetch_assoc($result);
echo $row['db_name'], ':', $row['item_id'], "\n";
Ожидаемый результат
course_demo:42

Связанные операции: mysqli_connect, mysqli_change_user.

Оба входа к этой операции: mysqli_select_db, mysqli::select_db.

mysqli::select_dbВыбрать схему по умолчанию для последующих запросов.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_select_db(mysqli $mysql, string $database): bool; mysqli::select_db(string $database): bool

Выбрать учебную базу для следующих запросов. select_db меняет базу по умолчанию у соединения; не создаёт её и не переносит туда таблицы. Имя базы приходит из доверенной конфигурации.

Данные и действие: mysqli::select_db
  1. $db->select_db($config['database'])
  2. Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Выбрать учебную базу для следующих запросовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$config = require __DIR__ . '/config.php';
$db->select_db($config['database']);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Для разных приложений безопаснее явные отдельные соединения. Не выбирайте базу по произвольной строке посетителя; у пользователя должны быть только необходимые права.

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

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

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$databaseСуществующая доступная база MySQL.

true/false; действует на соединение и неквалифицированные имена последующих запросов. Если база задана конструктору и не меняется, отдельный вызов не нужен.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Открытое соединение выбирает course_demo → DATABASE() подтверждает текущую схему → Следующий неквалифицированный SELECT работает в ней.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выбор базы не создаёт её и не выдаёт пользователю дополнительные права. Имя задаёт конфигурация, не произвольный параметр HTTP.

Явно выбрать рабочую базу на открытом соединенииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->select_db('course_demo');
echo $db->query('SELECT DATABASE()')->fetch_column(), "\n";
Ожидаемый результат
course_demo

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для разных арендаторов нельзя выбирать любую базу по пользовательскому имени. Пул и состояние соединения требуют явного владения; квалифицированные имена схем остаются доверенными.

Вернуть ожидаемый контекст перед заданием workerПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_select_db($db, 'course_demo');
$result = mysqli_query($db, 'SELECT DATABASE() AS db_name, 42 AS item_id');
$row = mysqli_fetch_assoc($result);
echo $row['db_name'], ':', $row['item_id'], "\n";
Ожидаемый результат
course_demo:42

Связанные операции: mysqli_connect, mysqli_change_user.

Оба входа к этой операции: mysqli_select_db, mysqli::select_db.

mysqli_change_userСменить MySQL-учётную запись и сбросить состояние соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_change_user(mysqli $mysql, string $username, string $password, ?string $database): bool; mysqli::change_user(string $username, string $password, ?string $database): bool

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

Данные и действие: mysqli_change_user
  1. $db->change_user($user, $password, $database)
  2. Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сменить серверную сессию и заново подготовить её данныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$config = require __DIR__ . '/config.php';
$db->change_user($config['user'], $config['password'], $config['database']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Смена пользователя не является способом переключить авторизованного посетителя сайта. HTTP-пользователь и серверный аккаунт БД — разные роли; потерю транзакции необходимо учитывать.

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

Сменить MySQL-учётную запись и сбросить состояние соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$username / $passwordДействительные учётные данные пользователя MySQL.
$databaseДоступная ему база; null/пусто — без default database.

true/false. При неудачной авторизации прежняя аутентификация сохраняется, в отличие от попытки открыть иное соединение через connect. Смена пользователя имеет эффекты сброса сессии: не вызывайте её посреди бизнес-транзакции. Логин посетителя приложения обычно не должен напрямую становиться пользователем MySQL.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущая сессия хранит @course_marker → change_user проводит аутентификацию/сброс → Старое состояние больше не используется → Приложение заново задаёт свою политику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Даже те же учётные данные запускают сброс состояния сессии. Начатая транзакция откатывается; временные таблицы и привязанные statements нельзя считать действующими после такого перехода.

Сбросить серверную переменную при смене сессииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SET @course_marker = 42');
$db->change_user('course_user', 'course_password', 'course_demo');
$db->set_charset('utf8mb4');
var_dump($db->query('SELECT @course_marker')->fetch_column());
Ожидаемый результат
NULL

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. null/пустое имя базы оставляет серверное соединение без default database; запрос к неквалифицированной таблице до select_db может отказать.

Открыть сессию без базы по умолчаниюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_change_user($db, 'course_user', 'course_password', null);
var_dump($db->query('SELECT DATABASE()')->fetch_column());
$db->select_db('course_demo');
echo $db->query('SELECT DATABASE()')->fetch_column(), "\n";
Ожидаемый результат
NULL
course_demo

Связанные операции: mysqli_select_db, mysqli_set_charset, mysqli_rollback.

Оба входа к этой операции: mysqli_change_user, mysqli::change_user.

mysqli::change_userСменить MySQL-учётную запись и сбросить состояние соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_change_user(mysqli $mysql, string $username, string $password, ?string $database): bool; mysqli::change_user(string $username, string $password, ?string $database): bool

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

Данные и действие: mysqli::change_user
  1. $db->change_user($user, $password, $database)
  2. Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сменить серверную сессию и заново подготовить её данныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$config = require __DIR__ . '/config.php';
$db->change_user($config['user'], $config['password'], $config['database']);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Смена пользователя не является способом переключить авторизованного посетителя сайта. HTTP-пользователь и серверный аккаунт БД — разные роли; потерю транзакции необходимо учитывать.

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

Сменить MySQL-учётную запись и сбросить состояние соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$username / $passwordДействительные учётные данные пользователя MySQL.
$databaseДоступная ему база; null/пусто — без default database.

true/false. При неудачной авторизации прежняя аутентификация сохраняется, в отличие от попытки открыть иное соединение через connect. Смена пользователя имеет эффекты сброса сессии: не вызывайте её посреди бизнес-транзакции. Логин посетителя приложения обычно не должен напрямую становиться пользователем MySQL.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущая сессия хранит @course_marker → change_user проводит аутентификацию/сброс → Старое состояние больше не используется → Приложение заново задаёт свою политику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Даже те же учётные данные запускают сброс состояния сессии. Начатая транзакция откатывается; временные таблицы и привязанные statements нельзя считать действующими после такого перехода.

Сбросить серверную переменную при смене сессииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SET @course_marker = 42');
$db->change_user('course_user', 'course_password', 'course_demo');
$db->set_charset('utf8mb4');
var_dump($db->query('SELECT @course_marker')->fetch_column());
Ожидаемый результат
NULL

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. null/пустое имя базы оставляет серверное соединение без default database; запрос к неквалифицированной таблице до select_db может отказать.

Открыть сессию без базы по умолчаниюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_change_user($db, 'course_user', 'course_password', null);
var_dump($db->query('SELECT DATABASE()')->fetch_column());
$db->select_db('course_demo');
echo $db->query('SELECT DATABASE()')->fetch_column(), "\n";
Ожидаемый результат
NULL
course_demo

Связанные операции: mysqli_select_db, mysqli_set_charset, mysqli_rollback.

Оба входа к этой операции: mysqli_change_user, mysqli::change_user.

mysqli_closeЗакончить использование соединения, когда запросов больше не будет.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_close(mysqli $mysql): true; mysqli::close(): true

Сохранить строку и закончить работу с соединением. После чтения массив независим от подключения. close завершает обычное соединение; для persistent-соединения действуют правила пула.

Данные и действие: mysqli_close
  1. $db->close()
  2. Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить строку и закончить работу с соединениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не путайте close с commit. Завершайте транзакцию явно; временный каталог этой демонстрации исчезает после физического закрытия сессии.

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

Закончить использование соединения, когда запросов больше не будет.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытый mysqli.

С PHP 8.0 всегда true при нормальном вызове; закрытый/неподходящий объект — Error. Обычные соединения/результаты освобождаются при уничтожении объектов; явное закрытие полезно до длинной последующей работы. Persistent не закрывается физически: возвращается в пул, поведение очистки описано отдельно.

Путь данных. Запрос получил буфер строк → close завершает использование соединения → PHP обрабатывает свой буфер → free освобождает результат.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Обычный query буферизовал результат; его можно обработать после закрытия. Для MYSQLI_USE_RESULT нужен живой серверный поток и такой порядок не подходит.

Закрыть соединение и обработать уже полученные данныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
$db->close();
foreach ($result as $row) { echo $row['name'], "\n"; }
$result->free();
Ожидаемый результат
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. finally не заменяет rollback незавершённого действия, но делает срок владения ясным. Не вызывайте close повторно у уже закрытого объекта.

Освободить соединение после ограниченной работыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    echo $db->query('SELECT 42')->fetch_column(), "\n";
} finally {
    mysqli_close($db);
}
echo "Дальше работа без БД\n";
Ожидаемый результат
42
Дальше работа без БД

Связанные операции: mysqli_free_result, mysqli_connect.

Оба входа к этой операции: mysqli_close, mysqli::close.

mysqli::closeЗакончить использование соединения, когда запросов больше не будет.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_close(mysqli $mysql): true; mysqli::close(): true

Сохранить строку и закончить работу с соединением. После чтения массив независим от подключения. close завершает обычное соединение; для persistent-соединения действуют правила пула.

Данные и действие: mysqli::close
  1. $db->close()
  2. Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить строку и закончить работу с соединениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не путайте close с commit. Завершайте транзакцию явно; временный каталог этой демонстрации исчезает после физического закрытия сессии.

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

Закончить использование соединения, когда запросов больше не будет.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытый mysqli.

С PHP 8.0 всегда true при нормальном вызове; закрытый/неподходящий объект — Error. Обычные соединения/результаты освобождаются при уничтожении объектов; явное закрытие полезно до длинной последующей работы. Persistent не закрывается физически: возвращается в пул, поведение очистки описано отдельно.

Путь данных. Запрос получил буфер строк → close завершает использование соединения → PHP обрабатывает свой буфер → free освобождает результат.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Обычный query буферизовал результат; его можно обработать после закрытия. Для MYSQLI_USE_RESULT нужен живой серверный поток и такой порядок не подходит.

Закрыть соединение и обработать уже полученные данныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
$db->close();
foreach ($result as $row) { echo $row['name'], "\n"; }
$result->free();
Ожидаемый результат
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. finally не заменяет rollback незавершённого действия, но делает срок владения ясным. Не вызывайте close повторно у уже закрытого объекта.

Освободить соединение после ограниченной работыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    echo $db->query('SELECT 42')->fetch_column(), "\n";
} finally {
    mysqli_close($db);
}
echo "Дальше работа без БД\n";
Ожидаемый результат
42
Дальше работа без БД

Связанные операции: mysqli_free_result, mysqli_connect.

Оба входа к этой операции: mysqli_close, mysqli::close.

mysqli_queryВыполнить один SQL-запрос и получить строки либо подтверждение действия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool; mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

Показать список товаров из фиксированного SQL. query отправляет команду; SELECT даёт mysqli_result. Для результата записи возвращается статус, поэтому один и тот же тип нельзя предполагать для всякого SQL.

Данные и действие: mysqli_query
  1. $db->query('SELECT name, stock FROM products ORDER BY id')
  2. Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать список товаров из фиксированного SQLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Внешний номер/название не склеивайте в SQL. Для одной параметризованной команды есть execute_query PHP 8.2+, для повторов prepare/execute.

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

Выполнить один SQL-запрос и получить строки либо подтверждение действия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдин SQL-запрос; не соединяйте с ним необработанные данные формы.
$result_modeMYSQLI_STORE_RESULT буферизует; MYSQLI_USE_RESULT читает поток; MYSQLI_ASYNC (mysqlnd) запускает асинхронно, можно сочетать с режимом результата.

SELECT/SHOW/DESCRIBE/EXPLAIN дают mysqli_result, успешные команды без набора — true, ошибка — false либо исключение. Буфер удобен для небольшого каталога, но требует памяти; поток держит соединение занятым до полного чтения/освобождения. Размер запроса ограничен max_allowed_packet: превышение может дать 1153 или 2006 в зависимости от клиента/платформы. С PHP 8.4 и MySQL 8.0.24+ истёкший wait_timeout может сообщаться кодом 4031 вместо 2006.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. PHP отправляет SELECT → MySQL вычисляет строки → query возвращает объект результата → fetch_assoc извлекает значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. SELECT просит сервер вычислить значение. AS подписывает колонку, query возвращает объект набора строк, fetch_assoc читает одну строку в массив, ключ item_id берётся из AS. Это четыре разных действия, а не возврат числа непосредственно из query.

Один запрос: получить числоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS item_id');
$row = $result->fetch_assoc();
echo $row['item_id'], "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. while повторяет чтение до null. Без ORDER BY порядок строк не обещан. SQL здесь целиком постоянный; пользовательские значения передаются через prepare или execute_query.

Список товаров с понятным порядкомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = mysqli_query($db, 'SELECT name, price FROM course_products ORDER BY price, id');
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'], ':', $row['price'], "\n";
}
Ожидаемый результат
Pen:120
Box:200
Notebook:350

Связанные операции: mysqli_execute_query, mysqli_prepare, mysqli_real_query, mysqli_fetch_assoc.

Оба входа к этой операции: mysqli_query, mysqli::query.

mysqli::queryВыполнить один SQL-запрос и получить строки либо подтверждение действия.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool; mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool

Показать список товаров из фиксированного SQL. query отправляет команду; SELECT даёт mysqli_result. Для результата записи возвращается статус, поэтому один и тот же тип нельзя предполагать для всякого SQL.

Данные и действие: mysqli::query
  1. $db->query('SELECT name, stock FROM products ORDER BY id')
  2. Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать список товаров из фиксированного SQLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Внешний номер/название не склеивайте в SQL. Для одной параметризованной команды есть execute_query PHP 8.2+, для повторов prepare/execute.

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

Выполнить один SQL-запрос и получить строки либо подтверждение действия.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдин SQL-запрос; не соединяйте с ним необработанные данные формы.
$result_modeMYSQLI_STORE_RESULT буферизует; MYSQLI_USE_RESULT читает поток; MYSQLI_ASYNC (mysqlnd) запускает асинхронно, можно сочетать с режимом результата.

SELECT/SHOW/DESCRIBE/EXPLAIN дают mysqli_result, успешные команды без набора — true, ошибка — false либо исключение. Буфер удобен для небольшого каталога, но требует памяти; поток держит соединение занятым до полного чтения/освобождения. Размер запроса ограничен max_allowed_packet: превышение может дать 1153 или 2006 в зависимости от клиента/платформы. С PHP 8.4 и MySQL 8.0.24+ истёкший wait_timeout может сообщаться кодом 4031 вместо 2006.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. PHP отправляет SELECT → MySQL вычисляет строки → query возвращает объект результата → fetch_assoc извлекает значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. SELECT просит сервер вычислить значение. AS подписывает колонку, query возвращает объект набора строк, fetch_assoc читает одну строку в массив, ключ item_id берётся из AS. Это четыре разных действия, а не возврат числа непосредственно из query.

Один запрос: получить числоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS item_id');
$row = $result->fetch_assoc();
echo $row['item_id'], "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. while повторяет чтение до null. Без ORDER BY порядок строк не обещан. SQL здесь целиком постоянный; пользовательские значения передаются через prepare или execute_query.

Список товаров с понятным порядкомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = mysqli_query($db, 'SELECT name, price FROM course_products ORDER BY price, id');
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'], ':', $row['price'], "\n";
}
Ожидаемый результат
Pen:120
Box:200
Notebook:350

Связанные операции: mysqli_execute_query, mysqli_prepare, mysqli_real_query, mysqli_fetch_assoc.

Оба входа к этой операции: mysqli_query, mysqli::query.

mysqli_real_queryОтправить один запрос, оставив выбор буферизации следующему шагу.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_query(mysqli $mysql, string $query): bool; mysqli::real_query(string $query): bool

Разделить отправку команды и получение её строк. real_query выполняет SQL, но не создаёт удобный mysqli_result автоматически. После SELECT выбирают store_result или use_result.

Данные и действие: mysqli_real_query
  1. $db->real_query($sql)
  2. Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разделить отправку команды и получение её строкПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->store_result();
if ($result === false) { throw new RuntimeException('Ответ каталога не получен'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Если команда не должна возвращать колонки, отсутствие result нормально. Различайте это по field_count и статусу команды; не выполняйте следующий запрос, бросив активный ответ.

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

Отправить один запрос, оставив выбор буферизации следующему шагу.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна законченная SQL-команда.

true означает успешное выполнение, а не сами данные; false/исключение — отказ. До следующего запроса обработайте ожидаемый результат через store_result/use_result. Несколько команд через точку с запятой относятся к multi_query и иной политике безопасности.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. real_query отправляет SQL → field_count показывает наличие колонок → store_result/use_result забирает данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_query подтверждает выполнение; строки отдельно забирает store_result или use_result. Это полезно, когда обёртка выбирает способ чтения после отправки.

Разделить выполнение и получение строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 12 AS quantity');
$result = $db->store_result();
echo $result->fetch_assoc()['quantity'], "\n";
Ожидаемый результат
12

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. field_count описывает количество колонок последнего запроса. У UPDATE нет строк результата, но есть affected_rows; false от store_result в этом случае не означает автоматически SQL-ошибку.

Распознать команду без набора строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'UPDATE course_products SET price = 130 WHERE id = 1');
if (mysqli_field_count($db) === 0) {
    echo 'Изменено:', mysqli_affected_rows($db), "\n";
}
Ожидаемый результат
Изменено:1

Связанные операции: mysqli_store_result, mysqli_use_result, mysqli_field_count.

Оба входа к этой операции: mysqli_real_query, mysqli::real_query.

mysqli::real_queryОтправить один запрос, оставив выбор буферизации следующему шагу.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_query(mysqli $mysql, string $query): bool; mysqli::real_query(string $query): bool

Разделить отправку команды и получение её строк. real_query выполняет SQL, но не создаёт удобный mysqli_result автоматически. После SELECT выбирают store_result или use_result.

Данные и действие: mysqli::real_query
  1. $db->real_query($sql)
  2. Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разделить отправку команды и получение её строкПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->store_result();
if ($result === false) { throw new RuntimeException('Ответ каталога не получен'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Если команда не должна возвращать колонки, отсутствие result нормально. Различайте это по field_count и статусу команды; не выполняйте следующий запрос, бросив активный ответ.

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

Отправить один запрос, оставив выбор буферизации следующему шагу.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна законченная SQL-команда.

true означает успешное выполнение, а не сами данные; false/исключение — отказ. До следующего запроса обработайте ожидаемый результат через store_result/use_result. Несколько команд через точку с запятой относятся к multi_query и иной политике безопасности.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. real_query отправляет SQL → field_count показывает наличие колонок → store_result/use_result забирает данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_query подтверждает выполнение; строки отдельно забирает store_result или use_result. Это полезно, когда обёртка выбирает способ чтения после отправки.

Разделить выполнение и получение строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 12 AS quantity');
$result = $db->store_result();
echo $result->fetch_assoc()['quantity'], "\n";
Ожидаемый результат
12

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. field_count описывает количество колонок последнего запроса. У UPDATE нет строк результата, но есть affected_rows; false от store_result в этом случае не означает автоматически SQL-ошибку.

Распознать команду без набора строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'UPDATE course_products SET price = 130 WHERE id = 1');
if (mysqli_field_count($db) === 0) {
    echo 'Изменено:', mysqli_affected_rows($db), "\n";
}
Ожидаемый результат
Изменено:1

Связанные операции: mysqli_store_result, mysqli_use_result, mysqli_field_count.

Оба входа к этой операции: mysqli_real_query, mysqli::real_query.

mysqli_execute_queryКратко выполнить подготовленный запрос с отдельным списком значений.

PHP 8.2+ · mysqli; mysqlnd для отмеченных операций

mysqli_execute_query(mysqli $mysql, string $query, ?array $params = null): mysqli_result|bool; mysqli::execute_query(string $query, ?array $params = null): mysqli_result|bool

Найти товар одним вызовом с параметрами. PHP 8.2+: вспомогательный метод выполняет prepare→execute→получение результата. Знак ? обозначает одно значение, массив[2] передаёт номер товара.

Данные и действие: mysqli_execute_query
  1. $db->execute_query('... WHERE id = ?', [2])
  2. Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар одним вызовом с параметрамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [2]);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для многократного одинакового SQL выгоднее явно сохранить statement, но ускорение измеряют. execute_query не параметризует имена таблиц/ORDER BY и не делает проверки прав.

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

Кратко выполнить подготовленный запрос с отдельным списком значений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдин SQL-шаблон с ? вместо полных значений.
$paramsnull при отсутствии параметров либо список с точным числом значений; значения передаются как строки, null остаётся SQL NULL.

Доступно с PHP 8.2: сокращение prepare → bind/execute → get_result. Объект statement наружу не возвращается; сведения affected_rows/ошибки копируются на соединение. Для набора строк возвращает mysqli_result, иначе true; отказ false/исключение. Нельзя заменить ? именем столбца или частью кавычек. Учитывайте серверный max_allowed_packet, включая платформенные различия кодов ошибки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. ? фиксирует место цены → Массив поставляет 390 и 2 → Сервер выполняет подготовленную команду → Результат/статус возвращается вызывающему коду.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ? — место одного значения. SQL-шаблон и список значений передаются отдельно: строка посетителя не становится частью синтаксиса SQL. Метод сам готовит statement и возвращает результат.

Найти товар по переданному IDПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->execute_query('SELECT name FROM course_products WHERE id = ?', [2]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
Notebook

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Порядок параметров совпадает с порядком вопросов: сначала новая цена, затем ID. Имена таблиц/колонок таким способом не подставляются. Для многократных выполнений одного шаблона выгоднее сохранить prepare-объект.

Изменить цену двумя параметрамиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [390, 2]);
echo mysqli_affected_rows($db), "\n";
echo $db->query('SELECT price FROM course_products WHERE id = 2')->fetch_column(), "\n";
Ожидаемый результат
1
390

Связанные операции: mysqli_prepare, mysqli_stmt_execute, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_execute_query, mysqli::execute_query.

mysqli::execute_queryКратко выполнить подготовленный запрос с отдельным списком значений.

PHP 8.2+ · mysqli; mysqlnd для отмеченных операций

mysqli_execute_query(mysqli $mysql, string $query, ?array $params = null): mysqli_result|bool; mysqli::execute_query(string $query, ?array $params = null): mysqli_result|bool

Найти товар одним вызовом с параметрами. PHP 8.2+: вспомогательный метод выполняет prepare→execute→получение результата. Знак ? обозначает одно значение, массив[2] передаёт номер товара.

Данные и действие: mysqli::execute_query
  1. $db->execute_query('... WHERE id = ?', [2])
  2. Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар одним вызовом с параметрамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [2]);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для многократного одинакового SQL выгоднее явно сохранить statement, но ускорение измеряют. execute_query не параметризует имена таблиц/ORDER BY и не делает проверки прав.

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

Кратко выполнить подготовленный запрос с отдельным списком значений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдин SQL-шаблон с ? вместо полных значений.
$paramsnull при отсутствии параметров либо список с точным числом значений; значения передаются как строки, null остаётся SQL NULL.

Доступно с PHP 8.2: сокращение prepare → bind/execute → get_result. Объект statement наружу не возвращается; сведения affected_rows/ошибки копируются на соединение. Для набора строк возвращает mysqli_result, иначе true; отказ false/исключение. Нельзя заменить ? именем столбца или частью кавычек. Учитывайте серверный max_allowed_packet, включая платформенные различия кодов ошибки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. ? фиксирует место цены → Массив поставляет 390 и 2 → Сервер выполняет подготовленную команду → Результат/статус возвращается вызывающему коду.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ? — место одного значения. SQL-шаблон и список значений передаются отдельно: строка посетителя не становится частью синтаксиса SQL. Метод сам готовит statement и возвращает результат.

Найти товар по переданному IDПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->execute_query('SELECT name FROM course_products WHERE id = ?', [2]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
Notebook

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Порядок параметров совпадает с порядком вопросов: сначала новая цена, затем ID. Имена таблиц/колонок таким способом не подставляются. Для многократных выполнений одного шаблона выгоднее сохранить prepare-объект.

Изменить цену двумя параметрамиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [390, 2]);
echo mysqli_affected_rows($db), "\n";
echo $db->query('SELECT price FROM course_products WHERE id = 2')->fetch_column(), "\n";
Ожидаемый результат
1
390

Связанные операции: mysqli_prepare, mysqli_stmt_execute, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_execute_query, mysqli::execute_query.

mysqli_prepareПолучить команду, которую можно безопасно выполнять с разными данными.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_prepare(mysqli $mysql, string $query): mysqli_stmt|false; mysqli::prepare(string $query): mysqli_stmt|false

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli_prepare
  1. $stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Получить команду, которую можно безопасно выполнять с разными данными.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна поддерживаемая сервером SQL-команда; ? только в разрешённых местах значений.

Возвращает mysqli_stmt или false/исключение. Не выполняет SQL сразу. В MySQLi нет именованных :name-параметров PDO. Нельзя параметризовать SQL-ключевые слова, имена таблиц или колонок. После подготовки bind_param+execute либо execute(array) с PHP 8.1; затем get_result или bind_result+fetch. Каждый statement удерживает ресурсы до закрытия.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Шаблон проходит prepare → Объект хранит подготовленную команду → execute передаёт значения → fetch читает новый результат.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. prepare разбирает шаблон, execute подаёт данные. Здесь execute(array) требует PHP 8.1+. Подготовка добавляет отдельный сетевой шаг, поэтому не нужно утверждать, что любой единичный запрос от неё быстрее.

Подготовить один поиск и использовать дваждыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
foreach ([1, 3] as $id) {
    $statement->execute([$id]);
    echo $statement->get_result()->fetch_column(), "\n";
}
Ожидаемый результат
Pen
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не добавляйте кавычки вокруг ? и не экранируйте параметр заранее: драйвер передаст значение как данные. Подготовка защищает значения, но разрешения приложения и проверку цены всё равно пишет разработчик.

Название с апострофом остаётся даннымиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_prepare($db, 'INSERT INTO course_products VALUES (?, ?, ?)');
mysqli_stmt_execute($statement, [4, "Reader's book", 500]);
echo $db->query('SELECT name FROM course_products WHERE id = 4')->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_execute, mysqli_stmt_close.

Оба входа к этой операции: mysqli_prepare, mysqli::prepare.

mysqli::prepareПолучить команду, которую можно безопасно выполнять с разными данными.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_prepare(mysqli $mysql, string $query): mysqli_stmt|false; mysqli::prepare(string $query): mysqli_stmt|false

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli::prepare
  1. $stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Получить команду, которую можно безопасно выполнять с разными данными.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна поддерживаемая сервером SQL-команда; ? только в разрешённых местах значений.

Возвращает mysqli_stmt или false/исключение. Не выполняет SQL сразу. В MySQLi нет именованных :name-параметров PDO. Нельзя параметризовать SQL-ключевые слова, имена таблиц или колонок. После подготовки bind_param+execute либо execute(array) с PHP 8.1; затем get_result или bind_result+fetch. Каждый statement удерживает ресурсы до закрытия.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Шаблон проходит prepare → Объект хранит подготовленную команду → execute передаёт значения → fetch читает новый результат.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. prepare разбирает шаблон, execute подаёт данные. Здесь execute(array) требует PHP 8.1+. Подготовка добавляет отдельный сетевой шаг, поэтому не нужно утверждать, что любой единичный запрос от неё быстрее.

Подготовить один поиск и использовать дваждыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
foreach ([1, 3] as $id) {
    $statement->execute([$id]);
    echo $statement->get_result()->fetch_column(), "\n";
}
Ожидаемый результат
Pen
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не добавляйте кавычки вокруг ? и не экранируйте параметр заранее: драйвер передаст значение как данные. Подготовка защищает значения, но разрешения приложения и проверку цены всё равно пишет разработчик.

Название с апострофом остаётся даннымиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_prepare($db, 'INSERT INTO course_products VALUES (?, ?, ?)');
mysqli_stmt_execute($statement, [4, "Reader's book", 500]);
echo $db->query('SELECT name FROM course_products WHERE id = 4')->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_execute, mysqli_stmt_close.

Оба входа к этой операции: mysqli_prepare, mysqli::prepare.

mysqli_stmt_initСоздать пустой объект подготовленной команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_init(mysqli $mysql): mysqli_stmt|false; mysqli::stmt_init(): mysqli_stmt|false

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli_stmt_init
  1. $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->stmt_init();
$stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Создать пустой объект подготовленной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытое соединение, которому принадлежит команда.

mysqli_stmt либо false. До execute нужно вызвать prepare на statement. Не путать с mysqli_init: тот выделяет соединение, этот — команду внутри соединения.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Соединение создаёт statement → stmt::prepare задаёт SQL → stmt::execute запускает.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выделенный объект ещё не содержит подготовленного SQL. Это промежуточный шаг для обёртки, которая создаёт команду отдельно от шаблона.

Сначала выделить statement, затем задать SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->stmt_init();
$statement->prepare('SELECT 42');
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Если предварительная настройка не нужна, $db->prepare(...) сразу делает выделение и подготовку, сокращая код без изменения подхода.

Настроить команду в процедурной формеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_stmt_init($db);
mysqli_stmt_prepare($statement, 'SELECT name FROM course_products WHERE id = ?');
mysqli_stmt_execute($statement, [3]);
echo mysqli_stmt_get_result($statement)->fetch_column(), "\n";
Ожидаемый результат
Box

Связанные операции: mysqli_prepare, mysqli_stmt_prepare.

Оба входа к этой операции: mysqli_stmt_init, mysqli::stmt_init.

mysqli::stmt_initСоздать пустой объект подготовленной команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_init(mysqli $mysql): mysqli_stmt|false; mysqli::stmt_init(): mysqli_stmt|false

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli::stmt_init
  1. $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->stmt_init();
$stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Создать пустой объект подготовленной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытое соединение, которому принадлежит команда.

mysqli_stmt либо false. До execute нужно вызвать prepare на statement. Не путать с mysqli_init: тот выделяет соединение, этот — команду внутри соединения.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Соединение создаёт statement → stmt::prepare задаёт SQL → stmt::execute запускает.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выделенный объект ещё не содержит подготовленного SQL. Это промежуточный шаг для обёртки, которая создаёт команду отдельно от шаблона.

Сначала выделить statement, затем задать SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->stmt_init();
$statement->prepare('SELECT 42');
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Если предварительная настройка не нужна, $db->prepare(...) сразу делает выделение и подготовку, сокращая код без изменения подхода.

Настроить команду в процедурной формеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_stmt_init($db);
mysqli_stmt_prepare($statement, 'SELECT name FROM course_products WHERE id = ?');
mysqli_stmt_execute($statement, [3]);
echo mysqli_stmt_get_result($statement)->fetch_column(), "\n";
Ожидаемый результат
Box

Связанные операции: mysqli_prepare, mysqli_stmt_prepare.

Оба входа к этой операции: mysqli_stmt_init, mysqli::stmt_init.

mysqli_store_resultЗабрать весь набор результата real_query/multi_query в память PHP-клиента.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_store_result(mysqli $mysql, int $mode = 0): mysqli_result|false; mysqli::store_result(int $mode = 0): mysqli_result|false

Прочитать ответ с осознанным выбором буфера. STORE_RESULT получает серверный ответ в клиентский буфер. mysqli_result хранит набор и позицию, а не одну запись.

Данные и действие: mysqli_store_result
  1. $result = $db->store_result();
  2. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать ответ с осознанным выбором буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->store_result();
if ($result === false) { throw new RuntimeException('Не удалось получить каталог'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Большой буфер расходует память; поток удерживает соединение, пока не прочитан или освобождён. Не запускайте внутри такого цикла новый запрос на том же соединении.

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

Забрать весь набор результата real_query/multi_query в память PHP-клиента.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeУстаревший параметр: с 8.1 не влияет, передача deprecated с 8.4; новый код его опускает.

mysqli_result даже при нуле строк. false означает команду без набора либо отказ; сверяйте field_count/ошибку. Не вызывайте повторно для уже полученного набора. MYSQLI_STORE_RESULT_COPY_DATA — историческая настройка mysqlnd, с 8.1 не действует, с 8.4 deprecated.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Сервер выдаёт набор → store_result получает все строки → num_rows известен → data_seek может выбрать строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Все строки уже получены клиентом: доступны счётчик и перемотка. Цена — память для набора; это не вариант по умолчанию для экспорта миллионов записей.

Сосчитать строки сразу после буферизацииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->store_result();
echo $result->num_rows, "\n";
$result->data_seek(2);
echo $result->fetch_column(), "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У пустого SELECT есть колонки, поэтому объект результата существует с нулём строк. SET не создаёт набора. Если field_count > 0, а результата нет, исследуйте ошибку, включая отказ выделения памяти.

Пустой SELECT и команда без строк — разные результатыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 42 WHERE 1 = 0');
$result = $db->store_result();
echo $result->num_rows, "\n";
$result->free();
$db->real_query('SET @course_number = 42');
var_dump($db->store_result());
Ожидаемый результат
0
bool(false)

Связанные операции: mysqli_use_result, mysqli_field_count, mysqli_num_rows.

Оба входа к этой операции: mysqli_store_result, mysqli::store_result.

mysqli::store_resultЗабрать весь набор результата real_query/multi_query в память PHP-клиента.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_store_result(mysqli $mysql, int $mode = 0): mysqli_result|false; mysqli::store_result(int $mode = 0): mysqli_result|false

Прочитать ответ с осознанным выбором буфера. STORE_RESULT получает серверный ответ в клиентский буфер. mysqli_result хранит набор и позицию, а не одну запись.

Данные и действие: mysqli::store_result
  1. $result = $db->store_result();
  2. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать ответ с осознанным выбором буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->store_result();
if ($result === false) { throw new RuntimeException('Не удалось получить каталог'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Большой буфер расходует память; поток удерживает соединение, пока не прочитан или освобождён. Не запускайте внутри такого цикла новый запрос на том же соединении.

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

Забрать весь набор результата real_query/multi_query в память PHP-клиента.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeУстаревший параметр: с 8.1 не влияет, передача deprecated с 8.4; новый код его опускает.

mysqli_result даже при нуле строк. false означает команду без набора либо отказ; сверяйте field_count/ошибку. Не вызывайте повторно для уже полученного набора. MYSQLI_STORE_RESULT_COPY_DATA — историческая настройка mysqlnd, с 8.1 не действует, с 8.4 deprecated.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Сервер выдаёт набор → store_result получает все строки → num_rows известен → data_seek может выбрать строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Все строки уже получены клиентом: доступны счётчик и перемотка. Цена — память для набора; это не вариант по умолчанию для экспорта миллионов записей.

Сосчитать строки сразу после буферизацииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->store_result();
echo $result->num_rows, "\n";
$result->data_seek(2);
echo $result->fetch_column(), "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У пустого SELECT есть колонки, поэтому объект результата существует с нулём строк. SET не создаёт набора. Если field_count > 0, а результата нет, исследуйте ошибку, включая отказ выделения памяти.

Пустой SELECT и команда без строк — разные результатыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 42 WHERE 1 = 0');
$result = $db->store_result();
echo $result->num_rows, "\n";
$result->free();
$db->real_query('SET @course_number = 42');
var_dump($db->store_result());
Ожидаемый результат
0
bool(false)

Связанные операции: mysqli_use_result, mysqli_field_count, mysqli_num_rows.

Оба входа к этой операции: mysqli_store_result, mysqli::store_result.

mysqli_use_resultПолучить небуферизованный поток строк предыдущего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_use_result(mysqli $mysql): mysqli_result|false; mysqli::use_result(): mysqli_result|false

Прочитать ответ с осознанным выбором буфера. use_result оставляет ответ потоком на занятом соединении; строки читаются до конца перед новой командой.

Данные и действие: mysqli_use_result
  1. $result = $db->use_result();
  2. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать ответ с осознанным выбором буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->use_result();
if ($result === false) { throw new RuntimeException('Не удалось получить каталог'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Большой буфер расходует память; поток удерживает соединение, пока не прочитан или освобождён. Не запускайте внутри такого цикла новый запрос на том же соединении.

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

Получить небуферизованный поток строк предыдущего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после real_query/multi_query с набором строк.

mysqli_result либо false. Нельзя перематывать data_seek; num_rows не даёт итог до полного чтения. До следующей команды дочитайте/освободите набор, иначе Commands out of sync. Обработка не должна без необходимости держать долгую операцию/блокировки сервера; фактические блокировки зависят от SQL, движка и транзакции.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Запрос открыл серверный набор → fetch передаёт очередную строку → PHP обрабатывает её → Конец/free освобождает соединение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Поток уменьшает клиентский буфер, но соединение занято до завершения. Медленные внешние HTTP-вызовы внутри цикла удлинят SQL-операцию и жизнь серверных ресурсов; для таких задач читайте ограниченные страницы.

Читать товар за товаром без полного буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->use_result();
while ($row = $result->fetch_assoc()) { echo $row['name'], "\n"; }
$result->free();
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
Pen
Notebook
Box
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. free завершает работу с остатком результата; это не обещание мгновенной отмены тяжёлого SQL. Если нужна лишь первая запись, эффективнее ограничить запрос LIMIT 1.

Прекратить чтение и освободить соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'SELECT name FROM course_products ORDER BY id');
$result = mysqli_use_result($db);
echo mysqli_fetch_column($result), "\n";
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
Pen
7

Связанные операции: mysqli_store_result, mysqli_free_result.

Оба входа к этой операции: mysqli_use_result, mysqli::use_result.

mysqli::use_resultПолучить небуферизованный поток строк предыдущего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_use_result(mysqli $mysql): mysqli_result|false; mysqli::use_result(): mysqli_result|false

Прочитать ответ с осознанным выбором буфера. use_result оставляет ответ потоком на занятом соединении; строки читаются до конца перед новой командой.

Данные и действие: mysqli::use_result
  1. $result = $db->use_result();
  2. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать ответ с осознанным выбором буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = $db->use_result();
if ($result === false) { throw new RuntimeException('Не удалось получить каталог'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Большой буфер расходует память; поток удерживает соединение, пока не прочитан или освобождён. Не запускайте внутри такого цикла новый запрос на том же соединении.

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

Получить небуферизованный поток строк предыдущего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после real_query/multi_query с набором строк.

mysqli_result либо false. Нельзя перематывать data_seek; num_rows не даёт итог до полного чтения. До следующей команды дочитайте/освободите набор, иначе Commands out of sync. Обработка не должна без необходимости держать долгую операцию/блокировки сервера; фактические блокировки зависят от SQL, движка и транзакции.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Запрос открыл серверный набор → fetch передаёт очередную строку → PHP обрабатывает её → Конец/free освобождает соединение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Поток уменьшает клиентский буфер, но соединение занято до завершения. Медленные внешние HTTP-вызовы внутри цикла удлинят SQL-операцию и жизнь серверных ресурсов; для таких задач читайте ограниченные страницы.

Читать товар за товаром без полного буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = $db->use_result();
while ($row = $result->fetch_assoc()) { echo $row['name'], "\n"; }
$result->free();
echo $db->query('SELECT 42')->fetch_column(), "\n";
Ожидаемый результат
Pen
Notebook
Box
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. free завершает работу с остатком результата; это не обещание мгновенной отмены тяжёлого SQL. Если нужна лишь первая запись, эффективнее ограничить запрос LIMIT 1.

Прекратить чтение и освободить соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'SELECT name FROM course_products ORDER BY id');
$result = mysqli_use_result($db);
echo mysqli_fetch_column($result), "\n";
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
Pen
7

Связанные операции: mysqli_store_result, mysqli_free_result.

Оба входа к этой операции: mysqli_use_result, mysqli::use_result.

mysqli_multi_queryОтправить несколько доверенных SQL-команд и последовательно прочитать каждый результат.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_multi_query(mysqli $mysql, string $query): bool; mysqli::multi_query(string $query): bool

Получить каталог и итог из двух ответов. Отправляет фиксированный списокSQL, который может дать несколько ответов.

Данные и действие: mysqli_multi_query
  1. $db->multi_query($fixedSql)
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Отправить несколько доверенных SQL-команд и последовательно прочитать каждый результат.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryКоманды с разделителем ;. Данные из формы здесь не склеивают: используйте отдельные подготовленные запросы.

true означает успех первого запроса; дальнейшие результаты, включая ошибки, приходят при next_result. Сервер выполняет последовательно, соединение занято до обработки всех наборов/статусов. CALL тоже может вернуть несколько наборов и завершающий статус. Для атомарности нужна отдельная транзакция.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. multi_query запускает пакет → store_result читает текущий набор → more_results проверяет продолжение → next_result переводит к следующему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_more_results, mysqli_next_result, mysqli_store_result, mysqli_begin_transaction.

Оба входа к этой операции: mysqli_multi_query, mysqli::multi_query.

mysqli::multi_queryОтправить несколько доверенных SQL-команд и последовательно прочитать каждый результат.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_multi_query(mysqli $mysql, string $query): bool; mysqli::multi_query(string $query): bool

Получить каталог и итог из двух ответов. Отправляет фиксированный списокSQL, который может дать несколько ответов.

Данные и действие: mysqli::multi_query
  1. $db->multi_query($fixedSql)
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Отправить несколько доверенных SQL-команд и последовательно прочитать каждый результат.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryКоманды с разделителем ;. Данные из формы здесь не склеивают: используйте отдельные подготовленные запросы.

true означает успех первого запроса; дальнейшие результаты, включая ошибки, приходят при next_result. Сервер выполняет последовательно, соединение занято до обработки всех наборов/статусов. CALL тоже может вернуть несколько наборов и завершающий статус. Для атомарности нужна отдельная транзакция.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. multi_query запускает пакет → store_result читает текущий набор → more_results проверяет продолжение → next_result переводит к следующему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_more_results, mysqli_next_result, mysqli_store_result, mysqli_begin_transaction.

Оба входа к этой операции: mysqli_multi_query, mysqli::multi_query.

mysqli_more_resultsУзнать, остались ли ещё результаты пакета.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_more_results(mysqli $mysql): bool; mysqli::more_results(): bool

Получить каталог и итог из двух ответов. Проверяет, остаётся ли ещё ответ; само состояние не переносит соединение на него.

Данные и действие: mysqli_more_results
  1. $db->more_results()
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Узнать, остались ли ещё результаты пакета.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение с текущим multi_query/CALL.

true включает ожидаемый результат с ошибкой: это признак наличия продолжения, не его успеха. false — всё прочитано. Проверка не извлекает строки и не переключает набор.

Путь данных. Текущий набор обработан → more_results отвечает да/нет → При да вызывается next_result.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_next_result, mysqli_multi_query.

Оба входа к этой операции: mysqli_more_results, mysqli::more_results.

mysqli::more_resultsУзнать, остались ли ещё результаты пакета.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_more_results(mysqli $mysql): bool; mysqli::more_results(): bool

Получить каталог и итог из двух ответов. Проверяет, остаётся ли ещё ответ; само состояние не переносит соединение на него.

Данные и действие: mysqli::more_results
  1. $db->more_results()
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Узнать, остались ли ещё результаты пакета.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение с текущим multi_query/CALL.

true включает ожидаемый результат с ошибкой: это признак наличия продолжения, не его успеха. false — всё прочитано. Проверка не извлекает строки и не переключает набор.

Путь данных. Текущий набор обработан → more_results отвечает да/нет → При да вызывается next_result.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_next_result, mysqli_multi_query.

Оба входа к этой операции: mysqli_more_results, mysqli::more_results.

mysqli_next_resultПерейти к следующему набору или статусу пакета.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_next_result(mysqli $mysql): bool; mysqli::next_result(): bool

Получить каталог и итог из двух ответов. Переходит к следующему ответу и сообщает ошибку следующей команды, если она возникла.

Данные и действие: mysqli_next_result
  1. $db->next_result()
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Перейти к следующему набору или статусу пакета.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение, текущий набор которого уже прочитан/освобождён.

true — следующий запрос завершился успешно; false — отказ/нет успешного следующего результата. В отличие от more_results, ошибка SQL следующей команды отражается здесь, при строгом режиме исключением. Затем вызовите store_result/use_result, если есть колонки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущий набор освобождён → next_result ожидает следующую команду → store_result получает её строки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_more_results, mysqli_store_result.

Оба входа к этой операции: mysqli_next_result, mysqli::next_result.

mysqli::next_resultПерейти к следующему набору или статусу пакета.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_next_result(mysqli $mysql): bool; mysqli::next_result(): bool

Получить каталог и итог из двух ответов. Переходит к следующему ответу и сообщает ошибку следующей команды, если она возникла.

Данные и действие: mysqli::next_result
  1. $db->next_result()
  2. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего позиций: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить каталог и итог из двух ответовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->multi_query('SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products');
$result = $db->store_result();
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
if (!$db->more_results() || !$db->next_result()) { throw new RuntimeException('Итоговый ответ не получен'); }
$result = $db->store_result();
echo 'Всего позиций: ', $result->fetch_column(), "\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего позиций: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Multi-query не означает транзакцию. Весь списокSQL задан автором; нельзя склеивать его с вводом посетителя. Поздняя команда может завершиться ошибкой после успешной ранней.

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

Перейти к следующему набору или статусу пакета.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение, текущий набор которого уже прочитан/освобождён.

true — следующий запрос завершился успешно; false — отказ/нет успешного следующего результата. В отличие от more_results, ошибка SQL следующей команды отражается здесь, при строгом режиме исключением. Затем вызовите store_result/use_result, если есть колонки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущий набор освобождён → next_result ожидает следующую команду → store_result получает её строки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. do выполняет тело для уже доступного первого результата. more_results сообщает наличие следующего, next_result переходит к нему. Пакет — только доверенный SQL, без пользовательских подстановок.

Обработать оба набора доверенного пакетаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->multi_query('SELECT 12 AS value; SELECT 25 AS value');
do {
    if ($result = $db->store_result()) {
        echo $result->fetch_column(), "\n";
        $result->free();
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. multi_query не является транзакцией: если поздняя команда упадёт, ранняя может уже сохраниться. При строгом режиме ошибка следующей команды может возникнуть в next_result, а не в исходном multi_query.

Различить статус UPDATE и строки SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->multi_query('UPDATE course_products SET price = 125 WHERE id = 1; SELECT price FROM course_products WHERE id = 1');
do {
    if ($result = $db->store_result()) {
        echo 'Цена:', $result->fetch_column(), "\n";
        $result->free();
    } else {
        echo 'Изменено:', $db->affected_rows, "\n";
    }
    if (!$db->more_results()) { break; }
} while ($db->next_result());
Ожидаемый результат
Изменено:1
Цена:125

Связанные операции: mysqli_more_results, mysqli_store_result.

Оба входа к этой операции: mysqli_next_result, mysqli::next_result.

mysqli_real_escape_stringЭкранировать значение для строкового SQL-литерала в существующем коде.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_escape_string(mysqli $mysql, string $string): string; mysqli::real_escape_string(string $string): string

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

Данные и действие: mysqli_real_escape_string
  1. $db->real_escape_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->real_escape_string($name);
$db->query("INSERT INTO products (name, stock) VALUES ('" . $escaped . "', 2)");
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Экранировать значение для строкового SQL-литерала в существующем коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходный текст, не готовый SQL и не имя колонки.

Возвращает экранированную строку без кавычек. Учитывает charset, установленный set_charset. Обычно обрабатывает NUL, LF, CR, обратную косую черту, одинарную/двойную кавычки и Ctrl+Z. При NO_BACKSLASH_ESCAPES актуальная реализация удваивает одинарную кавычку: помещать результат в двойные кавычки опасно. Не защищает имена таблиц, SQL-операторы, LIKE-метасимволы или HTML. Новый код использует подготовленные значения; в PHP 8.6 появился quote_string с обрамлением.

Путь данных. PHP-текст Reader's book → Кодировка соединения учитывается → Специальные байты экранируются → Код обрамляет литерал одинарными кавычками.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Результат escape не содержит обрамляющих кавычек: здесь добавлены именно одинарные. Для нового кода безопаснее execute_query с ?. Нельзя экранировать один раз и переносить строку между соединениями с другой кодировкой.

Поддержать старый код с одним строковым литераломПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$name = "Reader's book";
$escaped = $db->real_escape_string($name);
$result = $db->query("SELECT '$escaped' AS name");
echo $result->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_escape_string не отменяет смысл % и _ в LIKE. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.

Отделить SQL-экранирование от шаблона LIKEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$literal = 'sale_20%';
$pattern = strtr($literal, ['!' => '!!', '%' => '!%', '_' => '!_']) . '%';
$result = $db->execute_query("SELECT ? LIKE ? ESCAPE '!'", ['sale_20% today', $pattern]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_execute_query, mysqli_set_charset, mysqli_quote_string.

Оба входа к этой операции: mysqli_real_escape_string, mysqli::real_escape_string.

mysqli::real_escape_stringЭкранировать значение для строкового SQL-литерала в существующем коде.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_real_escape_string(mysqli $mysql, string $string): string; mysqli::real_escape_string(string $string): string

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

Данные и действие: mysqli::real_escape_string
  1. $db->real_escape_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->real_escape_string($name);
$db->query("INSERT INTO products (name, stock) VALUES ('" . $escaped . "', 2)");
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Экранировать значение для строкового SQL-литерала в существующем коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходный текст, не готовый SQL и не имя колонки.

Возвращает экранированную строку без кавычек. Учитывает charset, установленный set_charset. Обычно обрабатывает NUL, LF, CR, обратную косую черту, одинарную/двойную кавычки и Ctrl+Z. При NO_BACKSLASH_ESCAPES актуальная реализация удваивает одинарную кавычку: помещать результат в двойные кавычки опасно. Не защищает имена таблиц, SQL-операторы, LIKE-метасимволы или HTML. Новый код использует подготовленные значения; в PHP 8.6 появился quote_string с обрамлением.

Путь данных. PHP-текст Reader's book → Кодировка соединения учитывается → Специальные байты экранируются → Код обрамляет литерал одинарными кавычками.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Результат escape не содержит обрамляющих кавычек: здесь добавлены именно одинарные. Для нового кода безопаснее execute_query с ?. Нельзя экранировать один раз и переносить строку между соединениями с другой кодировкой.

Поддержать старый код с одним строковым литераломПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$name = "Reader's book";
$escaped = $db->real_escape_string($name);
$result = $db->query("SELECT '$escaped' AS name");
echo $result->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_escape_string не отменяет смысл % и _ в LIKE. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.

Отделить SQL-экранирование от шаблона LIKEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$literal = 'sale_20%';
$pattern = strtr($literal, ['!' => '!!', '%' => '!%', '_' => '!_']) . '%';
$result = $db->execute_query("SELECT ? LIKE ? ESCAPE '!'", ['sale_20% today', $pattern]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_execute_query, mysqli_set_charset, mysqli_quote_string.

Оба входа к этой операции: mysqli_real_escape_string, mysqli::real_escape_string.

mysqli_escape_stringЭкранировать значение для строкового SQL-литерала в существующем коде.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_escape_string(mysqli $mysql, string $string): string; mysqli::escape_string(string $string): string

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

Данные и действие: mysqli_escape_string
  1. $db->escape_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->escape_string($name);
$db->query("INSERT INTO products (name, stock) VALUES ('" . $escaped . "', 2)");
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Экранировать значение для строкового SQL-литерала в существующем коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходный текст, не готовый SQL и не имя колонки.

Возвращает экранированную строку без кавычек. Учитывает charset, установленный set_charset. Обычно обрабатывает NUL, LF, CR, обратную косую черту, одинарную/двойную кавычки и Ctrl+Z. При NO_BACKSLASH_ESCAPES актуальная реализация удваивает одинарную кавычку: помещать результат в двойные кавычки опасно. Не защищает имена таблиц, SQL-операторы, LIKE-метасимволы или HTML. Новый код использует подготовленные значения; в PHP 8.6 появился quote_string с обрамлением. escape_string — alias real_escape_string.

Путь данных. PHP-текст Reader's book → Кодировка соединения учитывается → Специальные байты экранируются → Код обрамляет литерал одинарными кавычками.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Результат escape не содержит обрамляющих кавычек: здесь добавлены именно одинарные. Для нового кода безопаснее execute_query с ?. Нельзя экранировать один раз и переносить строку между соединениями с другой кодировкой.

Поддержать старый код с одним строковым литераломПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$name = "Reader's book";
$escaped = $db->real_escape_string($name);
$result = $db->query("SELECT '$escaped' AS name");
echo $result->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_escape_string не отменяет смысл % и _ в LIKE. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.

Отделить SQL-экранирование от шаблона LIKEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$literal = 'sale_20%';
$pattern = strtr($literal, ['!' => '!!', '%' => '!%', '_' => '!_']) . '%';
$result = $db->execute_query("SELECT ? LIKE ? ESCAPE '!'", ['sale_20% today', $pattern]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_execute_query, mysqli_set_charset, mysqli_quote_string.

Оба входа к этой операции: mysqli_escape_string, mysqli::escape_string.

mysqli::escape_stringЭкранировать значение для строкового SQL-литерала в существующем коде.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_escape_string(mysqli $mysql, string $string): string; mysqli::escape_string(string $string): string

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

Данные и действие: mysqli::escape_string
  1. $db->escape_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->escape_string($name);
$db->query("INSERT INTO products (name, stock) VALUES ('" . $escaped . "', 2)");
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Экранировать значение для строкового SQL-литерала в существующем коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходный текст, не готовый SQL и не имя колонки.

Возвращает экранированную строку без кавычек. Учитывает charset, установленный set_charset. Обычно обрабатывает NUL, LF, CR, обратную косую черту, одинарную/двойную кавычки и Ctrl+Z. При NO_BACKSLASH_ESCAPES актуальная реализация удваивает одинарную кавычку: помещать результат в двойные кавычки опасно. Не защищает имена таблиц, SQL-операторы, LIKE-метасимволы или HTML. Новый код использует подготовленные значения; в PHP 8.6 появился quote_string с обрамлением. escape_string — alias real_escape_string.

Путь данных. PHP-текст Reader's book → Кодировка соединения учитывается → Специальные байты экранируются → Код обрамляет литерал одинарными кавычками.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Результат escape не содержит обрамляющих кавычек: здесь добавлены именно одинарные. Для нового кода безопаснее execute_query с ?. Нельзя экранировать один раз и переносить строку между соединениями с другой кодировкой.

Поддержать старый код с одним строковым литераломПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$name = "Reader's book";
$escaped = $db->real_escape_string($name);
$result = $db->query("SELECT '$escaped' AS name");
echo $result->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. real_escape_string не отменяет смысл % и _ в LIKE. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.

Отделить SQL-экранирование от шаблона LIKEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$literal = 'sale_20%';
$pattern = strtr($literal, ['!' => '!!', '%' => '!%', '_' => '!_']) . '%';
$result = $db->execute_query("SELECT ? LIKE ? ESCAPE '!'", ['sale_20% today', $pattern]);
echo $result->fetch_column(), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_execute_query, mysqli_set_charset, mysqli_quote_string.

Оба входа к этой операции: mysqli_escape_string, mysqli::escape_string.

mysqli_quote_stringПолучить экранированный строковый SQL-литерал вместе с кавычками.

PHP 8.6+; отсутствует в проверочной PHP 8.5.11 · mysqli; mysqlnd для отмеченных операций

mysqli_quote_string(mysqli $mysql, string $string): string; mysqli::quote_string(string $string): string

Прочитать старую склейку SQL с апострофом. quote_string PHP 8.6+ возвращает литерал вместе с внешними SQL-кавычками. Это разные контракты, поэтому их нельзя механически поменять местами.

Данные и действие: mysqli_quote_string
  1. $db->quote_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->quote_string($name);
$db->query('INSERT INTO products (name, stock) VALUES (' . $escaped . ', 2)');
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Получить экранированный строковый SQL-литерал вместе с кавычками.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходная строка, кодировка которой согласована с соединением.

Официальная ветка PHP 8.6+: в проверочной 8.5.11 функции ещё нет. Возвращает строку в одинарных кавычках, учитывает charset и NO_BACKSLASH_ESCAPES (удвоение апострофа). Обычно кодирует NUL, LF, CR, обратную косую, обе кавычки, Ctrl+Z. Подходит только для литералов значений; параметры предпочтительнее. Повторное обрамление или повторное экранирование испортит запрос.

Путь данных. Исходный текст → Экранирование с учётом соединения → Одинарные кавычки включены → Литерал добавляется в доверенный SQL.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется PHP 8.6; в проверочной PHP 8.5.11 метод отсутствует, выполнена только синтаксическая проверка. Дополнительные кавычки вокруг $quoted не нужны.

PHP 8.6: получить целый строковый SQL-литералПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$quoted = $db->quote_string("Reader's book");
echo $db->query('SELECT ' . $quoted)->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется PHP 8.6; режим изменён только в учебной сессии. Функция учитывает этот режим и включает безопасные одинарные кавычки; она не является защитой динамических имён таблиц.

PHP 8.6: тот же текст при NO_BACKSLASH_ESCAPESПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES'");
$quoted = mysqli_quote_string($db, "Author's notes");
echo $db->query('SELECT ' . $quoted)->fetch_column(), "\n";
Ожидаемый результат
Author's notes

Связанные операции: mysqli_real_escape_string, mysqli_execute_query.

Оба входа к этой операции: mysqli_quote_string, mysqli::quote_string.

mysqli::quote_stringПолучить экранированный строковый SQL-литерал вместе с кавычками.

PHP 8.6+; отсутствует в проверочной PHP 8.5.11 · mysqli; mysqlnd для отмеченных операций

mysqli_quote_string(mysqli $mysql, string $string): string; mysqli::quote_string(string $string): string

Прочитать старую склейку SQL с апострофом. quote_string PHP 8.6+ возвращает литерал вместе с внешними SQL-кавычками. Это разные контракты, поэтому их нельзя механически поменять местами.

Данные и действие: mysqli::quote_string
  1. $db->quote_string($name)
  2. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
  3. После выполнения: Кисть O'Reilly — 2 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать старую склейку SQL с апострофомПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$name = "Кисть O'Reilly";
$escaped = $db->quote_string($name);
$db->query('INSERT INTO products (name, stock) VALUES (' . $escaped . ', 2)');
$result = $db->query('SELECT name, stock FROM products WHERE id = 4');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Кисть O'Reilly — 2 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Кисть O'Reilly2 шт.

Если требование изменится. В новом коде используйте параметры. Проверяйте SQL-режимы, charset и тип контекста: эти функции не экранируют имена колонок, LIKE-шаблон целиком или HTML.

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

Получить экранированный строковый SQL-литерал вместе с кавычками.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$stringИсходная строка, кодировка которой согласована с соединением.

Официальная ветка PHP 8.6+: в проверочной 8.5.11 функции ещё нет. Возвращает строку в одинарных кавычках, учитывает charset и NO_BACKSLASH_ESCAPES (удвоение апострофа). Обычно кодирует NUL, LF, CR, обратную косую, обе кавычки, Ctrl+Z. Подходит только для литералов значений; параметры предпочтительнее. Повторное обрамление или повторное экранирование испортит запрос.

Путь данных. Исходный текст → Экранирование с учётом соединения → Одинарные кавычки включены → Литерал добавляется в доверенный SQL.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется PHP 8.6; в проверочной PHP 8.5.11 метод отсутствует, выполнена только синтаксическая проверка. Дополнительные кавычки вокруг $quoted не нужны.

PHP 8.6: получить целый строковый SQL-литералПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$quoted = $db->quote_string("Reader's book");
echo $db->query('SELECT ' . $quoted)->fetch_column(), "\n";
Ожидаемый результат
Reader's book

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется PHP 8.6; режим изменён только в учебной сессии. Функция учитывает этот режим и включает безопасные одинарные кавычки; она не является защитой динамических имён таблиц.

PHP 8.6: тот же текст при NO_BACKSLASH_ESCAPESПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES'");
$quoted = mysqli_quote_string($db, "Author's notes");
echo $db->query('SELECT ' . $quoted)->fetch_column(), "\n";
Ожидаемый результат
Author's notes

Связанные операции: mysqli_real_escape_string, mysqli_execute_query.

Оба входа к этой операции: mysqli_quote_string, mysqli::quote_string.

mysqli_pollОжидать готовность ранее запущенных асинхронных запросов.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_poll(?array &$read, ?array &$error, array &$reject, int $seconds, int $microseconds = 0): int|false; static mysqli::poll(...): int|false

Получить готовый асинхронный ответ. С MYSQLI_ASYNC запрос отправляется отдельно от получения ответа. poll ожидает готовность максимум указанное время и изменяет списки соединений; reap получает именно готовый результат.

Данные и действие: mysqli_poll
  1. mysqli_poll($read, $errors, $reject, 1)
  2. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить готовый асинхронный ответПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('SELECT name, stock FROM products WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $errors = [$db]; $reject = [$db];
$ready = mysqli_poll($read, $errors, $reject, 1);
if ($ready === false || $ready === 0 || $errors !== [] || $reject !== []) { throw new RuntimeException('Асинхронный ответ не готов'); }
$result = $db->reap_async_query();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Нужен mysqlnd. Одна секунда здесь — ограничение ожидания, а не доказательство доступности ответа; при таймауте нужна явная политика завершения/повторной проверки без бесконечного цикла.

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

Ожидать готовность ранее запущенных асинхронных запросов.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
&$readСписок соединений с ожидаемыми результатами; изменится до готовых.
&$errorСписок соединений для проверки ошибок; также изменится.
&$rejectПолучит соединения без ожидаемого асинхронного запроса.
$seconds / $microsecondsНеотрицательные части времени ожидания, секунды и микросекунды.

Только mysqlnd. Возвращает число готовых соединений, 0 при тайм-ауте, false при ошибке опроса. С 8.3 ValueError, если не заданы ни read, ни error. Статический OO-вызов mysqli::poll, а не операция единственного объекта. Готовность не означает успех SQL: результат забирает reap_async_query.

Путь данных. query ASYNC запускает → poll ждёт готовность → Массивы содержат готовые/ошибочные соединения → reap забирает ответ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. poll меняет массивы по ссылке; на каждом ожидании создаём исходные списки заново. Ноль означает тайм-аут ожидания, не ошибку SQL. reap получит результат или сообщит ошибку. В рабочем сервисе нужен общий deadline, чтобы повторные ожидания не были бесконечны.

Дождаться асинхронного SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42 AS value', MYSQLI_ASYNC);
do {
    $read = [$db]; $error = [$db]; $reject = [];
    $ready = mysqli_poll($read, $error, $reject, 1);
    if ($ready === false || $reject) { throw new RuntimeException('Не удалось ожидать запрос'); }
} while ($ready === 0);
$result = $db->reap_async_query();
echo $result->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемый вывод при завершении в пределах пяти секунд. Тайм-аут poll не отменяет запрос на сервере. На одном соединении одновременно выполняется один запрос; для параллельных независимых SQL нужны отдельные соединения.

Асинхронная команда без строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 140 WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $error = [$db]; $reject = [];
if (mysqli_poll($read, $error, $reject, 5) > 0) {
    var_dump(mysqli_reap_async_query($db));
    echo $db->affected_rows, "\n";
} else {
    throw new RuntimeException('Результат не получен за 5 секунд');
}
Ожидаемый результат
bool(true)
1

Связанные операции: mysqli_reap_async_query, mysqli_query.

Оба входа к этой операции: mysqli_poll, mysqli::poll.

mysqli::pollОжидать готовность ранее запущенных асинхронных запросов.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_poll(?array &$read, ?array &$error, array &$reject, int $seconds, int $microseconds = 0): int|false; static mysqli::poll(...): int|false

Получить готовый асинхронный ответ. С MYSQLI_ASYNC запрос отправляется отдельно от получения ответа. poll ожидает готовность максимум указанное время и изменяет списки соединений; reap получает именно готовый результат.

Данные и действие: mysqli::poll
  1. mysqli_poll($read, $errors, $reject, 1)
  2. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить готовый асинхронный ответПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('SELECT name, stock FROM products WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $errors = [$db]; $reject = [$db];
$ready = mysqli_poll($read, $errors, $reject, 1);
if ($ready === false || $ready === 0 || $errors !== [] || $reject !== []) { throw new RuntimeException('Асинхронный ответ не готов'); }
$result = $db->reap_async_query();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Нужен mysqlnd. Одна секунда здесь — ограничение ожидания, а не доказательство доступности ответа; при таймауте нужна явная политика завершения/повторной проверки без бесконечного цикла.

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

Ожидать готовность ранее запущенных асинхронных запросов.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
&$readСписок соединений с ожидаемыми результатами; изменится до готовых.
&$errorСписок соединений для проверки ошибок; также изменится.
&$rejectПолучит соединения без ожидаемого асинхронного запроса.
$seconds / $microsecondsНеотрицательные части времени ожидания, секунды и микросекунды.

Только mysqlnd. Возвращает число готовых соединений, 0 при тайм-ауте, false при ошибке опроса. С 8.3 ValueError, если не заданы ни read, ни error. Статический OO-вызов mysqli::poll, а не операция единственного объекта. Готовность не означает успех SQL: результат забирает reap_async_query.

Путь данных. query ASYNC запускает → poll ждёт готовность → Массивы содержат готовые/ошибочные соединения → reap забирает ответ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. poll меняет массивы по ссылке; на каждом ожидании создаём исходные списки заново. Ноль означает тайм-аут ожидания, не ошибку SQL. reap получит результат или сообщит ошибку. В рабочем сервисе нужен общий deadline, чтобы повторные ожидания не были бесконечны.

Дождаться асинхронного SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42 AS value', MYSQLI_ASYNC);
do {
    $read = [$db]; $error = [$db]; $reject = [];
    $ready = mysqli_poll($read, $error, $reject, 1);
    if ($ready === false || $reject) { throw new RuntimeException('Не удалось ожидать запрос'); }
} while ($ready === 0);
$result = $db->reap_async_query();
echo $result->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемый вывод при завершении в пределах пяти секунд. Тайм-аут poll не отменяет запрос на сервере. На одном соединении одновременно выполняется один запрос; для параллельных независимых SQL нужны отдельные соединения.

Асинхронная команда без строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 140 WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $error = [$db]; $reject = [];
if (mysqli_poll($read, $error, $reject, 5) > 0) {
    var_dump(mysqli_reap_async_query($db));
    echo $db->affected_rows, "\n";
} else {
    throw new RuntimeException('Результат не получен за 5 секунд');
}
Ожидаемый результат
bool(true)
1

Связанные операции: mysqli_reap_async_query, mysqli_query.

Оба входа к этой операции: mysqli_poll, mysqli::poll.

mysqli_reap_async_queryПолучить итог запроса, запущенного с MYSQLI_ASYNC.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_reap_async_query(mysqli $mysql): mysqli_result|bool; mysqli::reap_async_query(): mysqli_result|bool

Получить готовый асинхронный ответ. С MYSQLI_ASYNC запрос отправляется отдельно от получения ответа. poll ожидает готовность максимум указанное время и изменяет списки соединений; reap получает именно готовый результат.

Данные и действие: mysqli_reap_async_query
  1. $db->reap_async_query()
  2. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить готовый асинхронный ответПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('SELECT name, stock FROM products WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $errors = [$db]; $reject = [$db];
$ready = mysqli_poll($read, $errors, $reject, 1);
if ($ready === false || $ready === 0 || $errors !== [] || $reject !== []) { throw new RuntimeException('Асинхронный ответ не готов'); }
$result = $db->reap_async_query();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Нужен mysqlnd. Одна секунда здесь — ограничение ожидания, а не доказательство доступности ответа; при таймауте нужна явная политика завершения/повторной проверки без бесконечного цикла.

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

Получить итог запроса, запущенного с MYSQLI_ASYNC.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение с завершённым асинхронным запросом.

Только mysqlnd: набор строк — mysqli_result; успешная команда без строк — true; ошибка false/исключение. Не вызывайте повторно для уже забранного результата. Сам по себе асинхронный запуск не делает SQL быстрее: он позволяет приложению ожидать несколько соединений совместно.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. poll сообщает готовность → reap получает результат → fetch читает строки или affected_rows описывает действие.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. poll меняет массивы по ссылке; на каждом ожидании создаём исходные списки заново. Ноль означает тайм-аут ожидания, не ошибку SQL. reap получит результат или сообщит ошибку. В рабочем сервисе нужен общий deadline, чтобы повторные ожидания не были бесконечны.

Дождаться асинхронного SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42 AS value', MYSQLI_ASYNC);
do {
    $read = [$db]; $error = [$db]; $reject = [];
    $ready = mysqli_poll($read, $error, $reject, 1);
    if ($ready === false || $reject) { throw new RuntimeException('Не удалось ожидать запрос'); }
} while ($ready === 0);
$result = $db->reap_async_query();
echo $result->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемый вывод при завершении в пределах пяти секунд. Тайм-аут poll не отменяет запрос на сервере. На одном соединении одновременно выполняется один запрос; для параллельных независимых SQL нужны отдельные соединения.

Асинхронная команда без строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 140 WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $error = [$db]; $reject = [];
if (mysqli_poll($read, $error, $reject, 5) > 0) {
    var_dump(mysqli_reap_async_query($db));
    echo $db->affected_rows, "\n";
} else {
    throw new RuntimeException('Результат не получен за 5 секунд');
}
Ожидаемый результат
bool(true)
1

Связанные операции: mysqli_poll, mysqli_query.

Оба входа к этой операции: mysqli_reap_async_query, mysqli::reap_async_query.

mysqli::reap_async_queryПолучить итог запроса, запущенного с MYSQLI_ASYNC.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_reap_async_query(mysqli $mysql): mysqli_result|bool; mysqli::reap_async_query(): mysqli_result|bool

Получить готовый асинхронный ответ. С MYSQLI_ASYNC запрос отправляется отдельно от получения ответа. poll ожидает готовность максимум указанное время и изменяет списки соединений; reap получает именно готовый результат.

Данные и действие: mysqli::reap_async_query
  1. $db->reap_async_query()
  2. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить готовый асинхронный ответПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('SELECT name, stock FROM products WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $errors = [$db]; $reject = [$db];
$ready = mysqli_poll($read, $errors, $reject, 1);
if ($ready === false || $ready === 0 || $errors !== [] || $reject !== []) { throw new RuntimeException('Асинхронный ответ не готов'); }
$result = $db->reap_async_query();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Нужен mysqlnd. Одна секунда здесь — ограничение ожидания, а не доказательство доступности ответа; при таймауте нужна явная политика завершения/повторной проверки без бесконечного цикла.

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

Получить итог запроса, запущенного с MYSQLI_ASYNC.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение с завершённым асинхронным запросом.

Только mysqlnd: набор строк — mysqli_result; успешная команда без строк — true; ошибка false/исключение. Не вызывайте повторно для уже забранного результата. Сам по себе асинхронный запуск не делает SQL быстрее: он позволяет приложению ожидать несколько соединений совместно.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. poll сообщает готовность → reap получает результат → fetch читает строки или affected_rows описывает действие.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. poll меняет массивы по ссылке; на каждом ожидании создаём исходные списки заново. Ноль означает тайм-аут ожидания, не ошибку SQL. reap получит результат или сообщит ошибку. В рабочем сервисе нужен общий deadline, чтобы повторные ожидания не были бесконечны.

Дождаться асинхронного SELECTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42 AS value', MYSQLI_ASYNC);
do {
    $read = [$db]; $error = [$db]; $reject = [];
    $ready = mysqli_poll($read, $error, $reject, 1);
    if ($ready === false || $reject) { throw new RuntimeException('Не удалось ожидать запрос'); }
} while ($ready === 0);
$result = $db->reap_async_query();
echo $result->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемый вывод при завершении в пределах пяти секунд. Тайм-аут poll не отменяет запрос на сервере. На одном соединении одновременно выполняется один запрос; для параллельных независимых SQL нужны отдельные соединения.

Асинхронная команда без строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 140 WHERE id = 1', MYSQLI_ASYNC);
$read = [$db]; $error = [$db]; $reject = [];
if (mysqli_poll($read, $error, $reject, 5) > 0) {
    var_dump(mysqli_reap_async_query($db));
    echo $db->affected_rows, "\n";
} else {
    throw new RuntimeException('Результат не получен за 5 секунд');
}
Ожидаемый результат
bool(true)
1

Связанные операции: mysqli_poll, mysqli_query.

Оба входа к этой операции: mysqli_reap_async_query, mysqli::reap_async_query.

mysqli_result::__constructПолучить объект строк после отдельно отправленного SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

new mysqli_result(mysqli $mysql, int $result_mode = MYSQLI_STORE_RESULT)

Прочитать ответ с осознанным выбором буфера. STORE_RESULT получает серверный ответ в клиентский буфер. mysqli_result хранит набор и позицию, а не одну запись.

Данные и действие: mysqli_result::__construct
  1. $result = new mysqli_result($db, MYSQLI_STORE_RESULT);
  2. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать ответ с осознанным выбором буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->real_query('SELECT name, stock FROM products ORDER BY id');
$result = new mysqli_result($db, MYSQLI_STORE_RESULT);
if ($result === false) { throw new RuntimeException('Не удалось получить каталог'); }
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Большой буфер расходует память; поток удерживает соединение, пока не прочитан или освобождён. Не запускайте внутри такого цикла новый запрос на том же соединении.

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

Получить объект строк после отдельно отправленного SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение с ещё не полученным результатом.
$result_modeMYSQLI_STORE_RESULT или MYSQLI_USE_RESULT.

Конструктор создаёт mysqli_result; STORE буферизует, USE оставляет поток занятым до чтения/free. Это не объект строки: он хранит набор и позицию чтения. Неподходящее состояние/режим приводит к ошибке, а SQL-отказ — к политике mysqli_report.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. real_query отправляет SQL → new mysqli_result получает набор → fetch извлекает строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Обычно query сам создаёт объект. Ручной конструктор нужен после real_query/multi_query и равнозначен выбору store_result/use_result.

Создать буфер результата вручнуюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 42');
$result = new mysqli_result($db);
echo $result->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для потока сохраняйте соединение открытым до конца; не создавайте второй объект результата поверх уже забранного набора.

Ручной результат без полного буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->real_query('SELECT name FROM course_products ORDER BY id');
$result = new mysqli_result($db, MYSQLI_USE_RESULT);
foreach ($result as $row) { echo $row['name'], "\n"; }
$result->free();
Ожидаемый результат
Pen
Notebook
Box

Связанные операции: mysqli_store_result, mysqli_use_result.

mysqli_fetch_assocИзвлечь следующую строку с именами колонок в ключах массива.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_assoc(mysqli_result $result): array|null|false; mysqli_result::fetch_assoc(): array|null|false

Извлечь одну строку в удобной форме. Именные ключи name/stock прямо повторяют имена SELECT.

Данные и действие: mysqli_fetch_assoc
  1. $result->fetch_assoc()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Извлечь следующую строку с именами колонок в ключах массива.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор строк query/store_result/use_result/get_result.

Массив — строка; null — строки закончились; false — ошибка чтения. Имена регистрозависимы. Одинаковые имена перезаписываются последней колонкой, поэтому используйте AS или fetch_row. SQL NULL остаётся null. В обычном текстовом протоколе числа часто строки; prepared/mysqlnd может вернуть int/float.

Путь данных. Набор содержит строки → fetch_assoc выбирает очередную → AS становится ключом → PHP получает значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ключи id и name заданы AS. Второй вызов читает следующую строку, которой нет, поэтому null. Массив строки — ваш рабочий контейнер, mysqli_result — источник таких контейнеров.

Первая строка как массив с подписямиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 42 AS id, 'Pen' AS name");
$row = $result->fetch_assoc();
echo $row['id'], ':', $row['name'], "\n";
var_dump($result->fetch_assoc());
Ожидаемый результат
42:Pen
NULL

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У JOIN обе таблицы часто имеют id. Дайте каждому своё AS, иначе поздняя одноимённая колонка перезапишет раннюю. SQL NULL превращается в PHP null, не пустую строку.

Развести одинаковые имена колонок JOINПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 7 AS order_id, 9 AS customer_id, NULL AS delivery_note");
$row = mysqli_fetch_assoc($result);
echo $row['order_id'], ':', $row['customer_id'], "\n";
var_dump($row['delivery_note']);
Ожидаемый результат
7:9
NULL

Связанные операции: mysqli_fetch_row, mysqli_fetch_array, mysqli_fetch_all.

Оба входа к этой операции: mysqli_fetch_assoc, mysqli_result::fetch_assoc.

mysqli_result::fetch_assocИзвлечь следующую строку с именами колонок в ключах массива.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_assoc(mysqli_result $result): array|null|false; mysqli_result::fetch_assoc(): array|null|false

Извлечь одну строку в удобной форме. Именные ключи name/stock прямо повторяют имена SELECT.

Данные и действие: mysqli_result::fetch_assoc
  1. $result->fetch_assoc()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Извлечь следующую строку с именами колонок в ключах массива.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор строк query/store_result/use_result/get_result.

Массив — строка; null — строки закончились; false — ошибка чтения. Имена регистрозависимы. Одинаковые имена перезаписываются последней колонкой, поэтому используйте AS или fetch_row. SQL NULL остаётся null. В обычном текстовом протоколе числа часто строки; prepared/mysqlnd может вернуть int/float.

Путь данных. Набор содержит строки → fetch_assoc выбирает очередную → AS становится ключом → PHP получает значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ключи id и name заданы AS. Второй вызов читает следующую строку, которой нет, поэтому null. Массив строки — ваш рабочий контейнер, mysqli_result — источник таких контейнеров.

Первая строка как массив с подписямиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 42 AS id, 'Pen' AS name");
$row = $result->fetch_assoc();
echo $row['id'], ':', $row['name'], "\n";
var_dump($result->fetch_assoc());
Ожидаемый результат
42:Pen
NULL

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У JOIN обе таблицы часто имеют id. Дайте каждому своё AS, иначе поздняя одноимённая колонка перезапишет раннюю. SQL NULL превращается в PHP null, не пустую строку.

Развести одинаковые имена колонок JOINПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 7 AS order_id, 9 AS customer_id, NULL AS delivery_note");
$row = mysqli_fetch_assoc($result);
echo $row['order_id'], ':', $row['customer_id'], "\n";
var_dump($row['delivery_note']);
Ожидаемый результат
7:9
NULL

Связанные операции: mysqli_fetch_row, mysqli_fetch_array, mysqli_fetch_all.

Оба входа к этой операции: mysqli_fetch_assoc, mysqli_result::fetch_assoc.

mysqli_fetch_rowПолучить следующую строку как список значений.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_row(mysqli_result $result): array|null|false; mysqli_result::fetch_row(): array|null|false

Извлечь одну строку в удобной форме. Числовые позиции 0 и 1 соответствуют порядку колонок SELECT.

Данные и действие: mysqli_fetch_row
  1. $result->fetch_row()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_row();
echo $row[0], ' — ', $row[1], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Получить следующую строку как список значений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultОбъект набора строк.

Массив с индексами 0..N−1, null в конце, false при ошибке. SQL NULL становится null. Нет потери одинаковых имён колонок, но есть зависимость от порядка SELECT. Не путайте с fetch_column: тот возвращает только одно значение и тоже сдвигает строку.

Путь данных. SELECT задаёт порядок → fetch_row создаёт список → Индекс 0 означает первую колонку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Нумерация с нуля. Порядок соответствует SELECT, поэтому смена списка колонок требует пересмотра индексов в PHP.

Получить колонки по позицииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen', 120");
$row = $result->fetch_row();
echo $row[0], ':', $row[1], "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Квадратные скобки слева распределяют два элемента массива по двум переменным. Для прикладного кода AS order_id/customer_id часто понятнее позиционного соглашения.

Не потерять две одноимённые колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 7 AS id, 9 AS id');
[$orderId, $customerId] = mysqli_fetch_row($result);
echo $orderId, ':', $customerId, "\n";
Ожидаемый результат
7:9

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_column.

Оба входа к этой операции: mysqli_fetch_row, mysqli_result::fetch_row.

mysqli_result::fetch_rowПолучить следующую строку как список значений.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_row(mysqli_result $result): array|null|false; mysqli_result::fetch_row(): array|null|false

Извлечь одну строку в удобной форме. Числовые позиции 0 и 1 соответствуют порядку колонок SELECT.

Данные и действие: mysqli_result::fetch_row
  1. $result->fetch_row()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_row();
echo $row[0], ' — ', $row[1], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Получить следующую строку как список значений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultОбъект набора строк.

Массив с индексами 0..N−1, null в конце, false при ошибке. SQL NULL становится null. Нет потери одинаковых имён колонок, но есть зависимость от порядка SELECT. Не путайте с fetch_column: тот возвращает только одно значение и тоже сдвигает строку.

Путь данных. SELECT задаёт порядок → fetch_row создаёт список → Индекс 0 означает первую колонку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Нумерация с нуля. Порядок соответствует SELECT, поэтому смена списка колонок требует пересмотра индексов в PHP.

Получить колонки по позицииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen', 120");
$row = $result->fetch_row();
echo $row[0], ':', $row[1], "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Квадратные скобки слева распределяют два элемента массива по двум переменным. Для прикладного кода AS order_id/customer_id часто понятнее позиционного соглашения.

Не потерять две одноимённые колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 7 AS id, 9 AS id');
[$orderId, $customerId] = mysqli_fetch_row($result);
echo $orderId, ':', $customerId, "\n";
Ожидаемый результат
7:9

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_column.

Оба входа к этой операции: mysqli_fetch_row, mysqli_result::fetch_row.

mysqli_fetch_arrayВыбрать именные, числовые или оба вида ключей очередной строки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_array(mysqli_result $result, int $mode = MYSQLI_BOTH): array|null|false; mysqli_result::fetch_array(int $mode = MYSQLI_BOTH): array|null|false

Извлечь одну строку в удобной форме. ASSOC выбирает именные ключи; NUM — позиции; BOTH даёт оба способа доступа к той же строке.

Данные и действие: mysqli_fetch_array
  1. $result->fetch_array(MYSQLI_ASSOC)
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_array(MYSQLI_ASSOC);
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Выбрать именные, числовые или оба вида ключей очередной строки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeMYSQLI_ASSOC, MYSQLI_NUM либо MYSQLI_BOTH по умолчанию.

Массив/null/false. ASSOC совпадает с fetch_assoc, NUM — с fetch_row; BOTH сочетает оба набора ключей. Имена регистрозависимы, дубликаты именных ключей перезаписываются, SQL NULL становится PHP null.

Путь данных. Строка приходит из набора → mode задаёт ключи → BOTH содержит два обращения к одному значению.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. MYSQLI_BOTH создаёт числовой и строковый ключ для каждой колонки. Это не две строки и не два разных товара; count такого массива не равно числу колонок.

Два способа обратиться к одному значениюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen' AS name");
$row = $result->fetch_array();
echo $row[0], ':', $row['name'], "\n";
Ожидаемый результат
Pen:Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выбор ASSOC/NUM не ускоряет SQL на сервере, он задаёт форму результата в PHP. ASSOC понятнее шаблону страницы, NUM удобен экспорту по фиксированным колонкам.

Явно выбрать компактную форму строкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products WHERE id = 3');
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
echo count($row), ':', $row['name'], "\n";
Ожидаемый результат
1:Box

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_array, mysqli_result::fetch_array.

mysqli_result::fetch_arrayВыбрать именные, числовые или оба вида ключей очередной строки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_array(mysqli_result $result, int $mode = MYSQLI_BOTH): array|null|false; mysqli_result::fetch_array(int $mode = MYSQLI_BOTH): array|null|false

Извлечь одну строку в удобной форме. ASSOC выбирает именные ключи; NUM — позиции; BOTH даёт оба способа доступа к той же строке.

Данные и действие: mysqli_result::fetch_array
  1. $result->fetch_array(MYSQLI_ASSOC)
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_array(MYSQLI_ASSOC);
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Выбрать именные, числовые или оба вида ключей очередной строки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeMYSQLI_ASSOC, MYSQLI_NUM либо MYSQLI_BOTH по умолчанию.

Массив/null/false. ASSOC совпадает с fetch_assoc, NUM — с fetch_row; BOTH сочетает оба набора ключей. Имена регистрозависимы, дубликаты именных ключей перезаписываются, SQL NULL становится PHP null.

Путь данных. Строка приходит из набора → mode задаёт ключи → BOTH содержит два обращения к одному значению.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. MYSQLI_BOTH создаёт числовой и строковый ключ для каждой колонки. Это не две строки и не два разных товара; count такого массива не равно числу колонок.

Два способа обратиться к одному значениюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen' AS name");
$row = $result->fetch_array();
echo $row[0], ':', $row['name'], "\n";
Ожидаемый результат
Pen:Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Выбор ASSOC/NUM не ускоряет SQL на сервере, он задаёт форму результата в PHP. ASSOC понятнее шаблону страницы, NUM удобен экспорту по фиксированным колонкам.

Явно выбрать компактную форму строкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products WHERE id = 3');
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
echo count($row), ':', $row['name'], "\n";
Ожидаемый результат
1:Box

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_array, mysqli_result::fetch_array.

mysqli_fetch_allСобрать все оставшиеся строки в массив для небольшого ответа или отчёта.

PHP 5.3+; libmysqlclient с 8.1 · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array; mysqli_result::fetch_all(int $mode = MYSQLI_NUM): array

Подготовить маленький каталог для HTML-шаблона. Все оставшиеся строки копируются в массив PHP. Для трёх товаров это удобно: массив можно проверить и передать представлению.

Данные и действие: mysqli_fetch_all
  1. $result->fetch_all(MYSQLI_ASSOC)
  2. Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
foreach ($rows as $row)Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить маленький каталог для HTML-шаблонаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
$products = $result->fetch_all(MYSQLI_ASSOC);
$result->free();
foreach ($products as $row) { echo $row['name'], ' — ', $row['stock'], " шт.\n"; }
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Не загружайте весь многомиллионный каталог ради трёх строк страницы. Ограничивайте SELECT и используйте стабильную пагинацию; для подсчёта — COUNT(*).

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

Собрать все оставшиеся строки в массив для небольшого ответа или отчёта.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeMYSQLI_NUM по умолчанию, MYSQLI_ASSOC или MYSQLI_BOTH.

Двумерный массив; если строк не осталось — []. До PHP 8.1 только mysqlnd, с 8.1 также исторический libmysqlclient. Память растёт с количеством строк и колонок; удобство одной команды не делает неограниченную выгрузку дешёвой.

Путь данных. Набор имеет текущую позицию → Все оставшиеся строки копируются в массив → Приложение обращается products[1][name].

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внешний массив хранит строки, внутренний — колонки. Индекс 1 означает вторую строку; он не является ID товара. Такой массив удобно преобразовать и отдать JSON API.

Собрать небольшой каталог в многомерный массивПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name, price FROM course_products ORDER BY id');
$products = $result->fetch_all(MYSQLI_ASSOC);
echo $products[1]['name'], ':', count($products), "\n";
Ожидаемый результат
Notebook:3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. fetch_all начинает с текущей позиции, а не обязательно с первой строки. Для больших выборок это дополнительный большой PHP-массив поверх буфера; читайте построчно или ограничивайте страницы.

Получить только оставшиеся строкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
echo $result->fetch_column(), "\n";
$remaining = mysqli_fetch_all($result, MYSQLI_NUM);
echo $remaining[0][0], ':', count($remaining), "\n";
Ожидаемый результат
Pen
Notebook:2

Связанные операции: mysqli_fetch_assoc, mysqli_use_result.

Оба входа к этой операции: mysqli_fetch_all, mysqli_result::fetch_all.

mysqli_result::fetch_allСобрать все оставшиеся строки в массив для небольшого ответа или отчёта.

PHP 5.3+; libmysqlclient с 8.1 · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array; mysqli_result::fetch_all(int $mode = MYSQLI_NUM): array

Подготовить маленький каталог для HTML-шаблона. Все оставшиеся строки копируются в массив PHP. Для трёх товаров это удобно: массив можно проверить и передать представлению.

Данные и действие: mysqli_result::fetch_all
  1. $result->fetch_all(MYSQLI_ASSOC)
  2. Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
foreach ($rows as $row)Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить маленький каталог для HTML-шаблонаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
$products = $result->fetch_all(MYSQLI_ASSOC);
$result->free();
foreach ($products as $row) { echo $row['name'], ' — ', $row['stock'], " шт.\n"; }
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Не загружайте весь многомиллионный каталог ради трёх строк страницы. Ограничивайте SELECT и используйте стабильную пагинацию; для подсчёта — COUNT(*).

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

Собрать все оставшиеся строки в массив для небольшого ответа или отчёта.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$modeMYSQLI_NUM по умолчанию, MYSQLI_ASSOC или MYSQLI_BOTH.

Двумерный массив; если строк не осталось — []. До PHP 8.1 только mysqlnd, с 8.1 также исторический libmysqlclient. Память растёт с количеством строк и колонок; удобство одной команды не делает неограниченную выгрузку дешёвой.

Путь данных. Набор имеет текущую позицию → Все оставшиеся строки копируются в массив → Приложение обращается products[1][name].

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внешний массив хранит строки, внутренний — колонки. Индекс 1 означает вторую строку; он не является ID товара. Такой массив удобно преобразовать и отдать JSON API.

Собрать небольшой каталог в многомерный массивПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name, price FROM course_products ORDER BY id');
$products = $result->fetch_all(MYSQLI_ASSOC);
echo $products[1]['name'], ':', count($products), "\n";
Ожидаемый результат
Notebook:3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. fetch_all начинает с текущей позиции, а не обязательно с первой строки. Для больших выборок это дополнительный большой PHP-массив поверх буфера; читайте построчно или ограничивайте страницы.

Получить только оставшиеся строкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
echo $result->fetch_column(), "\n";
$remaining = mysqli_fetch_all($result, MYSQLI_NUM);
echo $remaining[0][0], ':', count($remaining), "\n";
Ожидаемый результат
Pen
Notebook:2

Связанные операции: mysqli_fetch_assoc, mysqli_use_result.

Оба входа к этой операции: mysqli_fetch_all, mysqli_result::fetch_all.

mysqli_fetch_columnИзвлечь одно значение следующей строки без промежуточного массива.

PHP 8.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_column(mysqli_result $result, int $column = 0): null|int|float|string|false; mysqli_result::fetch_column(int $column = 0): null|int|float|string|false

Прочитать количество доступных позиций. Метод читает одну колонку следующей строки. COUNT(*) уже вычислен сервером и пришёл как одно значение.

Данные и действие: mysqli_fetch_column
  1. $result->fetch_column()
  2. Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.
  3. После выполнения: В наличии: 2 наименования

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Прочитать количество доступных позицийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT COUNT(*) FROM products WHERE stock > 0');
echo 'В наличии: ', $result->fetch_column(), " наименования\n";
Ожидаемый результат
В наличии: 2 наименования

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.

Если требование изменится. false означает конец;0 иNULL могут быть данными. Для двух колонок одного товара используйте fetch_assoc/fetch_row, иначе следующий fetch_column сдвинет строку.

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

Извлечь одно значение следующей строки без промежуточного массива.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$columnНомер колонки с нуля, по умолчанию 0; должен существовать.

Значение либо false при отсутствии следующей строки. SQL NULL превращается в null. Возврат 0, строка 0 и пустая строка не означают конец. Неверный индекс вызывает ошибку аргумента. Для нескольких колонок одной строки нужен fetch_assoc/fetch_row.

Путь данных. Очередная строка прочитана → Выбрана колонка N → Остальные колонки этой строки не возвращаются → Следующий вызов читает следующую строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. COUNT считает сервер; fetch_column извлекает первую колонку первой строки. num_rows у этой выборки был бы 1: одна строка с числом 3, а не три товара.

Получить одно агрегированное числоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT COUNT(*) FROM course_products');
echo $result->fetch_column(), "\n";
Ожидаемый результат
3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Строгое !== false не теряет число 0 и null. Каждый вызов продвигает целую строку; нельзя вызвать fetch_column(0), затем fetch_column(1) ради двух колонок той же строки.

Не спутать ноль, NULL и конецПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 0 AS value UNION ALL SELECT NULL');
while (($value = mysqli_fetch_column($result)) !== false) {
    echo $value === null ? 'NULL' : (string) $value;
    echo "\n";
}
Ожидаемый результат
0
NULL

Связанные операции: mysqli_fetch_row, mysqli_fetch_assoc.

Оба входа к этой операции: mysqli_fetch_column, mysqli_result::fetch_column.

mysqli_result::fetch_columnИзвлечь одно значение следующей строки без промежуточного массива.

PHP 8.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_column(mysqli_result $result, int $column = 0): null|int|float|string|false; mysqli_result::fetch_column(int $column = 0): null|int|float|string|false

Прочитать количество доступных позиций. Метод читает одну колонку следующей строки. COUNT(*) уже вычислен сервером и пришёл как одно значение.

Данные и действие: mysqli_result::fetch_column
  1. $result->fetch_column()
  2. Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.
  3. После выполнения: В наличии: 2 наименования

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Прочитать количество доступных позицийПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT COUNT(*) FROM products WHERE stock > 0');
echo 'В наличии: ', $result->fetch_column(), " наименования\n";
Ожидаемый результат
В наличии: 2 наименования

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.

Если требование изменится. false означает конец;0 иNULL могут быть данными. Для двух колонок одного товара используйте fetch_assoc/fetch_row, иначе следующий fetch_column сдвинет строку.

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

Извлечь одно значение следующей строки без промежуточного массива.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$columnНомер колонки с нуля, по умолчанию 0; должен существовать.

Значение либо false при отсутствии следующей строки. SQL NULL превращается в null. Возврат 0, строка 0 и пустая строка не означают конец. Неверный индекс вызывает ошибку аргумента. Для нескольких колонок одной строки нужен fetch_assoc/fetch_row.

Путь данных. Очередная строка прочитана → Выбрана колонка N → Остальные колонки этой строки не возвращаются → Следующий вызов читает следующую строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. COUNT считает сервер; fetch_column извлекает первую колонку первой строки. num_rows у этой выборки был бы 1: одна строка с числом 3, а не три товара.

Получить одно агрегированное числоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT COUNT(*) FROM course_products');
echo $result->fetch_column(), "\n";
Ожидаемый результат
3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Строгое !== false не теряет число 0 и null. Каждый вызов продвигает целую строку; нельзя вызвать fetch_column(0), затем fetch_column(1) ради двух колонок той же строки.

Не спутать ноль, NULL и конецПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 0 AS value UNION ALL SELECT NULL');
while (($value = mysqli_fetch_column($result)) !== false) {
    echo $value === null ? 'NULL' : (string) $value;
    echo "\n";
}
Ожидаемый результат
0
NULL

Связанные операции: mysqli_fetch_row, mysqli_fetch_assoc.

Оба входа к этой операции: mysqli_fetch_column, mysqli_result::fetch_column.

mysqli_fetch_objectПревратить следующую строку в объект, когда код работает со свойствами.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_object(mysqli_result $result, string $class = "stdClass", array $constructor_args = []): object|null|false; mysqli_result::fetch_object(string $class = "stdClass", array $constructor_args = []): object|null|false

Извлечь одну строку в удобной форме. Без имени своего класса создаётся stdClass: колонки становятся свойствами, читаемыми через стрелку.

Данные и действие: mysqli_fetch_object
  1. $result->fetch_object()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$product = $result->fetch_object();
echo $product->name, ' — ', $product->stock, " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Превратить следующую строку в объект, когда код работает со свойствами.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$classИмя доступного класса, по умолчанию stdClass.
$constructor_argsМассив аргументов его конструктора; по умолчанию [].

Объект/null/false. Свойства устанавливаются до конструктора; его код может изменить загруженные значения. Имена чувствительны к регистру, дубликаты перезаписываются, NULL остаётся null. С 8.3 ненулевые constructor_args без конструктора вызывают ValueError (прежде Exception); с 8.0 [] допустим для конструктора без аргументов.

Путь данных. Строка задаёт свойства → Создан экземпляр указанного класса → Свойства заполнены → Конструктор получает свои аргументы.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без собственного класса это stdClass: поля строки становятся свойствами. Такой объект ещё не является полноценной бизнес-моделью, которая проверяет допустимые переходы состояния.

Прочитать строку как объект с полямиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 7 AS id, 'Pen' AS name");
$product = $result->fetch_object();
echo $product->id, ':', $product->name, "\n";
Ожидаемый результат
7:Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Драйвер сначала заполняет свойства, затем вызывает конструктор. Объявите ожидаемые свойства: динамические свойства произвольных классов deprecated с 8.2, типы должны подходить данным. Для строгой модели удобнее явная фабрика из массива.

Увидеть порядок заполнения и конструктораПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
class ProductRow {
    public string $name;
    public string $label;
    public function __construct(string $prefix) { $this->label = $prefix . $this->name; }
}
$result = $db->query("SELECT 'Pen' AS name");
$product = mysqli_fetch_object($result, ProductRow::class, ['Товар: ']);
echo $product->label, "\n";
Ожидаемый результат
Товар: Pen

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_object, mysqli_result::fetch_object.

mysqli_result::fetch_objectПревратить следующую строку в объект, когда код работает со свойствами.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_object(mysqli_result $result, string $class = "stdClass", array $constructor_args = []): object|null|false; mysqli_result::fetch_object(string $class = "stdClass", array $constructor_args = []): object|null|false

Извлечь одну строку в удобной форме. Без имени своего класса создаётся stdClass: колонки становятся свойствами, читаемыми через стрелку.

Данные и действие: mysqli_result::fetch_object
  1. $result->fetch_object()
  2. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Извлечь одну строку в удобной формеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$product = $result->fetch_object();
echo $product->name, ' — ', $product->stock, " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. В общем случае обрабатывайте конец и ошибку согласно контракту ниже. Повторный fetch сдвигает строку; одинаковые имена JOIN нужно разнести через AS или читать позиционно.

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

Превратить следующую строку в объект, когда код работает со свойствами.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$classИмя доступного класса, по умолчанию stdClass.
$constructor_argsМассив аргументов его конструктора; по умолчанию [].

Объект/null/false. Свойства устанавливаются до конструктора; его код может изменить загруженные значения. Имена чувствительны к регистру, дубликаты перезаписываются, NULL остаётся null. С 8.3 ненулевые constructor_args без конструктора вызывают ValueError (прежде Exception); с 8.0 [] допустим для конструктора без аргументов.

Путь данных. Строка задаёт свойства → Создан экземпляр указанного класса → Свойства заполнены → Конструктор получает свои аргументы.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без собственного класса это stdClass: поля строки становятся свойствами. Такой объект ещё не является полноценной бизнес-моделью, которая проверяет допустимые переходы состояния.

Прочитать строку как объект с полямиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 7 AS id, 'Pen' AS name");
$product = $result->fetch_object();
echo $product->id, ':', $product->name, "\n";
Ожидаемый результат
7:Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Драйвер сначала заполняет свойства, затем вызывает конструктор. Объявите ожидаемые свойства: динамические свойства произвольных классов deprecated с 8.2, типы должны подходить данным. Для строгой модели удобнее явная фабрика из массива.

Увидеть порядок заполнения и конструктораПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
class ProductRow {
    public string $name;
    public string $label;
    public function __construct(string $prefix) { $this->label = $prefix . $this->name; }
}
$result = $db->query("SELECT 'Pen' AS name");
$product = mysqli_fetch_object($result, ProductRow::class, ['Товар: ']);
echo $product->label, "\n";
Ожидаемый результат
Товар: Pen

Связанные операции: mysqli_fetch_assoc, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_object, mysqli_result::fetch_object.

mysqli_data_seekПередвинуть чтение к строке уже буферизованного результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_data_seek(mysqli_result $result, int $offset): bool; mysqli_result::data_seek(int $offset): bool

Вернуться к выбранной строке небольшого буфера. Индекс 1 — вторая строка результата, а не товар с id1. Операция применима к буферизованному ответу.

Данные и действие: mysqli_data_seek
  1. $result->data_seek(1)
  2. SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Вернуться к выбранной строке небольшого буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
$result->data_seek(1);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. С потоком use_result произвольная перемотка недоступна. Для постраничного интерфейса обычно нужен ограниченный SQL-запрос, а не загрузка всего каталога и seek.

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

Передвинуть чтение к строке уже буферизованного результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$offsetНомер строки 0..num_rows−1.

true/false; отрицательный индекс — ошибка аргумента. Требуется буферизованный набор: MYSQLI_USE_RESULT не поддерживает произвольный доступ. Это клиентская позиция, а не SQL OFFSET и не ID строки в таблице.

Путь данных. Буфер содержит три строки → data_seek(2) выбирает третью → Следующий fetch читает Box.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Указатель чтения возвращается к строке с индексом 0; сам SQL повторно не выполняется.

Вернуться к началу небольшого результатаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
echo $result->fetch_column(), "\n";
$result->data_seek(0);
echo $result->fetch_column(), "\n";
Ожидаемый результат
Pen
Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Сначала исключаем пустой набор. Для получения единственной последней записи с сервера лучше ORDER BY ... DESC LIMIT 1, чем передавать весь каталог ради перемотки.

Прочитать последнюю строку имеющегося буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
if ($result->num_rows > 0) {
    mysqli_data_seek($result, $result->num_rows - 1);
    echo mysqli_fetch_column($result), "\n";
}
Ожидаемый результат
Box

Связанные операции: mysqli_store_result, mysqli_num_rows.

Оба входа к этой операции: mysqli_data_seek, mysqli_result::data_seek.

mysqli_result::data_seekПередвинуть чтение к строке уже буферизованного результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_data_seek(mysqli_result $result, int $offset): bool; mysqli_result::data_seek(int $offset): bool

Вернуться к выбранной строке небольшого буфера. Индекс 1 — вторая строка результата, а не товар с id1. Операция применима к буферизованному ответу.

Данные и действие: mysqli_result::data_seek
  1. $result->data_seek(1)
  2. SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Вернуться к выбранной строке небольшого буфераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
$result->data_seek(1);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. С потоком use_result произвольная перемотка недоступна. Для постраничного интерфейса обычно нужен ограниченный SQL-запрос, а не загрузка всего каталога и seek.

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

Передвинуть чтение к строке уже буферизованного результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$offsetНомер строки 0..num_rows−1.

true/false; отрицательный индекс — ошибка аргумента. Требуется буферизованный набор: MYSQLI_USE_RESULT не поддерживает произвольный доступ. Это клиентская позиция, а не SQL OFFSET и не ID строки в таблице.

Путь данных. Буфер содержит три строки → data_seek(2) выбирает третью → Следующий fetch читает Box.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Указатель чтения возвращается к строке с индексом 0; сам SQL повторно не выполняется.

Вернуться к началу небольшого результатаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
echo $result->fetch_column(), "\n";
$result->data_seek(0);
echo $result->fetch_column(), "\n";
Ожидаемый результат
Pen
Pen

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Сначала исключаем пустой набор. Для получения единственной последней записи с сервера лучше ORDER BY ... DESC LIMIT 1, чем передавать весь каталог ради перемотки.

Прочитать последнюю строку имеющегося буфераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
if ($result->num_rows > 0) {
    mysqli_data_seek($result, $result->num_rows - 1);
    echo mysqli_fetch_column($result), "\n";
}
Ожидаемый результат
Box

Связанные операции: mysqli_store_result, mysqli_num_rows.

Оба входа к этой операции: mysqli_data_seek, mysqli_result::data_seek.

mysqli_num_rowsУзнать количество строк текущего результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_num_rows(mysqli_result $result): int|string; readonly mysqli_result::$num_rows

Сообщить размер уже полученного маленького ответа. Свойство без круглых скобок показывает количество строк буфера. Процедурный вариант mysqli_num_rows($result) возвращает то же.

Данные и действие: mysqli_num_rows
  1. $result->num_rows
  2. Число 3 относится именно к этому ответу, а не к любому состоянию таблицы. После заголовка показываем сами товары.
  3. После выполнения: В этом списке: 3 товара · Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сообщить размер уже полученного маленького ответаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
echo 'В этом списке: ', $result->num_rows, " товара\n";
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
В этом списке: 3 товара
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Число 3 относится именно к этому ответу, а не к любому состоянию таблицы. После заголовка показываем сами товары.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. У потока use_result полный размер заранее неизвестен. Для общего счётчика базы выполните COUNT(*) с тем же фильтром; не загружайте строки только ради счёта.

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

Узнать количество строк текущего результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultБуферизованный набор либо уже дочитанный поток.

int; если больше PHP_INT_MAX — строка. У небуферизованного результата 0 до чтения всех строк, затем фактически полученное количество. Для общего количества с фильтром используйте SELECT COUNT(*), учитывая, что он возвращает одну строку с числом.

Путь данных. SQL сформировал набор → Буфер знает его размер → num_rows сообщает строки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Три товара и две колонки образуют таблицу 3×2. num_rows относится к полученному набору, не ко всей исходной таблице без WHERE/LIMIT.

Число строк и число колонок — разные размерыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products ORDER BY id');
echo $result->num_rows, 'x', $result->field_count, "\n";
Ожидаемый результат
3x2

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ноль строк не означает отсутствие схемы результата. Это важно при генерации заголовков таблицы и экспорта.

Даже пустой набор сохраняет колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS id, 10 AS quantity WHERE 1 = 0');
echo mysqli_num_rows($result), 'x', mysqli_num_fields($result), "\n";
Ожидаемый результат
0x2

Связанные операции: mysqli_fetch_column, mysqli_use_result.

Оба входа к этой операции: mysqli_num_rows, mysqli_result::$num_rows.

mysqli_result::$num_rowsУзнать количество строк текущего результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_num_rows(mysqli_result $result): int|string; readonly mysqli_result::$num_rows

Сообщить размер уже полученного маленького ответа. Свойство без круглых скобок показывает количество строк буфера. Процедурный вариант mysqli_num_rows($result) возвращает то же.

Данные и действие: mysqli_result::$num_rows
  1. $result->num_rows
  2. Число 3 относится именно к этому ответу, а не к любому состоянию таблицы. После заголовка показываем сами товары.
  3. После выполнения: В этом списке: 3 товара · Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сообщить размер уже полученного маленького ответаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
echo 'В этом списке: ', $result->num_rows, " товара\n";
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
В этом списке: 3 товара
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Число 3 относится именно к этому ответу, а не к любому состоянию таблицы. После заголовка показываем сами товары.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. У потока use_result полный размер заранее неизвестен. Для общего счётчика базы выполните COUNT(*) с тем же фильтром; не загружайте строки только ради счёта.

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

Узнать количество строк текущего результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultБуферизованный набор либо уже дочитанный поток.

int; если больше PHP_INT_MAX — строка. У небуферизованного результата 0 до чтения всех строк, затем фактически полученное количество. Для общего количества с фильтром используйте SELECT COUNT(*), учитывая, что он возвращает одну строку с числом.

Путь данных. SQL сформировал набор → Буфер знает его размер → num_rows сообщает строки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Три товара и две колонки образуют таблицу 3×2. num_rows относится к полученному набору, не ко всей исходной таблице без WHERE/LIMIT.

Число строк и число колонок — разные размерыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products ORDER BY id');
echo $result->num_rows, 'x', $result->field_count, "\n";
Ожидаемый результат
3x2

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ноль строк не означает отсутствие схемы результата. Это важно при генерации заголовков таблицы и экспорта.

Даже пустой набор сохраняет колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS id, 10 AS quantity WHERE 1 = 0');
echo mysqli_num_rows($result), 'x', mysqli_num_fields($result), "\n";
Ожидаемый результат
0x2

Связанные операции: mysqli_fetch_column, mysqli_use_result.

Оба входа к этой операции: mysqli_num_rows, mysqli_result::$num_rows.

mysqli_num_fieldsУзнать количество колонок результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_num_fields(mysqli_result $result): int; readonly mysqli_result::$field_count

Проверить структуру экспорта до чтения строк. field_count/num_fields считают колонки ответа. Здесь ожидаются name и stock, всего 2.

Данные и действие: mysqli_num_fields
  1. $result->field_count
  2. Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить структуру экспорта до чтения строкПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
if ($result->field_count !== 2) { throw new RuntimeException('Ожидались название и остаток'); }
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не путайте число колонок со строками, параметрами statement или affected_rows после UPDATE.

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

Узнать количество колонок результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат SELECT/SHOW и подобных команд.

Целое число выбранных колонок; доступно даже без строк. Не равно mysqli::$field_count для другого, более позднего запроса: свойство результата относится именно к этому объекту.

Путь данных. SELECT задаёт две колонки → Даже ноль строк сохраняет описание → field_count равен двум.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Три товара и две колонки образуют таблицу 3×2. num_rows относится к полученному набору, не ко всей исходной таблице без WHERE/LIMIT.

Число строк и число колонок — разные размерыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products ORDER BY id');
echo $result->num_rows, 'x', $result->field_count, "\n";
Ожидаемый результат
3x2

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ноль строк не означает отсутствие схемы результата. Это важно при генерации заголовков таблицы и экспорта.

Даже пустой набор сохраняет колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS id, 10 AS quantity WHERE 1 = 0');
echo mysqli_num_rows($result), 'x', mysqli_num_fields($result), "\n";
Ожидаемый результат
0x2

Связанные операции: mysqli_fetch_fields, mysqli_field_count.

Оба входа к этой операции: mysqli_num_fields, mysqli_result::$field_count.

mysqli_result::$field_countУзнать количество колонок результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_num_fields(mysqli_result $result): int; readonly mysqli_result::$field_count

Проверить структуру экспорта до чтения строк. field_count/num_fields считают колонки ответа. Здесь ожидаются name и stock, всего 2.

Данные и действие: mysqli_result::$field_count
  1. $result->field_count
  2. Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить структуру экспорта до чтения строкПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
if ($result->field_count !== 2) { throw new RuntimeException('Ожидались название и остаток'); }
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не путайте число колонок со строками, параметрами statement или affected_rows после UPDATE.

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

Узнать количество колонок результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат SELECT/SHOW и подобных команд.

Целое число выбранных колонок; доступно даже без строк. Не равно mysqli::$field_count для другого, более позднего запроса: свойство результата относится именно к этому объекту.

Путь данных. SELECT задаёт две колонки → Даже ноль строк сохраняет описание → field_count равен двум.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Три товара и две колонки образуют таблицу 3×2. num_rows относится к полученному набору, не ко всей исходной таблице без WHERE/LIMIT.

Число строк и число колонок — разные размерыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products ORDER BY id');
echo $result->num_rows, 'x', $result->field_count, "\n";
Ожидаемый результат
3x2

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ноль строк не означает отсутствие схемы результата. Это важно при генерации заголовков таблицы и экспорта.

Даже пустой набор сохраняет колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42 AS id, 10 AS quantity WHERE 1 = 0');
echo mysqli_num_rows($result), 'x', mysqli_num_fields($result), "\n";
Ожидаемый результат
0x2

Связанные операции: mysqli_fetch_fields, mysqli_field_count.

Оба входа к этой операции: mysqli_num_fields, mysqli_result::$field_count.

mysqli_fetch_lengthsПолучить байтовую длину значений только что прочитанной строки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_lengths(mysqli_result $result): array|false; readonly mysqli_result::$lengths: ?array

Измерить байты уже полученных полей. Длины относятся к последней прочитанной строке. Это байты, а не число видимых букв; русское название в UTF-8 занимает больше байтов, чем символов.

Данные и действие: mysqli_fetch_lengths
  1. $result->lengths
  2. В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.
  3. После выполнения: Молоток — 8 шт. · Название занимает 14 байт UTF-8

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Измерить байты уже полученных полейПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_row();
$lengths = $result->lengths;
if ($lengths === false) { throw new RuntimeException('Сначала нужно прочитать строку'); }
echo $row[0], ' — ', $row[1], " шт.\n";
echo 'Название занимает ', $lengths[0], " байт UTF-8\n";
Ожидаемый результат
Молоток — 8 шт.
Название занимает 14 байт UTF-8

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. До fetch либо после конца набора lengths может отсутствовать. Для числа Unicode-символов используйте соответствующие строковые функции, а для интерфейса учитывайте графемы.

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

Получить байтовую длину значений только что прочитанной строки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат сразу после успешного fetch_row/array/assoc/object.

Массив целых длин по порядку колонок; процедурно false вне действительной строки, OO-свойство nullable. Не включает завершающий нулевой байт, SQL NULL и пустое значение могут иметь одинаковую длину 0 — различайте их по самим данным.

Путь данных. fetch прочитал Я и abc → lengths измерил байты → PHP получает [2,3].

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. В UTF-8 буква Я занимает 2 байта. lengths описывает значения только последней прочитанной строки, а не максимальную ширину столбца.

Отличить байты от количества буквПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Я' AS letter, 'abc' AS text");
$result->fetch_row();
echo implode(':', $result->lengths), "\n";
Ожидаемый результат
2:3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не вызывайте fetch_lengths до первого fetch и после конца: процедурный вариант возвращает false; nullable-свойство может быть null. Это длина данных без завершающего NUL, а не резервирование памяти PHP.

Измерять каждую строку экспорта после fetchПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'A' AS value UNION ALL SELECT 'ABC'");
while ($row = mysqli_fetch_row($result)) {
    echo $row[0], ':', mysqli_fetch_lengths($result)[0], "\n";
}
Ожидаемый результат
A:1
ABC:3

Связанные операции: mysqli_fetch_fields, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_lengths, mysqli_result::$lengths.

mysqli_result::$lengthsПолучить байтовую длину значений только что прочитанной строки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_lengths(mysqli_result $result): array|false; readonly mysqli_result::$lengths: ?array

Измерить байты уже полученных полей. Длины относятся к последней прочитанной строке. Это байты, а не число видимых букв; русское название в UTF-8 занимает больше байтов, чем символов.

Данные и действие: mysqli_result::$lengths
  1. $result->lengths
  2. В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.
  3. После выполнения: Молоток — 8 шт. · Название занимает 14 байт UTF-8

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Измерить байты уже полученных полейПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_row();
$lengths = $result->lengths;
if ($lengths === false) { throw new RuntimeException('Сначала нужно прочитать строку'); }
echo $row[0], ' — ', $row[1], " шт.\n";
echo 'Название занимает ', $lengths[0], " байт UTF-8\n";
Ожидаемый результат
Молоток — 8 шт.
Название занимает 14 байт UTF-8

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. До fetch либо после конца набора lengths может отсутствовать. Для числа Unicode-символов используйте соответствующие строковые функции, а для интерфейса учитывайте графемы.

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

Получить байтовую длину значений только что прочитанной строки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат сразу после успешного fetch_row/array/assoc/object.

Массив целых длин по порядку колонок; процедурно false вне действительной строки, OO-свойство nullable. Не включает завершающий нулевой байт, SQL NULL и пустое значение могут иметь одинаковую длину 0 — различайте их по самим данным.

Путь данных. fetch прочитал Я и abc → lengths измерил байты → PHP получает [2,3].

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. В UTF-8 буква Я занимает 2 байта. lengths описывает значения только последней прочитанной строки, а не максимальную ширину столбца.

Отличить байты от количества буквПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Я' AS letter, 'abc' AS text");
$result->fetch_row();
echo implode(':', $result->lengths), "\n";
Ожидаемый результат
2:3

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не вызывайте fetch_lengths до первого fetch и после конца: процедурный вариант возвращает false; nullable-свойство может быть null. Это длина данных без завершающего NUL, а не резервирование памяти PHP.

Измерять каждую строку экспорта после fetchПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'A' AS value UNION ALL SELECT 'ABC'");
while ($row = mysqli_fetch_row($result)) {
    echo $row[0], ':', mysqli_fetch_lengths($result)[0], "\n";
}
Ожидаемый результат
A:1
ABC:3

Связанные операции: mysqli_fetch_fields, mysqli_fetch_row.

Оба входа к этой операции: mysqli_fetch_lengths, mysqli_result::$lengths.

mysqli_fetch_fieldПрочитать описание очередной колонки набора.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_field(mysqli_result $result): object|false; mysqli_result::fetch_field(): object|false

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается следующее описание колонки; курсор метаданных сдвигается.

Данные и действие: mysqli_fetch_field
  1. $result->fetch_field()
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$field = $result->fetch_field();
echo 'Первая колонка: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Прочитать описание очередной колонки набора.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор, у которого есть описание колонок.

Объект описания или false, когда описания закончились. У метаданных отдельный курсор: чтение колонок не передвигает строки.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Результат хранит схему → fetch_field выбирает очередную колонку → Свойства описывают имя, тип и признаки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Метаданные доступны при LIMIT 0. Это описание колонок, а не товарные данные. SQL alias title отличается от исходного имени name.

Получить имена для заголовка экспортаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name AS title, price FROM course_products LIMIT 0');
while ($field = $result->fetch_field()) {
    echo $field->name, ':', $field->orgname, "\n";
}
Ожидаемый результат
id:id
title:name
price:price

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Оператор & проверяет отдельный бит. Равенство всей flags одной константе неверно: одновременно могут быть установлены несколько признаков. Метаданные помогают экспорту, но не заменяют бизнес-валидацию.

Определить обязательную колонку по битовой маскеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products LIMIT 0');
$field = mysqli_fetch_field($result);
echo ($field->flags & MYSQLI_NOT_NULL_FLAG) ? 'NOT NULL' : 'NULL допустим';
echo "\n";
Ожидаемый результат
NOT NULL

Связанные операции: mysqli_fetch_fields, mysqli_fetch_field_direct, mysqli_field_seek.

Оба входа к этой операции: mysqli_fetch_field, mysqli_result::fetch_field.

mysqli_result::fetch_fieldПрочитать описание очередной колонки набора.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_field(mysqli_result $result): object|false; mysqli_result::fetch_field(): object|false

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается следующее описание колонки; курсор метаданных сдвигается.

Данные и действие: mysqli_result::fetch_field
  1. $result->fetch_field()
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$field = $result->fetch_field();
echo 'Первая колонка: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Прочитать описание очередной колонки набора.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор, у которого есть описание колонок.

Объект описания или false, когда описания закончились. У метаданных отдельный курсор: чтение колонок не передвигает строки.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Результат хранит схему → fetch_field выбирает очередную колонку → Свойства описывают имя, тип и признаки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Метаданные доступны при LIMIT 0. Это описание колонок, а не товарные данные. SQL alias title отличается от исходного имени name.

Получить имена для заголовка экспортаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name AS title, price FROM course_products LIMIT 0');
while ($field = $result->fetch_field()) {
    echo $field->name, ':', $field->orgname, "\n";
}
Ожидаемый результат
id:id
title:name
price:price

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Оператор & проверяет отдельный бит. Равенство всей flags одной константе неверно: одновременно могут быть установлены несколько признаков. Метаданные помогают экспорту, но не заменяют бизнес-валидацию.

Определить обязательную колонку по битовой маскеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products LIMIT 0');
$field = mysqli_fetch_field($result);
echo ($field->flags & MYSQLI_NOT_NULL_FLAG) ? 'NOT NULL' : 'NULL допустим';
echo "\n";
Ожидаемый результат
NOT NULL

Связанные операции: mysqli_fetch_fields, mysqli_fetch_field_direct, mysqli_field_seek.

Оба входа к этой операции: mysqli_fetch_field, mysqli_result::fetch_field.

mysqli_fetch_field_directПолучить метаданные одной колонки по её позиции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_field_direct(mysqli_result $result, int $index): object|false; mysqli_result::fetch_field_direct(int $index): object|false

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается описание по номеру без продвижения курсора колонок.

Данные и действие: mysqli_fetch_field_direct
  1. $result->fetch_field_direct(0)
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$field = $result->fetch_field_direct(0);
echo 'Первая колонка: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Получить метаданные одной колонки по её позиции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$index0..field_count−1, не значение ID.

Объект описания; сигнатура допускает false, неверный диапазон в современном PHP отклоняется как ошибка аргумента. Не меняет последовательность чтения строк.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Номер 1 выбирает вторую колонку → Метаданные дают name и orgname → Код различает подпись и источник.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Индекс 1 означает вторую колонку. Прямой доступ не предназначен для чтения второй строки.

Прочитать описание конкретной колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name AS title FROM course_products LIMIT 0');
$field = $result->fetch_field_direct(1);
echo $field->name, ':', $field->orgname, "\n";
Ожидаемый результат
title:name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. for подходит, когда известен диапазон индексов. Для готового массива всех описаний короче fetch_fields; нет необходимости вызывать запрос повторно для каждой колонки.

Разобрать схему результата по числу колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, price FROM course_products LIMIT 0');
for ($i = 0; $i < $result->field_count; $i++) {
    echo mysqli_fetch_field_direct($result, $i)->name, "\n";
}
Ожидаемый результат
id
price

Связанные операции: mysqli_fetch_fields, mysqli_fetch_field.

Оба входа к этой операции: mysqli_fetch_field_direct, mysqli_result::fetch_field_direct.

mysqli_result::fetch_field_directПолучить метаданные одной колонки по её позиции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_field_direct(mysqli_result $result, int $index): object|false; mysqli_result::fetch_field_direct(int $index): object|false

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается описание по номеру без продвижения курсора колонок.

Данные и действие: mysqli_result::fetch_field_direct
  1. $result->fetch_field_direct(0)
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$field = $result->fetch_field_direct(0);
echo 'Первая колонка: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Получить метаданные одной колонки по её позиции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$index0..field_count−1, не значение ID.

Объект описания; сигнатура допускает false, неверный диапазон в современном PHP отклоняется как ошибка аргумента. Не меняет последовательность чтения строк.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Номер 1 выбирает вторую колонку → Метаданные дают name и orgname → Код различает подпись и источник.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Индекс 1 означает вторую колонку. Прямой доступ не предназначен для чтения второй строки.

Прочитать описание конкретной колонкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name AS title FROM course_products LIMIT 0');
$field = $result->fetch_field_direct(1);
echo $field->name, ':', $field->orgname, "\n";
Ожидаемый результат
title:name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. for подходит, когда известен диапазон индексов. Для готового массива всех описаний короче fetch_fields; нет необходимости вызывать запрос повторно для каждой колонки.

Разобрать схему результата по числу колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, price FROM course_products LIMIT 0');
for ($i = 0; $i < $result->field_count; $i++) {
    echo mysqli_fetch_field_direct($result, $i)->name, "\n";
}
Ожидаемый результат
id
price

Связанные операции: mysqli_fetch_fields, mysqli_fetch_field.

Оба входа к этой операции: mysqli_fetch_field_direct, mysqli_result::fetch_field_direct.

mysqli_fetch_fieldsПолучить все описания колонок для экспорта или универсального просмотрщика.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_fields(mysqli_result $result): array; mysqli_result::fetch_fields(): array

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Получаем массив описаний всех колонок; он полезен для заголовков экспорта даже при пустом наборе строк.

Данные и действие: mysqli_fetch_fields
  1. $result->fetch_fields()
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$fields = $result->fetch_fields();
echo 'Первая колонка: ', $fields[0]->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Получить все описания колонок для экспорта или универсального просмотрщика.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат с метаданными.

Массив объектов, по одному на колонку. Полезен до чтения строк и при пустом наборе. Схема не сообщает права пользователя приложения на показ этих данных.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Набор хранит N колонок → fetch_fields создаёт N описаний → Приложение строит заголовок.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внешний массив содержит объекты описаний. Не путайте его с fetch_all, где внешний массив содержит реальные строки данных.

Получить всю схему одним массивомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products LIMIT 0');
$fields = $result->fetch_fields();
echo $fields[0]->name, ':', $fields[1]->name, "\n";
Ожидаемый результат
id:name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для настоящего CSV с произвольными именами используйте fputcsv; здесь фиксированные безопасные имена нужны, чтобы показать движение схемы в заголовок.

Сформировать CSV-заголовок из метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name, price FROM course_products LIMIT 0');
$names = [];
foreach (mysqli_fetch_fields($result) as $field) { $names[] = $field->name; }
echo implode(';', $names), "\n";
Ожидаемый результат
id;name;price

Связанные операции: mysqli_fetch_field, mysqli_fetch_all.

Оба входа к этой операции: mysqli_fetch_fields, mysqli_result::fetch_fields.

mysqli_result::fetch_fieldsПолучить все описания колонок для экспорта или универсального просмотрщика.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_fetch_fields(mysqli_result $result): array; mysqli_result::fetch_fields(): array

Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Получаем массив описаний всех колонок; он полезен для заголовков экспорта даже при пустом наборе строк.

Данные и действие: mysqli_result::fetch_fields
  1. $result->fetch_fields()
  2. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
  3. После выполнения: Первая колонка: name · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сопоставить описание колонки с её значениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$fields = $result->fetch_fields();
echo 'Первая колонка: ', $fields[0]->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Первая колонка: name
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. AS меняет name, исходное имя доступно отдельно как orgname. length/max_length и типы имеют версионные ограничения; не делайте из metadata универсальную проверку бизнес-данных.

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

Получить все описания колонок для экспорта или универсального просмотрщика.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultРезультат с метаданными.

Массив объектов, по одному на колонку. Полезен до чтения строк и при пустом наборе. Схема не сообщает права пользователя приложения на показ этих данных.

Свойство описания колонкиСмысл
name / orgnameНазвание в результате / исходное название при AS.
table / orgtable / dbТаблица или её alias / исходная таблица / схема; у выражения таблица может отсутствовать.
def / catalogСлужебные исторические поля: пустая строка / def.
max_lengthС PHP 8.1 всегда 0, не размер самого длинного фактического значения.
lengthОбъявленная ширина в байтах с учётом charset; для выражения abc в utf8mb4 может быть 12, хотя в текущем значении 3 байта.
charsetnrЧисловой ID charset результата.
flagsБитовая маска признаков: проверяют & MYSQLI_NOT_NULL_FLAG и другие константы.
typeКод типа MYSQLI_TYPE_*, не PHP-тип переменной.
decimalsДробные цифры чисел или доли секунды временного типа.

Путь данных. Набор хранит N колонок → fetch_fields создаёт N описаний → Приложение строит заголовок.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внешний массив содержит объекты описаний. Не путайте его с fetch_all, где внешний массив содержит реальные строки данных.

Получить всю схему одним массивомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name FROM course_products LIMIT 0');
$fields = $result->fetch_fields();
echo $fields[0]->name, ':', $fields[1]->name, "\n";
Ожидаемый результат
id:name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для настоящего CSV с произвольными именами используйте fputcsv; здесь фиксированные безопасные имена нужны, чтобы показать движение схемы в заголовок.

Сформировать CSV-заголовок из метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT id, name, price FROM course_products LIMIT 0');
$names = [];
foreach (mysqli_fetch_fields($result) as $field) { $names[] = $field->name; }
echo implode(';', $names), "\n";
Ожидаемый результат
id;name;price

Связанные операции: mysqli_fetch_field, mysqli_fetch_all.

Оба входа к этой операции: mysqli_fetch_fields, mysqli_result::fetch_fields.

mysqli_field_tellУзнать позицию последовательного чтения метаданных.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_tell(mysqli_result $result): int; readonly mysqli_result::$current_field

Перейти к описанию колонки остатка. Курсор колонок независим от курсора строк. Позиция 1 означает описание stock, а не второй товар.

Данные и действие: mysqli_field_tell
  1. $result->current_field
  2. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
  3. После выполнения: Колонка для количества: stock · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Перейти к описанию колонки остаткаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$result->fetch_field();
$position = $result->current_field;
$field = $result->fetch_field_direct($position);
echo 'Колонка для количества: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Колонка для количества: stock
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверяйте границы относительно field_count. data_seek перемещает строки, field_seek — описания колонок; это разные состояния.

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

Узнать позицию последовательного чтения метаданных.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор с курсором fetch_field.

Целое смещение курсора колонок. После чтения первой колонки оно равно 1; после последней может равняться field_count, что уже нельзя передавать field_seek. Не относится к номеру текущей строки.

Путь данных. fetch_field прочитал колонку → Курсор сдвинулся → field_tell возвращает следующую позицию.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Начальная позиция 0, fetch_field передвигает её к следующей колонке. field_seek возвращает к описанию первой; строковый курсор остаётся отдельным.

Увидеть отдельную позицию метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
echo $result->current_field, "\n";
$result->fetch_field();
echo $result->current_field, "\n";
$result->field_seek(0);
echo $result->fetch_field()->name, "\n";
Ожидаемый результат
0
1
id

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Восстанавливать можно только допустимый индекс 0..field_count−1, не позицию за последней колонкой. Для одноразового просмотра проще массив fetch_fields.

Сохранить и восстановить позицию обхода схемыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
$result->fetch_field();
$position = mysqli_field_tell($result);
mysqli_field_seek($result, 0);
echo mysqli_fetch_field($result)->name, "\n";
mysqli_field_seek($result, $position);
echo mysqli_fetch_field($result)->name, "\n";
Ожидаемый результат
id
quantity

Связанные операции: mysqli_field_seek, mysqli_fetch_field.

Оба входа к этой операции: mysqli_field_tell, mysqli_result::$current_field.

mysqli_result::$current_fieldУзнать позицию последовательного чтения метаданных.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_tell(mysqli_result $result): int; readonly mysqli_result::$current_field

Перейти к описанию колонки остатка. Курсор колонок независим от курсора строк. Позиция 1 означает описание stock, а не второй товар.

Данные и действие: mysqli_result::$current_field
  1. $result->current_field
  2. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
  3. После выполнения: Колонка для количества: stock · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Перейти к описанию колонки остаткаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$result->fetch_field();
$position = $result->current_field;
$field = $result->fetch_field_direct($position);
echo 'Колонка для количества: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Колонка для количества: stock
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверяйте границы относительно field_count. data_seek перемещает строки, field_seek — описания колонок; это разные состояния.

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

Узнать позицию последовательного чтения метаданных.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultНабор с курсором fetch_field.

Целое смещение курсора колонок. После чтения первой колонки оно равно 1; после последней может равняться field_count, что уже нельзя передавать field_seek. Не относится к номеру текущей строки.

Путь данных. fetch_field прочитал колонку → Курсор сдвинулся → field_tell возвращает следующую позицию.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Начальная позиция 0, fetch_field передвигает её к следующей колонке. field_seek возвращает к описанию первой; строковый курсор остаётся отдельным.

Увидеть отдельную позицию метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
echo $result->current_field, "\n";
$result->fetch_field();
echo $result->current_field, "\n";
$result->field_seek(0);
echo $result->fetch_field()->name, "\n";
Ожидаемый результат
0
1
id

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Восстанавливать можно только допустимый индекс 0..field_count−1, не позицию за последней колонкой. Для одноразового просмотра проще массив fetch_fields.

Сохранить и восстановить позицию обхода схемыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
$result->fetch_field();
$position = mysqli_field_tell($result);
mysqli_field_seek($result, 0);
echo mysqli_fetch_field($result)->name, "\n";
mysqli_field_seek($result, $position);
echo mysqli_fetch_field($result)->name, "\n";
Ожидаемый результат
id
quantity

Связанные операции: mysqli_field_seek, mysqli_fetch_field.

Оба входа к этой операции: mysqli_field_tell, mysqli_result::$current_field.

mysqli_field_seekИзменить позицию следующего fetch_field.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_seek(mysqli_result $result, int $index): true; mysqli_result::field_seek(int $index): true

Перейти к описанию колонки остатка. Курсор колонок независим от курсора строк. Позиция 1 означает описание stock, а не второй товар.

Данные и действие: mysqli_field_seek
  1. $result->field_seek(1)
  2. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
  3. После выполнения: Колонка для количества: stock · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Перейти к описанию колонки остаткаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$result->field_seek(1);
$field = $result->fetch_field();
echo 'Колонка для количества: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Колонка для количества: stock
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверяйте границы относительно field_count. data_seek перемещает строки, field_seek — описания колонок; это разные состояния.

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

Изменить позицию следующего fetch_field.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$indexИндекс колонки 0..field_count−1.

С PHP 8.0 при нормальном вызове всегда true (раньше false при отказе); неверный индекс — ValueError. Ноль возвращает курсор метаданных к первой колонке, а не перематывает данные строк.

Путь данных. Сохранено смещение → field_seek выбирает описание → fetch_field читает его.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Начальная позиция 0, fetch_field передвигает её к следующей колонке. field_seek возвращает к описанию первой; строковый курсор остаётся отдельным.

Увидеть отдельную позицию метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
echo $result->current_field, "\n";
$result->fetch_field();
echo $result->current_field, "\n";
$result->field_seek(0);
echo $result->fetch_field()->name, "\n";
Ожидаемый результат
0
1
id

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Восстанавливать можно только допустимый индекс 0..field_count−1, не позицию за последней колонкой. Для одноразового просмотра проще массив fetch_fields.

Сохранить и восстановить позицию обхода схемыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
$result->fetch_field();
$position = mysqli_field_tell($result);
mysqli_field_seek($result, 0);
echo mysqli_fetch_field($result)->name, "\n";
mysqli_field_seek($result, $position);
echo mysqli_fetch_field($result)->name, "\n";
Ожидаемый результат
id
quantity

Связанные операции: mysqli_field_tell, mysqli_data_seek.

Оба входа к этой операции: mysqli_field_seek, mysqli_result::field_seek.

mysqli_result::field_seekИзменить позицию следующего fetch_field.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_seek(mysqli_result $result, int $index): true; mysqli_result::field_seek(int $index): true

Перейти к описанию колонки остатка. Курсор колонок независим от курсора строк. Позиция 1 означает описание stock, а не второй товар.

Данные и действие: mysqli_result::field_seek
  1. $result->field_seek(1)
  2. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
  3. После выполнения: Колонка для количества: stock · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Перейти к описанию колонки остаткаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$result->field_seek(1);
$field = $result->fetch_field();
echo 'Колонка для количества: ', $field->name, "\n";
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Колонка для количества: stock
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Проверяйте границы относительно field_count. data_seek перемещает строки, field_seek — описания колонок; это разные состояния.

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

Изменить позицию следующего fetch_field.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$indexИндекс колонки 0..field_count−1.

С PHP 8.0 при нормальном вызове всегда true (раньше false при отказе); неверный индекс — ValueError. Ноль возвращает курсор метаданных к первой колонке, а не перематывает данные строк.

Путь данных. Сохранено смещение → field_seek выбирает описание → fetch_field читает его.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Начальная позиция 0, fetch_field передвигает её к следующей колонке. field_seek возвращает к описанию первой; строковый курсор остаётся отдельным.

Увидеть отдельную позицию метаданныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
echo $result->current_field, "\n";
$result->fetch_field();
echo $result->current_field, "\n";
$result->field_seek(0);
echo $result->fetch_field()->name, "\n";
Ожидаемый результат
0
1
id

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Восстанавливать можно только допустимый индекс 0..field_count−1, не позицию за последней колонкой. Для одноразового просмотра проще массив fetch_fields.

Сохранить и восстановить позицию обхода схемыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 1 AS id, 2 AS quantity');
$result->fetch_field();
$position = mysqli_field_tell($result);
mysqli_field_seek($result, 0);
echo mysqli_fetch_field($result)->name, "\n";
mysqli_field_seek($result, $position);
echo mysqli_fetch_field($result)->name, "\n";
Ожидаемый результат
id
quantity

Связанные операции: mysqli_field_tell, mysqli_data_seek.

Оба входа к этой операции: mysqli_field_seek, mysqli_result::field_seek.

mysqli_free_resultОсвободить память и ресурсы набора строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_free_result(mysqli_result $result): void; mysqli_result::free(): void

Освободить буфер, сохранив нужный товар. free/close/free_result освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.

Данные и действие: mysqli_free_result
  1. $result->free()
  2. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить буфер, сохранив нужный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не используйте закрытый объект результата для fetch. Освобождение не выполняет COMMIT и не удаляет товары.

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

Освободить память и ресурсы набора строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultЖивой результат, который больше не используется.

Нет возвращаемого значения. OO-имена free, close и free_result равнозначны. Обычное уничтожение объекта тоже освобождает результат, но явное завершение уменьшает время удержания большого буфера.

Путь данных. Приложение получило нужные данные → free освобождает набор → Следующая работа не держит старый буфер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После free объект нельзя читать снова. Если данные нужны позже, сохраните небольшое необходимое значение до освобождения.

Освободить буфер после обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42');
echo $result->fetch_column(), "\n";
$result->free();
echo 'Буфер освобождён', "\n";
Ожидаемый результат
42
Буфер освобождён

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для потока освобождение завершает работу с непрочитанным набором и снимает блокировку соединения для следующего запроса. Это не обещает, что огромный запрос мгновенно отменится.

Освободить поток перед следующим запросомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products', MYSQLI_USE_RESULT);
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_use_result, mysqli_close.

Оба входа к этой операции: mysqli_free_result, mysqli_result::free.

mysqli_result::freeОсвободить память и ресурсы набора строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_free_result(mysqli_result $result): void; mysqli_result::free(): void

Освободить буфер, сохранив нужный товар. free/close/free_result освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.

Данные и действие: mysqli_result::free
  1. $result->free()
  2. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить буфер, сохранив нужный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не используйте закрытый объект результата для fetch. Освобождение не выполняет COMMIT и не удаляет товары.

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

Освободить память и ресурсы набора строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$resultЖивой результат, который больше не используется.

Нет возвращаемого значения. OO-имена free, close и free_result равнозначны. Обычное уничтожение объекта тоже освобождает результат, но явное завершение уменьшает время удержания большого буфера.

Путь данных. Приложение получило нужные данные → free освобождает набор → Следующая работа не держит старый буфер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После free объект нельзя читать снова. Если данные нужны позже, сохраните небольшое необходимое значение до освобождения.

Освободить буфер после обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42');
echo $result->fetch_column(), "\n";
$result->free();
echo 'Буфер освобождён', "\n";
Ожидаемый результат
42
Буфер освобождён

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для потока освобождение завершает работу с непрочитанным набором и снимает блокировку соединения для следующего запроса. Это не обещает, что огромный запрос мгновенно отменится.

Освободить поток перед следующим запросомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products', MYSQLI_USE_RESULT);
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_use_result, mysqli_close.

Оба входа к этой операции: mysqli_free_result, mysqli_result::free.

mysqli_result::closeЗавершить работу с результатом: дополнительное имя free().

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_result::close(): void

Освободить буфер, сохранив нужный товар. free/close/free_result освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.

Данные и действие: mysqli_result::close
  1. $result->free()
  2. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить буфер, сохранив нужный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не используйте закрытый объект результата для fetch. Освобождение не выполняет COMMIT и не удаляет товары.

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

Завершить работу с результатом: дополнительное имя free().

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Alias mysqli_result::free: освобождает набор, ничего не возвращает; повторное использование закрытого объекта ошибочно. Название close здесь относится к результату, а не соединению.

Путь данных. Результат обработан → Alias вызывает освобождение → Набор недоступен.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После free объект нельзя читать снова. Если данные нужны позже, сохраните небольшое необходимое значение до освобождения.

Освободить буфер после обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42');
echo $result->fetch_column(), "\n";
$result->free();
echo 'Буфер освобождён', "\n";
Ожидаемый результат
42
Буфер освобождён

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для потока освобождение завершает работу с непрочитанным набором и снимает блокировку соединения для следующего запроса. Это не обещает, что огромный запрос мгновенно отменится.

Освободить поток перед следующим запросомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products', MYSQLI_USE_RESULT);
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_free_result, mysqli_result::free.

mysqli_result::free_resultЗавершить работу с результатом: дополнительное имя free().

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_result::free_result(): void

Освободить буфер, сохранив нужный товар. free/close/free_result освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.

Данные и действие: mysqli_result::free_result
  1. $result->free()
  2. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить буфер, сохранив нужный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не используйте закрытый объект результата для fetch. Освобождение не выполняет COMMIT и не удаляет товары.

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

Завершить работу с результатом: дополнительное имя free().

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Alias mysqli_result::free: освобождает набор, ничего не возвращает; повторное использование закрытого объекта ошибочно. Название close здесь относится к результату, а не соединению.

Путь данных. Результат обработан → Alias вызывает освобождение → Набор недоступен.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После free объект нельзя читать снова. Если данные нужны позже, сохраните небольшое необходимое значение до освобождения.

Освободить буфер после обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42');
echo $result->fetch_column(), "\n";
$result->free();
echo 'Буфер освобождён', "\n";
Ожидаемый результат
42
Буфер освобождён

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для потока освобождение завершает работу с непрочитанным набором и снимает блокировку соединения для следующего запроса. Это не обещает, что огромный запрос мгновенно отменится.

Освободить поток перед следующим запросомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products', MYSQLI_USE_RESULT);
mysqli_free_result($result);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_free_result, mysqli_result::free.

mysqli_result::getIteratorПолучить итератор для обхода строк стандартным foreach.

PHP 8.0+ · mysqli; mysqlnd для отмеченных операций

mysqli_result::getIterator(): Iterator

Передать каталог циклу foreach. Итератор даёт по одной строке. В повседневном коде можно писать foreach непосредственно по mysqli_result.

Данные и действие: mysqli_result::getIterator
  1. $result->getIterator()
  2. Каждый проход получает именной массив товара. Представление может выводить строки таблицы без промежуточного fetch_all.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
foreach ($rows as $row)Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Передать каталог циклу foreachПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
$iterator = $result->getIterator();
foreach ($iterator as $row) { echo $row['name'], ' — ', $row['stock'], " шт.\n"; }
$result->free();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Каждый проход получает именной массив товара. Представление может выводить строки таблицы без промежуточного fetch_all.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Повторный обход и перемотка зависят от буфера. Для use_result нельзя ожидать нового независимого прохода по уже прочитанным данным.

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

Получить итератор для обхода строк стандартным foreach.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Возвращает Iterator. Класс реализует IteratorAggregate с PHP 8.0 (раньше Traversable). Не запускает новый SQL и не превращает небуферизованный результат в массив. Схема повторных обходов требует буфера; над потоком используйте один проход.

Путь данных. foreach запрашивает итератор → Итератор читает очередную строку → Код обрабатывает массив.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. foreach получает строки как ассоциативные массивы. С PHP 8.0 класс implements IteratorAggregate; вызов getIterator обычно делает сам язык.

Пройти строки через foreachПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$result = $db->query('SELECT name FROM course_products ORDER BY id');
foreach ($result as $row) { echo $row['name'], "\n"; }
Ожидаемый результат
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная отдельная страница документирует лишь сигнатуру. Поведение обхода здесь согласовано с классом и реализацией PHP 8.5.11; для потокового результата нельзя рассчитывать на повторную перемотку.

Передать явный итератор коду обработкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query("SELECT 'Pen' AS name");
$iterator = $result->getIterator();
foreach ($iterator as $row) { echo $row['name'], "\n"; }
Ожидаемый результат
Pen

Связанные операции: mysqli_fetch_assoc, mysqli_data_seek.

mysqli_result::$typeРазличить буферизованный результат и поток.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_result::$type: int

Проверить, допускает ли ответ перемотку. Свойство показывает MYSQLI_STORE_RESULT или MYSQLI_USE_RESULT. Оно описывает способ получения набора, а не тип отдельной SQL-колонки.

Данные и действие: mysqli_result::$type
  1. $result->type
  2. query по умолчанию создал буфер, поэтому можно выбрать вторую строку. У потока вместо перемотки нужен последовательный алгоритм.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить, допускает ли ответ перемоткуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
if ($result->type !== MYSQLI_STORE_RESULT) { throw new RuntimeException('Для перемотки требуется буфер'); }
$result->data_seek(1);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. query по умолчанию создал буфер, поэтому можно выбрать вторую строку. У потока вместо перемотки нужен последовательный алгоритм.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Переключить уже полученный поток в буфер присваиванием свойства нельзя. Способ выбирают при получении результата.

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

Различить буферизованный результат и поток.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

MYSQLI_STORE_RESULT или MYSQLI_USE_RESULT описывает способ получения данного набора. Это не SQL-тип колонок. Назначение другого числа свойству не превращает уже созданный поток в буфер: режим выбирают при получении результата.

Путь данных. Создание выбирает STORE или USE → type отражает выбранный режим → Код учитывает доступность перемотки.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Обычный query получает буфер.

Проверить режим обычного queryПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42');
var_dump($result->type === MYSQLI_STORE_RESULT);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Поток освободили до следующей работы с соединением.

Проверить режим потокового queryПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$result = $db->query('SELECT 42', MYSQLI_USE_RESULT);
var_dump($result->type === MYSQLI_USE_RESULT);
$result->free();
Ожидаемый результат
bool(true)

Связанные операции: mysqli_store_result, mysqli_use_result.

mysqli_stmt::__constructСоздать команду, хранящую SQL-шаблон и привязанные параметры.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

new mysqli_stmt(mysqli $mysql, ?string $query = null)

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli_stmt::__construct
  1. $stmt = new mysqli_stmt($db); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = new mysqli_stmt($db);
$stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Создать команду, хранящую SQL-шаблон и привязанные параметры.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlОткрытое соединение.
$querySQL-шаблон либо null для пустой команды.

Объект mysqli_stmt; query=null означает только выделение, строка — также prepare. Значения передают позже. Ошибка подготовки не должна оставлять приложение в состоянии, будто объект готов к выполнению.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Соединение владеет командой → Конструктор выделяет/готовит → execute выполняет с данными.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new выделяет объект и здесь сразу подготавливает SQL. execute отдельно подаёт значение: конструктор не выполняет SELECT.

Создать готовый к параметрам statementПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db, 'SELECT ? AS quantity');
$statement->execute([12]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
12

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без query конструктор работает как stmt_init; с query — как prepare соединения. null допускается с PHP 8.0.

Отложить подготовку шаблонаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db);
$statement->prepare('SELECT 42');
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
42

Связанные операции: mysqli_stmt_init, mysqli_prepare.

mysqli_stmt_prepareПодготовить SQL на существующем объекте команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_prepare(mysqli_stmt $statement, string $query): bool; mysqli_stmt::prepare(string $query): bool

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli_stmt_prepare
  1. $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->stmt_init();
$stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Подготовить SQL на существующем объекте команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна команда с нулём или несколькими ? в местах значений.

true/false или исключение. Подготовка заменяет SQL-шаблон команды; reset не делает такую замену. ? нельзя ставить вместо имён таблиц/колонок и брать в кавычки. Длинный SQL ограничен max_allowed_packet: mysqlnd Linux может вернуть 1153, Windows и исторический libmysqlclient — 2006. После prepare нужны bind_param+execute либо execute(array) PHP 8.1+.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Пустой statement → prepare задаёт SQL → Параметры поставляют значения → execute запускает.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без query конструктор работает как stmt_init; с query — как prepare соединения. null допускается с PHP 8.0.

Отложить подготовку шаблонаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db);
$statement->prepare('SELECT 42');
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new выделяет объект и здесь сразу подготавливает SQL. execute отдельно подаёт значение: конструктор не выполняет SELECT.

Создать готовый к параметрам statementПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db, 'SELECT ? AS quantity');
$statement->execute([12]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
12

Связанные операции: mysqli_stmt_execute, mysqli_stmt_bind_param, mysqli_stmt_reset.

Оба входа к этой операции: mysqli_stmt_prepare, mysqli_stmt::prepare.

mysqli_stmt::prepareПодготовить SQL на существующем объекте команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_prepare(mysqli_stmt $statement, string $query): bool; mysqli_stmt::prepare(string $query): bool

Подготовить шаблон и отдельно передать номер. mysqli_stmt хранит SQL-шаблон и состояние выполнения. Создание пустого объекта ещё не подготавливает SQL; prepare выполняет этот шаг, execute — следующий.

Данные и действие: mysqli_stmt::prepare
  1. $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
  2. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подготовить шаблон и отдельно передать номерПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->stmt_init();
$stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для PHP 8.0 и старее массив execute недоступен: используйте bind_param. Не готовьте statement заново внутри каждого прохода, если можно повторить execute с новым значением.

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

Подготовить SQL на существующем объекте команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$queryОдна команда с нулём или несколькими ? в местах значений.

true/false или исключение. Подготовка заменяет SQL-шаблон команды; reset не делает такую замену. ? нельзя ставить вместо имён таблиц/колонок и брать в кавычки. Длинный SQL ограничен max_allowed_packet: mysqlnd Linux может вернуть 1153, Windows и исторический libmysqlclient — 2006. После prepare нужны bind_param+execute либо execute(array) PHP 8.1+.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Пустой statement → prepare задаёт SQL → Параметры поставляют значения → execute запускает.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без query конструктор работает как stmt_init; с query — как prepare соединения. null допускается с PHP 8.0.

Отложить подготовку шаблонаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db);
$statement->prepare('SELECT 42');
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
42

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. new выделяет объект и здесь сразу подготавливает SQL. execute отдельно подаёт значение: конструктор не выполняет SELECT.

Создать готовый к параметрам statementПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = new mysqli_stmt($db, 'SELECT ? AS quantity');
$statement->execute([12]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
12

Связанные операции: mysqli_stmt_execute, mysqli_stmt_bind_param, mysqli_stmt_reset.

Оба входа к этой операции: mysqli_stmt_prepare, mysqli_stmt::prepare.

mysqli_stmt_bind_paramСвязать параметры SQL с изменяемыми переменными PHP для повторных выполнений.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_bind_param(mysqli_stmt $statement, string $types, mixed &$var, mixed &...$vars): bool; mysqli_stmt::bind_param(string $types, mixed &$var, mixed &...$vars): bool

Найти товар подготовленной командой. Букваi означает целый параметр, $id связывается по ссылке. execute читает текущее 2, а не прежнее 1.

Данные и действие: mysqli_stmt_bind_param
  1. $id = 1; $stmt->bind_param('i', $id); $id = 2; $stmt->execute();
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$id = 1;
$stmt->bind_param('i', $id);
$id = 2;
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Связать параметры SQL с изменяемыми переменными PHP для повторных выполнений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$typesПо одной букве: i integer, d float, s string, b BLOB с передачей порциями.
&$var, &...$varsСуществующие переменные по ссылке; их число и длина types равны количеству ?.

true/false. Значения не надо дополнительно SQL-экранировать. Переменная с null передаёт SQL NULL. Если строите динамический список с call_user_func_array, нужны реальные ссылки; проще фиксированная сигнатура или execute(array). Ссылки важны и при переустановке массива переменных: замена контейнера может оставить привязку на старом элементе. Для b крупные значения передают send_long_data, учитывая серверные лимиты.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. ? имеет позицию → bind_param связывает её с $id → Код меняет $id → execute читает новое значение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_param сохраняет связь с переменной, не её одноразовую копию. execute читает текущее значение $id. Передать литерал 1 вместо переменной по ссылке нельзя.

Привязать переменную и изменить её перед повторомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$id = 1;
$statement->bind_param('i', $id);
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
$id = 3;
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Pen
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Буквы si соответствуют порядку ? и переменных: s для имени, i для ID. Десятичные деньги лучше хранить целыми копейками либо точной DECIMAL-строкой, не превращать бездумно во float.

Два разных типа параметров для обновленияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_prepare($db, 'UPDATE course_products SET name = ? WHERE id = ?');
$name = 'Blue pen'; $id = 1;
mysqli_stmt_bind_param($statement, 'si', $name, $id);
mysqli_stmt_execute($statement);
echo $db->query('SELECT name FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
Blue pen

Связанные операции: mysqli_stmt_execute, mysqli_stmt_send_long_data, mysqli_stmt_param_count.

Оба входа к этой операции: mysqli_stmt_bind_param, mysqli_stmt::bind_param.

mysqli_stmt::bind_paramСвязать параметры SQL с изменяемыми переменными PHP для повторных выполнений.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_bind_param(mysqli_stmt $statement, string $types, mixed &$var, mixed &...$vars): bool; mysqli_stmt::bind_param(string $types, mixed &$var, mixed &...$vars): bool

Найти товар подготовленной командой. Букваi означает целый параметр, $id связывается по ссылке. execute читает текущее 2, а не прежнее 1.

Данные и действие: mysqli_stmt::bind_param
  1. $id = 1; $stmt->bind_param('i', $id); $id = 2; $stmt->execute();
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$id = 1;
$stmt->bind_param('i', $id);
$id = 2;
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Связать параметры SQL с изменяемыми переменными PHP для повторных выполнений.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$typesПо одной букве: i integer, d float, s string, b BLOB с передачей порциями.
&$var, &...$varsСуществующие переменные по ссылке; их число и длина types равны количеству ?.

true/false. Значения не надо дополнительно SQL-экранировать. Переменная с null передаёт SQL NULL. Если строите динамический список с call_user_func_array, нужны реальные ссылки; проще фиксированная сигнатура или execute(array). Ссылки важны и при переустановке массива переменных: замена контейнера может оставить привязку на старом элементе. Для b крупные значения передают send_long_data, учитывая серверные лимиты.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. ? имеет позицию → bind_param связывает её с $id → Код меняет $id → execute читает новое значение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_param сохраняет связь с переменной, не её одноразовую копию. execute читает текущее значение $id. Передать литерал 1 вместо переменной по ссылке нельзя.

Привязать переменную и изменить её перед повторомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$id = 1;
$statement->bind_param('i', $id);
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
$id = 3;
$statement->execute();
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Pen
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Буквы si соответствуют порядку ? и переменных: s для имени, i для ID. Десятичные деньги лучше хранить целыми копейками либо точной DECIMAL-строкой, не превращать бездумно во float.

Два разных типа параметров для обновленияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = mysqli_prepare($db, 'UPDATE course_products SET name = ? WHERE id = ?');
$name = 'Blue pen'; $id = 1;
mysqli_stmt_bind_param($statement, 'si', $name, $id);
mysqli_stmt_execute($statement);
echo $db->query('SELECT name FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
Blue pen

Связанные операции: mysqli_stmt_execute, mysqli_stmt_send_long_data, mysqli_stmt_param_count.

Оба входа к этой операции: mysqli_stmt_bind_param, mysqli_stmt::bind_param.

mysqli_stmt_executeЗапустить уже подготовленную команду с текущими данными.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool; mysqli_stmt::execute(?array $params = null): bool

Найти товар подготовленной командой. С PHP 8.1 массив execute передаёт список входных значений. Шаблон содержит один?, поэтому нужен один элемент 2.

Данные и действие: mysqli_stmt_execute
  1. $stmt->execute([2]);
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Запустить уже подготовленную команду с текущими данными.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$paramsС PHP 8.1 null для ранее привязанных параметров либо список значений в порядке ?.

true/false или исключение. До выполнения обязательно prepare. Каждое значение params рассматривается как строковое (SQL NULL сохраняется); для явных типов используйте bind_param. Успешный bool не означает, что UPDATE что-то изменил: проверьте affected_rows. Перед повтором корректно обработайте предыдущий результат.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. prepare создал шаблон → execute подал значения → Сервер выполнил → Приложение читает строки/статус.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. params добавлен в PHP 8.1. Это список, а не словарь имён :id; число элементов должно совпадать с ?. Параметры этого варианта передаются как строки; null остаётся NULL.

Передать список значений при запускеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([2]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Notebook

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. execute возвращает bool, а не массив товаров. SELECT читают get_result/fetch; изменение — affected_rows, вставленный ключ — insert_id.

Выполнить UPDATE и прочитать его статусПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
mysqli_stmt_execute($statement, [180, 1]);
echo mysqli_stmt_affected_rows($statement), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_get_result, mysqli_stmt_affected_rows.

Оба входа к этой операции: mysqli_stmt_execute, mysqli_stmt::execute.

mysqli_stmt::executeЗапустить уже подготовленную команду с текущими данными.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool; mysqli_stmt::execute(?array $params = null): bool

Найти товар подготовленной командой. С PHP 8.1 массив execute передаёт список входных значений. Шаблон содержит один?, поэтому нужен один элемент 2.

Данные и действие: mysqli_stmt::execute
  1. $stmt->execute([2]);
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Запустить уже подготовленную команду с текущими данными.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$paramsС PHP 8.1 null для ранее привязанных параметров либо список значений в порядке ?.

true/false или исключение. До выполнения обязательно prepare. Каждое значение params рассматривается как строковое (SQL NULL сохраняется); для явных типов используйте bind_param. Успешный bool не означает, что UPDATE что-то изменил: проверьте affected_rows. Перед повтором корректно обработайте предыдущий результат.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. prepare создал шаблон → execute подал значения → Сервер выполнил → Приложение читает строки/статус.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. params добавлен в PHP 8.1. Это список, а не словарь имён :id; число элементов должно совпадать с ?. Параметры этого варианта передаются как строки; null остаётся NULL.

Передать список значений при запускеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([2]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Notebook

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. execute возвращает bool, а не массив товаров. SELECT читают get_result/fetch; изменение — affected_rows, вставленный ключ — insert_id.

Выполнить UPDATE и прочитать его статусПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
mysqli_stmt_execute($statement, [180, 1]);
echo mysqli_stmt_affected_rows($statement), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_get_result, mysqli_stmt_affected_rows.

Оба входа к этой операции: mysqli_stmt_execute, mysqli_stmt::execute.

mysqli_executeУзнать старое имя выполнения команды при сопровождении существующего проекта.

PHP 5+; deprecated 8.5 · mysqli; mysqlnd для отмеченных операций

mysqli_execute(mysqli_stmt $statement, ?array $params = null): bool

Найти товар подготовленной командой. С PHP 8.1 массив execute передаёт список входных значений. Шаблон содержит один?, поэтому нужен один элемент 2.

Данные и действие: mysqli_execute
  1. $stmt->execute([2]);
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Узнать старое имя выполнения команды при сопровождении существующего проекта.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statement$params — те же аргументы, что mysqli_stmt_execute.

Alias mysqli_stmt_execute; deprecated с PHP 8.5. Новый код использует полное имя. Ни параметры, ни смысл выполнения не меняются при замене.

Путь данных. Старый код вызывает alias → Замена на mysqli_stmt_execute сохраняет поведение → Обработчик читает результат.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. params добавлен в PHP 8.1. Это список, а не словарь имён :id; число элементов должно совпадать с ?. Параметры этого варианта передаются как строки; null остаётся NULL.

Передать список значений при запускеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([2]);
echo $statement->get_result()->fetch_column(), "\n";
Ожидаемый результат
Notebook

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. execute возвращает bool, а не массив товаров. SELECT читают get_result/fetch; изменение — affected_rows, вставленный ключ — insert_id.

Выполнить UPDATE и прочитать его статусПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
mysqli_stmt_execute($statement, [180, 1]);
echo mysqli_stmt_affected_rows($statement), "\n";
Ожидаемый результат
1

Связанные операции: mysqli_stmt_execute.

mysqli_stmt_bind_resultЗадать переменные, в которые будет читаться каждая колонка результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_bind_result(mysqli_stmt $statement, mixed &$var, mixed &...$vars): bool; mysqli_stmt::bind_result(mixed &$var, mixed &...$vars): bool

Читать колонки в заранее названные переменные. bind_result связывает выходные колонки по порядку SELECT, fetch переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.

Данные и действие: mysqli_stmt_bind_result
  1. $stmt->bind_result($name, $stock)
  2. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Читать колонки в заранее названные переменныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Количество связанных переменных должно совпадать с колонками. false ошибки чтения и null конца различают, если нужна отдельная обработка; при строгом режиме SQL-ошибки выбрасываются отдельно.

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

Задать переменные, в которые будет читаться каждая колонка результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
&$var, &...$varsПо одной переменной на каждую колонку, в порядке SELECT.

true/false. Вызывают после execute и до fetch. Можно перепривязать в середине чтения: новое назначение действует со следующего fetch. Это привязка выхода; bind_param связывает вход. Типы могут автоматически становиться соответствующими PHP-типами.

Путь данных. SELECT выдаёт name и price → bind_result назначает $name и $price → fetch записывает очередные значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_result не читает строку: он указывает, куда fetch запишет каждую колонку. Порядок совпадает с SELECT. Здесь не создаётся массив строки.

Получить два значения в заранее выбранные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->prepare("SELECT 'Pen' AS name, 120 AS price");
$statement->execute();
$statement->bind_result($name, $price);
$statement->fetch();
echo $name, ':', $price, "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Перед чтением свяжите все колонки. Тип переменной может меняться по типу SQL-данных. Для массива или foreach проще get_result при mysqlnd.

Каждый fetch обновляет те же переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products ORDER BY id');
$statement->execute();
mysqli_stmt_bind_result($statement, $name, $price);
while (mysqli_stmt_fetch($statement)) { echo $name, ':', $price, "\n"; }
Ожидаемый результат
Pen:120
Notebook:350
Box:200

Связанные операции: mysqli_stmt_fetch, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_bind_result, mysqli_stmt::bind_result.

mysqli_stmt::bind_resultЗадать переменные, в которые будет читаться каждая колонка результата.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_bind_result(mysqli_stmt $statement, mixed &$var, mixed &...$vars): bool; mysqli_stmt::bind_result(mixed &$var, mixed &...$vars): bool

Читать колонки в заранее названные переменные. bind_result связывает выходные колонки по порядку SELECT, fetch переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.

Данные и действие: mysqli_stmt::bind_result
  1. $stmt->bind_result($name, $stock)
  2. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Читать колонки в заранее названные переменныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Количество связанных переменных должно совпадать с колонками. false ошибки чтения и null конца различают, если нужна отдельная обработка; при строгом режиме SQL-ошибки выбрасываются отдельно.

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

Задать переменные, в которые будет читаться каждая колонка результата.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
&$var, &...$varsПо одной переменной на каждую колонку, в порядке SELECT.

true/false. Вызывают после execute и до fetch. Можно перепривязать в середине чтения: новое назначение действует со следующего fetch. Это привязка выхода; bind_param связывает вход. Типы могут автоматически становиться соответствующими PHP-типами.

Путь данных. SELECT выдаёт name и price → bind_result назначает $name и $price → fetch записывает очередные значения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_result не читает строку: он указывает, куда fetch запишет каждую колонку. Порядок совпадает с SELECT. Здесь не создаётся массив строки.

Получить два значения в заранее выбранные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->prepare("SELECT 'Pen' AS name, 120 AS price");
$statement->execute();
$statement->bind_result($name, $price);
$statement->fetch();
echo $name, ':', $price, "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Перед чтением свяжите все колонки. Тип переменной может меняться по типу SQL-данных. Для массива или foreach проще get_result при mysqlnd.

Каждый fetch обновляет те же переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products ORDER BY id');
$statement->execute();
mysqli_stmt_bind_result($statement, $name, $price);
while (mysqli_stmt_fetch($statement)) { echo $name, ':', $price, "\n"; }
Ожидаемый результат
Pen:120
Notebook:350
Box:200

Связанные операции: mysqli_stmt_fetch, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_bind_result, mysqli_stmt::bind_result.

mysqli_stmt_fetchПрочитать очередную строку в связанные переменные.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_fetch(mysqli_stmt $statement): ?bool; mysqli_stmt::fetch(): ?bool

Читать колонки в заранее названные переменные. bind_result связывает выходные колонки по порядку SELECT, fetch переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.

Данные и действие: mysqli_stmt_fetch
  1. $stmt->fetch()
  2. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Читать колонки в заранее названные переменныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Количество связанных переменных должно совпадать с колонками. false ошибки чтения и null конца различают, если нужна отдельная обработка; при строгом режиме SQL-ошибки выбрасываются отдельно.

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

Прочитать очередную строку в связанные переменные.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненная команда со всеми bind_result-колонками.

true — строка прочитана; false — ошибка; null — данных больше нет либо произошло усечение данных по контракту API. Не возвращает сам массив! Без store_result читает небуферизованно, что экономит клиентскую память, но держит поток и может увеличивать издержки взаимодействия. Для строгой диагностики отдельно различайте false/null и ошибки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. fetch получает следующую строку → Связанные переменные обновлены → true разрешает обработать строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_result не читает строку: он указывает, куда fetch запишет каждую колонку. Порядок совпадает с SELECT. Здесь не создаётся массив строки.

Получить два значения в заранее выбранные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->prepare("SELECT 'Pen' AS name, 120 AS price");
$statement->execute();
$statement->bind_result($name, $price);
$statement->fetch();
echo $name, ':', $price, "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Перед чтением свяжите все колонки. Тип переменной может меняться по типу SQL-данных. Для массива или foreach проще get_result при mysqlnd.

Каждый fetch обновляет те же переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products ORDER BY id');
$statement->execute();
mysqli_stmt_bind_result($statement, $name, $price);
while (mysqli_stmt_fetch($statement)) { echo $name, ':', $price, "\n"; }
Ожидаемый результат
Pen:120
Notebook:350
Box:200

Связанные операции: mysqli_stmt_bind_result, mysqli_stmt_store_result.

Оба входа к этой операции: mysqli_stmt_fetch, mysqli_stmt::fetch.

mysqli_stmt::fetchПрочитать очередную строку в связанные переменные.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_fetch(mysqli_stmt $statement): ?bool; mysqli_stmt::fetch(): ?bool

Читать колонки в заранее названные переменные. bind_result связывает выходные колонки по порядку SELECT, fetch переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.

Данные и действие: mysqli_stmt::fetch
  1. $stmt->fetch()
  2. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Читать колонки в заранее названные переменныеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Количество связанных переменных должно совпадать с колонками. false ошибки чтения и null конца различают, если нужна отдельная обработка; при строгом режиме SQL-ошибки выбрасываются отдельно.

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

Прочитать очередную строку в связанные переменные.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненная команда со всеми bind_result-колонками.

true — строка прочитана; false — ошибка; null — данных больше нет либо произошло усечение данных по контракту API. Не возвращает сам массив! Без store_result читает небуферизованно, что экономит клиентскую память, но держит поток и может увеличивать издержки взаимодействия. Для строгой диагностики отдельно различайте false/null и ошибки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. fetch получает следующую строку → Связанные переменные обновлены → true разрешает обработать строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. bind_result не читает строку: он указывает, куда fetch запишет каждую колонку. Порядок совпадает с SELECT. Здесь не создаётся массив строки.

Получить два значения в заранее выбранные переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$statement = $db->prepare("SELECT 'Pen' AS name, 120 AS price");
$statement->execute();
$statement->bind_result($name, $price);
$statement->fetch();
echo $name, ':', $price, "\n";
Ожидаемый результат
Pen:120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Перед чтением свяжите все колонки. Тип переменной может меняться по типу SQL-данных. Для массива или foreach проще get_result при mysqlnd.

Каждый fetch обновляет те же переменныеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products ORDER BY id');
$statement->execute();
mysqli_stmt_bind_result($statement, $name, $price);
while (mysqli_stmt_fetch($statement)) { echo $name, ':', $price, "\n"; }
Ожидаемый результат
Pen:120
Notebook:350
Box:200

Связанные операции: mysqli_stmt_bind_result, mysqli_stmt_store_result.

Оба входа к этой операции: mysqli_stmt_fetch, mysqli_stmt::fetch.

mysqli_stmt_get_resultПолучить буферизованный объект результата подготовленного запроса.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_get_result(mysqli_stmt $statement): mysqli_result|false; mysqli_stmt::get_result(): mysqli_result|false

Найти товар подготовленной командой. После исполнения get_result создаёт буферизованный mysqli_result. Он требует mysqlnd и является отдельным способом чтения от bind_result/fetch.

Данные и действие: mysqli_stmt_get_result
  1. $stmt->execute([2]);
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Получить буферизованный объект результата подготовленного запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненный SELECT/SHOW/DESCRIBE/EXPLAIN.

Только mysqlnd. mysqli_result или false: отсутствие набора и ошибка имеют один bool; различайте stmt_errno (до 7.4.13 из-за ошибки требовался mysqli_errno). Нельзя сочетать со stmt_store_result для того же набора: оба полностью получают результат. UPDATE/INSERT не дают объекта строк.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. execute создал набор → get_result получил весь буфер → fetch_assoc вернул массив.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. get_result забирает весь набор в mysqli_result, после чего применимы обычные fetch_assoc/fetch_all. Требуется mysqlnd; это не нейтральный к памяти поток.

Превратить подготовленный SELECT в удобный результатПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
$statement->execute([2]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ':', $row['price'], "\n";
Ожидаемый результат
Notebook:350

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой SELECT возвращает объект, UPDATE без набора — false при errno=0. Ошибку также может обозначать false: сверяйте ошибку, не делайте вывод только по bool.

Отличить пустой SELECT от UPDATEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([999]);
echo $statement->get_result()->num_rows, "\n";
$update = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
$update->execute([120, 1]);
var_dump($update->get_result());
echo $update->errno, "\n";
Ожидаемый результат
0
bool(false)
0

Связанные операции: mysqli_stmt_bind_result, mysqli_stmt_store_result, mysqli_stmt_errno.

Оба входа к этой операции: mysqli_stmt_get_result, mysqli_stmt::get_result.

mysqli_stmt::get_resultПолучить буферизованный объект результата подготовленного запроса.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_get_result(mysqli_stmt $statement): mysqli_result|false; mysqli_stmt::get_result(): mysqli_result|false

Найти товар подготовленной командой. После исполнения get_result создаёт буферизованный mysqli_result. Он требует mysqlnd и является отдельным способом чтения от bind_result/fetch.

Данные и действие: mysqli_stmt::get_result
  1. $stmt->execute([2]);
  2. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Найти товар подготовленной командойПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([2]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Для отсутствующего товара get_result вернёт пустой набор, а не false SQL-ошибки. Не смешивайте get_result с bind_result на одном активном ответе.

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

Получить буферизованный объект результата подготовленного запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненный SELECT/SHOW/DESCRIBE/EXPLAIN.

Только mysqlnd. mysqli_result или false: отсутствие набора и ошибка имеют один bool; различайте stmt_errno (до 7.4.13 из-за ошибки требовался mysqli_errno). Нельзя сочетать со stmt_store_result для того же набора: оба полностью получают результат. UPDATE/INSERT не дают объекта строк.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. execute создал набор → get_result получил весь буфер → fetch_assoc вернул массив.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. get_result забирает весь набор в mysqli_result, после чего применимы обычные fetch_assoc/fetch_all. Требуется mysqlnd; это не нейтральный к памяти поток.

Превратить подготовленный SELECT в удобный результатПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
$statement->execute([2]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ':', $row['price'], "\n";
Ожидаемый результат
Notebook:350

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой SELECT возвращает объект, UPDATE без набора — false при errno=0. Ошибку также может обозначать false: сверяйте ошибку, не делайте вывод только по bool.

Отличить пустой SELECT от UPDATEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id = ?');
$statement->execute([999]);
echo $statement->get_result()->num_rows, "\n";
$update = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
$update->execute([120, 1]);
var_dump($update->get_result());
echo $update->errno, "\n";
Ожидаемый результат
0
bool(false)
0

Связанные операции: mysqli_stmt_bind_result, mysqli_stmt_store_result, mysqli_stmt_errno.

Оба входа к этой операции: mysqli_stmt_get_result, mysqli_stmt::get_result.

mysqli_stmt_store_resultПолучить полный набор в буфер statement для счётчика и перемотки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_store_result(mysqli_stmt $statement): bool; mysqli_stmt::store_result(): bool

Буферизовать ответ statement для контролируемого чтения. Prepared SELECT без store_result не обещает полный клиентский буфер. После буферизации можно читать num_rows и переходить по позициям.

Данные и действие: mysqli_stmt_store_result
  1. $stmt->store_result()
  2. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Буферизовать ответ statement для контролируемого чтенияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Буфер расходует память. Если задача — экспорт последовательно, перемотка не нужна; читайте bind_result/fetch и своевременно завершайте ответ.

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

Получить полный набор в буфер statement для счётчика и перемотки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда после успешного execute с результатом.

true/false. Последующие bind_result+fetch читают буфер. Нужен только когда требуется полное получение; для команд без набора излишен, API не обязан считать это ошибкой. result_metadata/field_count помогают определить наличие колонок. Не смешивайте с get_result.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. execute создал поток → store_result забрал все строки → num_rows/data_seek доступны → free_result освобождает буфер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. store_result хранит строки внутри statement, а get_result отдаёт отдельный mysqli_result. Выберите одну дорожку, не вызывайте обе для одного результата.

Буферизовать перед подсчётом и перемоткойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products ORDER BY id');
$statement->execute();
$statement->store_result();
echo $statement->num_rows, "\n";
$statement->bind_result($name);
$statement->data_seek(2);
$statement->fetch();
echo $name, "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Каждый набор имеет собственный размер. free_result освобождает буфер, сохраняя подготовленную команду для нового запуска.

Освободить буфер и выполнить команду зановоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id >= ? ORDER BY id');
foreach ([2, 3] as $id) {
    $statement->execute([$id]);
    mysqli_stmt_store_result($statement);
    echo mysqli_stmt_num_rows($statement), "\n";
    mysqli_stmt_free_result($statement);
}
Ожидаемый результат
2
1

Связанные операции: mysqli_stmt_get_result, mysqli_stmt_data_seek, mysqli_stmt_free_result.

Оба входа к этой операции: mysqli_stmt_store_result, mysqli_stmt::store_result.

mysqli_stmt::store_resultПолучить полный набор в буфер statement для счётчика и перемотки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_store_result(mysqli_stmt $statement): bool; mysqli_stmt::store_result(): bool

Буферизовать ответ statement для контролируемого чтения. Prepared SELECT без store_result не обещает полный клиентский буфер. После буферизации можно читать num_rows и переходить по позициям.

Данные и действие: mysqli_stmt::store_result
  1. $stmt->store_result()
  2. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Буферизовать ответ statement для контролируемого чтенияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Буфер расходует память. Если задача — экспорт последовательно, перемотка не нужна; читайте bind_result/fetch и своевременно завершайте ответ.

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

Получить полный набор в буфер statement для счётчика и перемотки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда после успешного execute с результатом.

true/false. Последующие bind_result+fetch читают буфер. Нужен только когда требуется полное получение; для команд без набора излишен, API не обязан считать это ошибкой. result_metadata/field_count помогают определить наличие колонок. Не смешивайте с get_result.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. execute создал поток → store_result забрал все строки → num_rows/data_seek доступны → free_result освобождает буфер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. store_result хранит строки внутри statement, а get_result отдаёт отдельный mysqli_result. Выберите одну дорожку, не вызывайте обе для одного результата.

Буферизовать перед подсчётом и перемоткойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products ORDER BY id');
$statement->execute();
$statement->store_result();
echo $statement->num_rows, "\n";
$statement->bind_result($name);
$statement->data_seek(2);
$statement->fetch();
echo $name, "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Каждый набор имеет собственный размер. free_result освобождает буфер, сохраняя подготовленную команду для нового запуска.

Освободить буфер и выполнить команду зановоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id >= ? ORDER BY id');
foreach ([2, 3] as $id) {
    $statement->execute([$id]);
    mysqli_stmt_store_result($statement);
    echo mysqli_stmt_num_rows($statement), "\n";
    mysqli_stmt_free_result($statement);
}
Ожидаемый результат
2
1

Связанные операции: mysqli_stmt_get_result, mysqli_stmt_data_seek, mysqli_stmt_free_result.

Оба входа к этой операции: mysqli_stmt_store_result, mysqli_stmt::store_result.

mysqli_stmt_data_seekПереместить следующий fetch к строке внутреннего буфера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_data_seek(mysqli_stmt $statement, int $offset): void; mysqli_stmt::data_seek(int $offset): void

Буферизовать ответ statement для контролируемого чтения. Prepared SELECT без store_result не обещает полный клиентский буфер. После буферизации можно читать num_rows и переходить по позициям.

Данные и действие: mysqli_stmt_data_seek
  1. $stmt->data_seek(1)
  2. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Буферизовать ответ statement для контролируемого чтенияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
$stmt->data_seek(1);
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Буфер расходует память. Если задача — экспорт последовательно, перемотка не нужна; читайте bind_result/fetch и своевременно завершайте ответ.

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

Переместить следующий fetch к строке внутреннего буфера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$offsetИндекс 0..num_rows−1 после store_result.

Нет возвращаемого значения; не проверяйте его как bool успеха. Работает только с буфером statement после store_result. Для отдельного mysqli_result используйте его data_seek. Отрицательные/недопустимые значения не являются ID товара.

Путь данных. store_result накопил строки → data_seek(2) выбрал третью → fetch обновил переменную.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. store_result хранит строки внутри statement, а get_result отдаёт отдельный mysqli_result. Выберите одну дорожку, не вызывайте обе для одного результата.

Буферизовать перед подсчётом и перемоткойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products ORDER BY id');
$statement->execute();
$statement->store_result();
echo $statement->num_rows, "\n";
$statement->bind_result($name);
$statement->data_seek(2);
$statement->fetch();
echo $name, "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. SQL не выполняется повторно: меняется только позиция в буфере.

Прочитать первую строку дваждыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->store_result(); $s->bind_result($value);
$s->fetch(); echo $value, "\n";
mysqli_stmt_data_seek($s, 0);
$s->fetch(); echo $value, "\n";
Ожидаемый результат
42
42

Связанные операции: mysqli_stmt_store_result, mysqli_data_seek.

Оба входа к этой операции: mysqli_stmt_data_seek, mysqli_stmt::data_seek.

mysqli_stmt::data_seekПереместить следующий fetch к строке внутреннего буфера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_data_seek(mysqli_stmt $statement, int $offset): void; mysqli_stmt::data_seek(int $offset): void

Буферизовать ответ statement для контролируемого чтения. Prepared SELECT без store_result не обещает полный клиентский буфер. После буферизации можно читать num_rows и переходить по позициям.

Данные и действие: mysqli_stmt::data_seek
  1. $stmt->data_seek(1)
  2. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
  3. После выполнения: Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Буферизовать ответ statement для контролируемого чтенияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
$stmt->data_seek(1);
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->close();
Ожидаемый результат
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Перчатки15 шт.

Если требование изменится. Буфер расходует память. Если задача — экспорт последовательно, перемотка не нужна; читайте bind_result/fetch и своевременно завершайте ответ.

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

Переместить следующий fetch к строке внутреннего буфера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$offsetИндекс 0..num_rows−1 после store_result.

Нет возвращаемого значения; не проверяйте его как bool успеха. Работает только с буфером statement после store_result. Для отдельного mysqli_result используйте его data_seek. Отрицательные/недопустимые значения не являются ID товара.

Путь данных. store_result накопил строки → data_seek(2) выбрал третью → fetch обновил переменную.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. store_result хранит строки внутри statement, а get_result отдаёт отдельный mysqli_result. Выберите одну дорожку, не вызывайте обе для одного результата.

Буферизовать перед подсчётом и перемоткойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products ORDER BY id');
$statement->execute();
$statement->store_result();
echo $statement->num_rows, "\n";
$statement->bind_result($name);
$statement->data_seek(2);
$statement->fetch();
echo $name, "\n";
Ожидаемый результат
3
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. SQL не выполняется повторно: меняется только позиция в буфере.

Прочитать первую строку дваждыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->store_result(); $s->bind_result($value);
$s->fetch(); echo $value, "\n";
mysqli_stmt_data_seek($s, 0);
$s->fetch(); echo $value, "\n";
Ожидаемый результат
42
42

Связанные операции: mysqli_stmt_store_result, mysqli_data_seek.

Оба входа к этой операции: mysqli_stmt_data_seek, mysqli_stmt::data_seek.

mysqli_stmt_free_resultОсвободить внутренний результат, сохранив команду.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_free_result(mysqli_stmt $statement): void; mysqli_stmt::free_result(): void

Завершить прежний ответ перед повтором поиска. Освобождается буфер результата statement. Сам SQL-шаблон остаётся и может выполниться с другим номером.

Данные и действие: mysqli_stmt_free_result
  1. $stmt->free_result()
  2. Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Завершить прежний ответ перед повтором поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([1]);
$stmt->store_result();
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->execute([2]);
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.

Если требование изменится. Для окончательного освобождения SQL-команды нужен close. Не путайте free_result statement с free объекта mysqli_result от get_result.

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

Освободить внутренний результат, сохранив команду.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement с буфером store_result или открытым курсором.

Не возвращает значение. Освобождает буфер результата; также закрывает открытый курсор. Это не close: шаблон остаётся пригодным для новых execute. Отдельный mysqli_result от get_result освобождают его free.

Путь данных. Текущий буфер больше не нужен → free_result освобождает строки → Statement выполняется с другими параметрами.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Каждый набор имеет собственный размер. free_result освобождает буфер, сохраняя подготовленную команду для нового запуска.

Освободить буфер и выполнить команду зановоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id >= ? ORDER BY id');
foreach ([2, 3] as $id) {
    $statement->execute([$id]);
    mysqli_stmt_store_result($statement);
    echo mysqli_stmt_num_rows($statement), "\n";
    mysqli_stmt_free_result($statement);
}
Ожидаемый результат
2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Команда не закрывается вместе с буфером.

Освободить небольшой буфер явноПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->store_result();
echo $s->num_rows, "\n";
$s->free_result();
$s->execute(); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1
1

Связанные операции: mysqli_stmt_close, mysqli_free_result.

Оба входа к этой операции: mysqli_stmt_free_result, mysqli_stmt::free_result.

mysqli_stmt::free_resultОсвободить внутренний результат, сохранив команду.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_free_result(mysqli_stmt $statement): void; mysqli_stmt::free_result(): void

Завершить прежний ответ перед повтором поиска. Освобождается буфер результата statement. Сам SQL-шаблон остаётся и может выполниться с другим номером.

Данные и действие: mysqli_stmt::free_result
  1. $stmt->free_result()
  2. Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Завершить прежний ответ перед повтором поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([1]);
$stmt->store_result();
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->free_result();
$stmt->execute([2]);
$stmt->bind_result($name, $stock);
$stmt->fetch();
echo $name, ' — ', $stock, " шт.\n";
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.

Если требование изменится. Для окончательного освобождения SQL-команды нужен close. Не путайте free_result statement с free объекта mysqli_result от get_result.

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

Освободить внутренний результат, сохранив команду.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement с буфером store_result или открытым курсором.

Не возвращает значение. Освобождает буфер результата; также закрывает открытый курсор. Это не close: шаблон остаётся пригодным для новых execute. Отдельный mysqli_result от get_result освобождают его free.

Путь данных. Текущий буфер больше не нужен → free_result освобождает строки → Statement выполняется с другими параметрами.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Каждый набор имеет собственный размер. free_result освобождает буфер, сохраняя подготовленную команду для нового запуска.

Освободить буфер и выполнить команду зановоПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$statement = $db->prepare('SELECT name FROM course_products WHERE id >= ? ORDER BY id');
foreach ([2, 3] as $id) {
    $statement->execute([$id]);
    mysqli_stmt_store_result($statement);
    echo mysqli_stmt_num_rows($statement), "\n";
    mysqli_stmt_free_result($statement);
}
Ожидаемый результат
2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Команда не закрывается вместе с буфером.

Освободить небольшой буфер явноПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->store_result();
echo $s->num_rows, "\n";
$s->free_result();
$s->execute(); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1
1

Связанные операции: mysqli_stmt_close, mysqli_free_result.

Оба входа к этой операции: mysqli_stmt_free_result, mysqli_stmt::free_result.

mysqli_stmt_closeОсвободить подготовленную команду и её ожидающие результаты.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_close(mysqli_stmt $statement): true; mysqli_stmt::close(): true

Освободить подготовленную команду после задачи. close освобождает statement и его серверные ресурсы. Сохранённые PHP-значения остаются пригодны для вывода.

Данные и действие: mysqli_stmt_close
  1. $stmt->close()
  2. Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить подготовленную команду после задачиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$result->free();
$stmt->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не закрывайте statement перед нужным чтением. PHP завершает короткие запросы сам, но явное управление важно в длительных workers и больших пакетах.

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

Освободить подготовленную команду и её ожидающие результаты.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementЖивой statement.

С PHP 8.0 нормальный вызов всегда true; раньше мог возвращать false. Повторное использование закрытого объекта — Error. Особенно полезно явно завершать множество одноразовых statements в долгом worker.

Путь данных. Команда больше не нужна → close освобождает handle и результат → Соединение остаётся открытым.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После close объект нельзя выполнять повторно; для нового SQL создайте новую команду либо меняйте prepare до закрытия.

Закончить работу с командойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo $s->get_result()->fetch_column(), "\n";
var_dump($s->close());
Ожидаемый результат
42
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. close отменяет/освобождает ожидающие результаты этой команды, чтобы соединение могло работать дальше. Он не закрывает само соединение.

Закрыть непрочитанный statement перед новым SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products');
$s->execute();
mysqli_stmt_close($s);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_stmt_free_result, mysqli_close.

Оба входа к этой операции: mysqli_stmt_close, mysqli_stmt::close.

mysqli_stmt::closeОсвободить подготовленную команду и её ожидающие результаты.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_close(mysqli_stmt $statement): true; mysqli_stmt::close(): true

Освободить подготовленную команду после задачи. close освобождает statement и его серверные ресурсы. Сохранённые PHP-значения остаются пригодны для вывода.

Данные и действие: mysqli_stmt::close
  1. $stmt->close()
  2. Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Освободить подготовленную команду после задачиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$result->free();
$stmt->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Не закрывайте statement перед нужным чтением. PHP завершает короткие запросы сам, но явное управление важно в длительных workers и больших пакетах.

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

Освободить подготовленную команду и её ожидающие результаты.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementЖивой statement.

С PHP 8.0 нормальный вызов всегда true; раньше мог возвращать false. Повторное использование закрытого объекта — Error. Особенно полезно явно завершать множество одноразовых statements в долгом worker.

Путь данных. Команда больше не нужна → close освобождает handle и результат → Соединение остаётся открытым.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После close объект нельзя выполнять повторно; для нового SQL создайте новую команду либо меняйте prepare до закрытия.

Закончить работу с командойПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo $s->get_result()->fetch_column(), "\n";
var_dump($s->close());
Ожидаемый результат
42
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. close отменяет/освобождает ожидающие результаты этой команды, чтобы соединение могло работать дальше. Он не закрывает само соединение.

Закрыть непрочитанный statement перед новым SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products');
$s->execute();
mysqli_stmt_close($s);
echo $db->query('SELECT 7')->fetch_column(), "\n";
Ожидаемый результат
7

Связанные операции: mysqli_stmt_free_result, mysqli_close.

Оба входа к этой операции: mysqli_stmt_close, mysqli_stmt::close.

mysqli_stmt_result_metadataПолучить схему подготовленного результата без чтения самих строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_result_metadata(mysqli_stmt $statement): mysqli_result|false; mysqli_stmt::result_metadata(): mysqli_result|false

Узнать заголовки ещё до чтения товаров. Метод возвращает описание колонок подготовленного SELECT. Полученный mysqli_result содержит metadata, а не сами строки.

Данные и действие: mysqli_stmt_result_metadata
  1. $stmt->result_metadata()
  2. Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.
  3. После выполнения: name;stock · Молоток;8

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Узнать заголовки ещё до чтения товаровПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$meta = $stmt->result_metadata();
if ($meta === false) { throw new RuntimeException('Ожидались колонки SELECT'); }
$fields = $meta->fetch_fields();
echo $fields[0]->name, ';', $fields[1]->name, "\n";
$meta->free();
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_row();
echo $row[0], ';', $row[1], "\n";
Ожидаемый результат
name;stock
Молоток;8

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.

Если требование изменится. Не вызывайте fetch_assoc у metadata в ожидании товаров. При DML отсутствие metadata нормально; проверьте назначение команды.

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

Получить схему подготовленного результата без чтения самих строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementУспешно подготовленная команда.

mysqli_result только с метаданными или false при отсутствии набора/ошибке. Используйте num_fields, fetch_field/direct/fields, field_seek/tell и free; не fetch_assoc ради данных. Встречающееся в списках документации mysqli_field_count принимает соединение, а свойство field_count результата читают у самого объекта. При get_result отдельный вызов metadata не требуется.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. prepare знает будущие колонки → result_metadata возвращает описание → Экспорт строит заголовки без чтения товаров.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Метаданные доступны после prepare. Этот объект не содержит строки с товарами, а только описание результата.

Узнать колонки до чтения данныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id = ?');
$metadata = $s->result_metadata();
foreach ($metadata->fetch_fields() as $field) { echo $field->name, "\n"; }
$metadata->free();
Ожидаемый результат
id
name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. UPDATE не создаёт набор строк, поэтому false не означает ошибку SQL. Проверяйте диагностическое состояние, если отказ был возможен.

Проверить, создаёт ли команда набор колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
var_dump(mysqli_stmt_result_metadata($s));
Ожидаемый результат
bool(false)

Связанные операции: mysqli_fetch_fields, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_result_metadata, mysqli_stmt::result_metadata.

mysqli_stmt::result_metadataПолучить схему подготовленного результата без чтения самих строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_result_metadata(mysqli_stmt $statement): mysqli_result|false; mysqli_stmt::result_metadata(): mysqli_result|false

Узнать заголовки ещё до чтения товаров. Метод возвращает описание колонок подготовленного SELECT. Полученный mysqli_result содержит metadata, а не сами строки.

Данные и действие: mysqli_stmt::result_metadata
  1. $stmt->result_metadata()
  2. Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.
  3. После выполнения: name;stock · Молоток;8

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Узнать заголовки ещё до чтения товаровПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$meta = $stmt->result_metadata();
if ($meta === false) { throw new RuntimeException('Ожидались колонки SELECT'); }
$fields = $meta->fetch_fields();
echo $fields[0]->name, ';', $fields[1]->name, "\n";
$meta->free();
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_row();
echo $row[0], ';', $row[1], "\n";
Ожидаемый результат
name;stock
Молоток;8

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.

Если требование изменится. Не вызывайте fetch_assoc у metadata в ожидании товаров. При DML отсутствие metadata нормально; проверьте назначение команды.

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

Получить схему подготовленного результата без чтения самих строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementУспешно подготовленная команда.

mysqli_result только с метаданными или false при отсутствии набора/ошибке. Используйте num_fields, fetch_field/direct/fields, field_seek/tell и free; не fetch_assoc ради данных. Встречающееся в списках документации mysqli_field_count принимает соединение, а свойство field_count результата читают у самого объекта. При get_result отдельный вызов metadata не требуется.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. prepare знает будущие колонки → result_metadata возвращает описание → Экспорт строит заголовки без чтения товаров.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Метаданные доступны после prepare. Этот объект не содержит строки с товарами, а только описание результата.

Узнать колонки до чтения данныхПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id = ?');
$metadata = $s->result_metadata();
foreach ($metadata->fetch_fields() as $field) { echo $field->name, "\n"; }
$metadata->free();
Ожидаемый результат
id
name

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. UPDATE не создаёт набор строк, поэтому false не означает ошибку SQL. Проверяйте диагностическое состояние, если отказ был возможен.

Проверить, создаёт ли команда набор колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
var_dump(mysqli_stmt_result_metadata($s));
Ожидаемый результат
bool(false)

Связанные операции: mysqli_fetch_fields, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_result_metadata, mysqli_stmt::result_metadata.

mysqli_stmt_send_long_dataОтправлять TEXT/BLOB частями, не собирая весь файл одной PHP-строкой.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_send_long_data(mysqli_stmt $statement, int $param_num, string $data): bool; mysqli_stmt::send_long_data(int $param_num, string $data): bool

Передать вложение по частям и прочитать его. Индекс 0 указывает первый входной параметр. Типb в bind_param обозначает бинарные данные; чанки накапливаются для следующего execute.

Данные и действие: mysqli_stmt_send_long_data
  1. $stmt->send_long_data(0, $chunk)
  2. Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.
  3. После выполнения: Квитанция заказа #1

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Передать вложение по частям и прочитать егоПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE TEMPORARY TABLE receipts (id INT PRIMARY KEY AUTO_INCREMENT, body BLOB NOT NULL)');
$stmt = $db->prepare('INSERT INTO receipts (body) VALUES (?)');
$placeholder = null;
$stmt->bind_param('b', $placeholder);
$stmt->send_long_data(0, 'Квитанция ');
$stmt->send_long_data(0, "заказа #1\n");
$stmt->execute();
$stmt->close();
echo $db->query('SELECT body FROM receipts WHERE id = 1')->fetch_column();
Ожидаемый результат
Квитанция заказа #1

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.

Если требование изменится. Для файла читайте ограниченные чанки и проверяйте ошибки I/O. Серверные ограничения пакета и размера поля сохраняются; передачу нельзя считать безграничной. Проверяйте права на выдачу вложения.

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

Отправлять TEXT/BLOB частями, не собирая весь файл одной PHP-строкой.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$param_numНомер b-параметра с нуля.
$dataОчередная строка байтов; можно вызывать несколько раз до execute.

true/false. Привяжите b через bind_param. Порции относятся к одному значению TEXT/BLOB; двоичные нули допустимы. reset сбрасывает уже отправленные части. Не считайте механизм способом обойти серверные ограничения общего размера: полный параметр также должен приниматься сервером.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Поток читается кусками → send_long_data добавляет к параметру 0 → execute записывает цельное значение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Параметр 0 означает первый ?. Части добавляются к одному значению, а не создают две строки. Метод вызывают до execute.

Передать BLOB из двух частейПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (id INT PRIMARY KEY, body BLOB)');
$s = $db->prepare('INSERT INTO course_blobs VALUES (1, ?)');
$blob = null;
$s->bind_param('b', $blob);
$s->send_long_data(0, 'ABC');
$s->send_long_data(0, 'DEF');
$s->execute();
echo $db->query('SELECT body FROM course_blobs WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
ABCDEF

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Небольшой поток иллюстрирует реальный файл. Порционная отправка снижает размер клиентского куска, но не отменяет лимиты полного BLOB, памяти сервера и max_allowed_packet: согласуйте их до выгрузки больших файлов.

Передать данные потока ограниченными кускамиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (id INT PRIMARY KEY, body BLOB)');
$stream = fopen('php://temp', 'w+b');
fwrite($stream, 'invoice-data'); rewind($stream);
$s = $db->prepare('INSERT INTO course_blobs VALUES (1, ?)');
$blob = null; $s->bind_param('b', $blob);
while (!feof($stream)) {
    $chunk = fread($stream, 4);
    if ($chunk === false) { throw new RuntimeException('Ошибка чтения'); }
    if ($chunk !== '') { mysqli_stmt_send_long_data($s, 0, $chunk); }
}
fclose($stream); $s->execute();
echo $db->query('SELECT body FROM course_blobs WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
invoice-data

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_reset.

Оба входа к этой операции: mysqli_stmt_send_long_data, mysqli_stmt::send_long_data.

mysqli_stmt::send_long_dataОтправлять TEXT/BLOB частями, не собирая весь файл одной PHP-строкой.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_send_long_data(mysqli_stmt $statement, int $param_num, string $data): bool; mysqli_stmt::send_long_data(int $param_num, string $data): bool

Передать вложение по частям и прочитать его. Индекс 0 указывает первый входной параметр. Типb в bind_param обозначает бинарные данные; чанки накапливаются для следующего execute.

Данные и действие: mysqli_stmt::send_long_data
  1. $stmt->send_long_data(0, $chunk)
  2. Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.
  3. После выполнения: Квитанция заказа #1

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
Передать вложение по частям и прочитать егоПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE TEMPORARY TABLE receipts (id INT PRIMARY KEY AUTO_INCREMENT, body BLOB NOT NULL)');
$stmt = $db->prepare('INSERT INTO receipts (body) VALUES (?)');
$placeholder = null;
$stmt->bind_param('b', $placeholder);
$stmt->send_long_data(0, 'Квитанция ');
$stmt->send_long_data(0, "заказа #1\n");
$stmt->execute();
$stmt->close();
echo $db->query('SELECT body FROM receipts WHERE id = 1')->fetch_column();
Ожидаемый результат
Квитанция заказа #1

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.

Если требование изменится. Для файла читайте ограниченные чанки и проверяйте ошибки I/O. Серверные ограничения пакета и размера поля сохраняются; передачу нельзя считать безграничной. Проверяйте права на выдачу вложения.

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

Отправлять TEXT/BLOB частями, не собирая весь файл одной PHP-строкой.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$param_numНомер b-параметра с нуля.
$dataОчередная строка байтов; можно вызывать несколько раз до execute.

true/false. Привяжите b через bind_param. Порции относятся к одному значению TEXT/BLOB; двоичные нули допустимы. reset сбрасывает уже отправленные части. Не считайте механизм способом обойти серверные ограничения общего размера: полный параметр также должен приниматься сервером.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Поток читается кусками → send_long_data добавляет к параметру 0 → execute записывает цельное значение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Параметр 0 означает первый ?. Части добавляются к одному значению, а не создают две строки. Метод вызывают до execute.

Передать BLOB из двух частейПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (id INT PRIMARY KEY, body BLOB)');
$s = $db->prepare('INSERT INTO course_blobs VALUES (1, ?)');
$blob = null;
$s->bind_param('b', $blob);
$s->send_long_data(0, 'ABC');
$s->send_long_data(0, 'DEF');
$s->execute();
echo $db->query('SELECT body FROM course_blobs WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
ABCDEF

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Небольшой поток иллюстрирует реальный файл. Порционная отправка снижает размер клиентского куска, но не отменяет лимиты полного BLOB, памяти сервера и max_allowed_packet: согласуйте их до выгрузки больших файлов.

Передать данные потока ограниченными кускамиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (id INT PRIMARY KEY, body BLOB)');
$stream = fopen('php://temp', 'w+b');
fwrite($stream, 'invoice-data'); rewind($stream);
$s = $db->prepare('INSERT INTO course_blobs VALUES (1, ?)');
$blob = null; $s->bind_param('b', $blob);
while (!feof($stream)) {
    $chunk = fread($stream, 4);
    if ($chunk === false) { throw new RuntimeException('Ошибка чтения'); }
    if ($chunk !== '') { mysqli_stmt_send_long_data($s, 0, $chunk); }
}
fclose($stream); $s->execute();
echo $db->query('SELECT body FROM course_blobs WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
invoice-data

Связанные операции: mysqli_stmt_bind_param, mysqli_stmt_reset.

Оба входа к этой операции: mysqli_stmt_send_long_data, mysqli_stmt::send_long_data.

mysqli_stmt_resetВернуть состояние команды к подготовленному перед новым выполнением.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_reset(mysqli_stmt $statement): bool; mysqli_stmt::reset(): bool

Сбросить выполнение и повторить шаблон с другим номером. reset сбрасывает состояние выполнения/ошибки и переданные long-data, сохраняя подготовленный SQL. Это не rollback изменений базы.

Данные и действие: mysqli_stmt_reset
  1. $stmt->reset()
  2. Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сбросить выполнение и повторить шаблон с другим номеромПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$id = 1;
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->reset();
$id = 2;
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.

Если требование изменится. После сброса большой бинарный параметр нужно передать заново. Не пытайтесь отменить успешный INSERT с помощью reset.

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

Вернуть состояние команды к подготовленному перед новым выполнением.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда, которую сохраняют для повторного использования.

true/false. Сбрасывает серверное состояние, long data, небуферизованный результат, ошибки и открытый курсор; не очищает привязки и уже сохранённые буферизованные результаты. Буфер очищается новым execute/close или free_result. Не меняет SQL и не откатывает бизнес-транзакцию.

Путь данных. Команда получила временное состояние → reset очищает его → Привязки и шаблон остаются → Новый execute использует новые данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. reset не стирает привязку переменной. Для замены SQL нужен prepare, для освобождения внутреннего буфера — free_result.

Сбросить состояние, сохранив привязкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ?');
$value = 12; $s->bind_param('i', $value);
$s->execute(); echo $s->get_result()->fetch_column(), "\n";
$s->reset(); $value = 25;
$s->execute(); echo $s->get_result()->fetch_column(), "\n";
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Байты old ещё не стали строкой таблицы: reset сбрасывает отправленное long data до execute. Это не rollback уже выполненного INSERT.

Отказаться от ещё не выполненной порции BLOBПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (body BLOB)');
$s = $db->prepare('INSERT INTO course_blobs VALUES (?)');
$blob = null; $s->bind_param('b', $blob);
$s->send_long_data(0, 'old');
mysqli_stmt_reset($s);
$s->send_long_data(0, 'new'); $s->execute();
echo $db->query('SELECT body FROM course_blobs')->fetch_column(), "\n";
Ожидаемый результат
new

Связанные операции: mysqli_stmt_prepare, mysqli_stmt_free_result, mysqli_rollback.

Оба входа к этой операции: mysqli_stmt_reset, mysqli_stmt::reset.

mysqli_stmt::resetВернуть состояние команды к подготовленному перед новым выполнением.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_reset(mysqli_stmt $statement): bool; mysqli_stmt::reset(): bool

Сбросить выполнение и повторить шаблон с другим номером. reset сбрасывает состояние выполнения/ошибки и переданные long-data, сохраняя подготовленный SQL. Это не rollback изменений базы.

Данные и действие: mysqli_stmt::reset
  1. $stmt->reset()
  2. Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сбросить выполнение и повторить шаблон с другим номеромПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$id = 1;
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->reset();
$id = 2;
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
$result->free();
$stmt->close();
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.

Если требование изменится. После сброса большой бинарный параметр нужно передать заново. Не пытайтесь отменить успешный INSERT с помощью reset.

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

Вернуть состояние команды к подготовленному перед новым выполнением.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда, которую сохраняют для повторного использования.

true/false. Сбрасывает серверное состояние, long data, небуферизованный результат, ошибки и открытый курсор; не очищает привязки и уже сохранённые буферизованные результаты. Буфер очищается новым execute/close или free_result. Не меняет SQL и не откатывает бизнес-транзакцию.

Путь данных. Команда получила временное состояние → reset очищает его → Привязки и шаблон остаются → Новый execute использует новые данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. reset не стирает привязку переменной. Для замены SQL нужен prepare, для освобождения внутреннего буфера — free_result.

Сбросить состояние, сохранив привязкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT ?');
$value = 12; $s->bind_param('i', $value);
$s->execute(); echo $s->get_result()->fetch_column(), "\n";
$s->reset(); $value = 25;
$s->execute(); echo $s->get_result()->fetch_column(), "\n";
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Байты old ещё не стали строкой таблицы: reset сбрасывает отправленное long data до execute. Это не rollback уже выполненного INSERT.

Отказаться от ещё не выполненной порции BLOBПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_blobs (body BLOB)');
$s = $db->prepare('INSERT INTO course_blobs VALUES (?)');
$blob = null; $s->bind_param('b', $blob);
$s->send_long_data(0, 'old');
mysqli_stmt_reset($s);
$s->send_long_data(0, 'new'); $s->execute();
echo $db->query('SELECT body FROM course_blobs')->fetch_column(), "\n";
Ожидаемый результат
new

Связанные операции: mysqli_stmt_prepare, mysqli_stmt_free_result, mysqli_rollback.

Оба входа к этой операции: mysqli_stmt_reset, mysqli_stmt::reset.

mysqli_stmt_attr_getПрочитать настройку подготовленной команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_attr_get(mysqli_stmt $statement, int $attribute): int; mysqli_stmt::attr_get(int $attribute): int

Явно выбрать последовательный режим курсора. Атрибут statement управляет способом получения результата. Здесь выбирается обычный режим без серверного read-only курсора.

Данные и действие: mysqli_stmt_attr_get
  1. $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE)
  2. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Явно выбрать последовательный режим курсораПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR);
$mode = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
if ($mode !== MYSQLI_CURSOR_TYPE_NO_CURSOR) { throw new RuntimeException('Режим не применён'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Поддержка атрибутов зависит от клиента/сервера. Атрибут курсора не превращает SQL в безопасный read-only запрос и не заменяет ограничения прав.

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

Прочитать настройку подготовленной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$attributeПоддерживаемая константа MYSQLI_STMT_ATTR_*.

Возвращает целочисленное значение; неизвестный/неподдерживаемый атрибут отклоняется. MYSQLI_STMT_ATTR_CURSOR_TYPE принимает NO_CURSOR (по умолчанию) или READ_ONLY. Исторический UPDATE_MAX_LENGTH просил обновлять max_length, но в современной mysqlnd после PHP 8.1 поле всегда 0; не стройте на нём ширину интерфейса. PREFETCH_ROWS задавал число получаемых за раз строк (1..unsigned long, default 1), удалён с PHP 8.4. Не все константы курсоров означают поддержку прокрутки: FOR_UPDATE/SCROLLABLE не являются рабочим универсальным режимом MySQLi.

Путь данных. Константа выбирает настройку → attr_get читает сохранённое значение → Код сравнивает с именованной константой.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Атрибут влияет на способ получения результатов, а не на WHERE или число строк запроса.

Узнать режим курсора командыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_NO_CURSOR);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Курсор открывается при execute; store_result для него не нужен. Повторный execute/reset закрывает прежний курсор, free_result тоже его завершает. Не считайте серверный курсор автоматически быстрее обычного потока.

Запросить курсор только для чтенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products ORDER BY id');
$s->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_READ_ONLY);
$s->execute(); $s->bind_result($name);
while ($s->fetch()) { echo $name, "\n"; }
$s->free_result();
Ожидаемый результат
bool(true)
Pen
Notebook
Box

Связанные операции: mysqli_stmt_attr_set.

Оба входа к этой операции: mysqli_stmt_attr_get, mysqli_stmt::attr_get.

mysqli_stmt::attr_getПрочитать настройку подготовленной команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_attr_get(mysqli_stmt $statement, int $attribute): int; mysqli_stmt::attr_get(int $attribute): int

Явно выбрать последовательный режим курсора. Атрибут statement управляет способом получения результата. Здесь выбирается обычный режим без серверного read-only курсора.

Данные и действие: mysqli_stmt::attr_get
  1. $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE)
  2. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Явно выбрать последовательный режим курсораПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR);
$mode = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
if ($mode !== MYSQLI_CURSOR_TYPE_NO_CURSOR) { throw new RuntimeException('Режим не применён'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Поддержка атрибутов зависит от клиента/сервера. Атрибут курсора не превращает SQL в безопасный read-only запрос и не заменяет ограничения прав.

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

Прочитать настройку подготовленной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$attributeПоддерживаемая константа MYSQLI_STMT_ATTR_*.

Возвращает целочисленное значение; неизвестный/неподдерживаемый атрибут отклоняется. MYSQLI_STMT_ATTR_CURSOR_TYPE принимает NO_CURSOR (по умолчанию) или READ_ONLY. Исторический UPDATE_MAX_LENGTH просил обновлять max_length, но в современной mysqlnd после PHP 8.1 поле всегда 0; не стройте на нём ширину интерфейса. PREFETCH_ROWS задавал число получаемых за раз строк (1..unsigned long, default 1), удалён с PHP 8.4. Не все константы курсоров означают поддержку прокрутки: FOR_UPDATE/SCROLLABLE не являются рабочим универсальным режимом MySQLi.

Путь данных. Константа выбирает настройку → attr_get читает сохранённое значение → Код сравнивает с именованной константой.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Атрибут влияет на способ получения результатов, а не на WHERE или число строк запроса.

Узнать режим курсора командыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_NO_CURSOR);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Курсор открывается при execute; store_result для него не нужен. Повторный execute/reset закрывает прежний курсор, free_result тоже его завершает. Не считайте серверный курсор автоматически быстрее обычного потока.

Запросить курсор только для чтенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products ORDER BY id');
$s->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_READ_ONLY);
$s->execute(); $s->bind_result($name);
while ($s->fetch()) { echo $name, "\n"; }
$s->free_result();
Ожидаемый результат
bool(true)
Pen
Notebook
Box

Связанные операции: mysqli_stmt_attr_set.

Оба входа к этой операции: mysqli_stmt_attr_get, mysqli_stmt::attr_get.

mysqli_stmt_attr_setНастроить способ работы подготовленной команды до execute.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_attr_set(mysqli_stmt $statement, int $attribute, int $value): bool; mysqli_stmt::attr_set(int $attribute, int $value): bool

Явно выбрать последовательный режим курсора. Атрибут statement управляет способом получения результата. Здесь выбирается обычный режим без серверного read-only курсора.

Данные и действие: mysqli_stmt_attr_set
  1. $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)
  2. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Явно выбрать последовательный режим курсораПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR);
$mode = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
if ($mode !== MYSQLI_CURSOR_TYPE_NO_CURSOR) { throw new RuntimeException('Режим не применён'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Поддержка атрибутов зависит от клиента/сервера. Атрибут курсора не превращает SQL в безопасный read-only запрос и не заменяет ограничения прав.

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

Настроить способ работы подготовленной команды до execute.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$attributeИдентификатор атрибута.
$valueДопустимое для выбранного атрибута значение.

true/false; вызовы можно повторять для разных настроек. MYSQLI_STMT_ATTR_CURSOR_TYPE принимает NO_CURSOR (по умолчанию) или READ_ONLY. Исторический UPDATE_MAX_LENGTH просил обновлять max_length, но в современной mysqlnd после PHP 8.1 поле всегда 0; не стройте на нём ширину интерфейса. PREFETCH_ROWS задавал число получаемых за раз строк (1..unsigned long, default 1), удалён с PHP 8.4. Не все константы курсоров означают поддержку прокрутки: FOR_UPDATE/SCROLLABLE не являются рабочим универсальным режимом MySQLi.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Настройка задаётся до execute → execute открывает нужный курсор → fetch читает → free_result завершает курсор.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Курсор открывается при execute; store_result для него не нужен. Повторный execute/reset закрывает прежний курсор, free_result тоже его завершает. Не считайте серверный курсор автоматически быстрее обычного потока.

Запросить курсор только для чтенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products ORDER BY id');
$s->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_READ_ONLY);
$s->execute(); $s->bind_result($name);
while ($s->fetch()) { echo $name, "\n"; }
$s->free_result();
Ожидаемый результат
bool(true)
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Атрибут влияет на способ получения результатов, а не на WHERE или число строк запроса.

Узнать режим курсора командыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_NO_CURSOR);
Ожидаемый результат
bool(true)

Связанные операции: mysqli_stmt_attr_get, mysqli_stmt_free_result.

Оба входа к этой операции: mysqli_stmt_attr_set, mysqli_stmt::attr_set.

mysqli_stmt::attr_setНастроить способ работы подготовленной команды до execute.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_attr_set(mysqli_stmt $statement, int $attribute, int $value): bool; mysqli_stmt::attr_set(int $attribute, int $value): bool

Явно выбрать последовательный режим курсора. Атрибут statement управляет способом получения результата. Здесь выбирается обычный режим без серверного read-only курсора.

Данные и действие: mysqli_stmt::attr_set
  1. $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)
  2. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Явно выбрать последовательный режим курсораПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR);
$mode = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
if ($mode !== MYSQLI_CURSOR_TYPE_NO_CURSOR) { throw new RuntimeException('Режим не применён'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Поддержка атрибутов зависит от клиента/сервера. Атрибут курсора не превращает SQL в безопасный read-only запрос и не заменяет ограничения прав.

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

Настроить способ работы подготовленной команды до execute.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$attributeИдентификатор атрибута.
$valueДопустимое для выбранного атрибута значение.

true/false; вызовы можно повторять для разных настроек. MYSQLI_STMT_ATTR_CURSOR_TYPE принимает NO_CURSOR (по умолчанию) или READ_ONLY. Исторический UPDATE_MAX_LENGTH просил обновлять max_length, но в современной mysqlnd после PHP 8.1 поле всегда 0; не стройте на нём ширину интерфейса. PREFETCH_ROWS задавал число получаемых за раз строк (1..unsigned long, default 1), удалён с PHP 8.4. Не все константы курсоров означают поддержку прокрутки: FOR_UPDATE/SCROLLABLE не являются рабочим универсальным режимом MySQLi.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Настройка задаётся до execute → execute открывает нужный курсор → fetch читает → free_result завершает курсор.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Курсор открывается при execute; store_result для него не нужен. Повторный execute/reset закрывает прежний курсор, free_result тоже его завершает. Не считайте серверный курсор автоматически быстрее обычного потока.

Запросить курсор только для чтенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name FROM course_products ORDER BY id');
$s->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_READ_ONLY);
$s->execute(); $s->bind_result($name);
while ($s->fetch()) { echo $name, "\n"; }
$s->free_result();
Ожидаемый результат
bool(true)
Pen
Notebook
Box

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Атрибут влияет на способ получения результатов, а не на WHERE или число строк запроса.

Узнать режим курсора командыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
var_dump($s->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE) === MYSQLI_CURSOR_TYPE_NO_CURSOR);
Ожидаемый результат
bool(true)

Связанные операции: mysqli_stmt_attr_get, mysqli_stmt_free_result.

Оба входа к этой операции: mysqli_stmt_attr_set, mysqli_stmt::attr_set.

mysqli_stmt_param_countУзнать число входных SQL-параметров.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_param_count(mysqli_stmt $statement): int; readonly mysqli_stmt::$param_count

Проверить контракт подготовленного поиска. param_count считает входные маркеры?, field_count — колонки ответа SELECT. Свойства читаются без скобок; процедурный вариант принимает statement.

Данные и действие: mysqli_stmt_param_count
  1. $stmt->param_count
  2. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить контракт подготовленного поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
if ($stmt->param_count !== 1) { throw new RuntimeException('Изменился контракт поиска'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Правильное число не подтверждает качество номера, имена выходных колонок или доступ пользователя. Проверяйте назначение запроса целиком.

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

Узнать число входных SQL-параметров.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Число маркеров ? после успешного prepare. Не считайте символы ? вручную: вопрос может находиться в строковом литерале SQL.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_param_count, mysqli_stmt::$param_count.

mysqli_stmt::$param_countУзнать число входных SQL-параметров.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_param_count(mysqli_stmt $statement): int; readonly mysqli_stmt::$param_count

Проверить контракт подготовленного поиска. param_count считает входные маркеры?, field_count — колонки ответа SELECT. Свойства читаются без скобок; процедурный вариант принимает statement.

Данные и действие: mysqli_stmt::$param_count
  1. $stmt->param_count
  2. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить контракт подготовленного поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
if ($stmt->param_count !== 1) { throw new RuntimeException('Изменился контракт поиска'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Правильное число не подтверждает качество номера, имена выходных колонок или доступ пользователя. Проверяйте назначение запроса целиком.

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

Узнать число входных SQL-параметров.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Число маркеров ? после успешного prepare. Не считайте символы ? вручную: вопрос может находиться в строковом литерале SQL.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_param_count, mysqli_stmt::$param_count.

mysqli_stmt_field_countУзнать число выходных колонок команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_field_count(mysqli_stmt $statement): int; readonly mysqli_stmt::$field_count

Проверить контракт подготовленного поиска. param_count считает входные маркеры?, field_count — колонки ответа SELECT. Свойства читаются без скобок; процедурный вариант принимает statement.

Данные и действие: mysqli_stmt_field_count
  1. $stmt->field_count
  2. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить контракт подготовленного поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
if ($stmt->field_count !== 2) { throw new RuntimeException('Изменился контракт поиска'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Правильное число не подтверждает качество номера, имена выходных колонок или доступ пользователя. Проверяйте назначение запроса целиком.

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

Узнать число выходных колонок команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Количество колонок подготовленного SELECT; у UPDATE/INSERT без набора обычно 0. Не равно количеству параметров.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_field_count, mysqli_stmt::$field_count.

mysqli_stmt::$field_countУзнать число выходных колонок команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_field_count(mysqli_stmt $statement): int; readonly mysqli_stmt::$field_count

Проверить контракт подготовленного поиска. param_count считает входные маркеры?, field_count — колонки ответа SELECT. Свойства читаются без скобок; процедурный вариант принимает statement.

Данные и действие: mysqli_stmt::$field_count
  1. $stmt->field_count
  2. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить контракт подготовленного поискаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
if ($stmt->field_count !== 2) { throw new RuntimeException('Изменился контракт поиска'); }
$stmt->execute([1]);
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Правильное число не подтверждает качество номера, имена выходных колонок или доступ пользователя. Проверяйте назначение запроса целиком.

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

Узнать число выходных колонок команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Количество колонок подготовленного SELECT; у UPDATE/INSERT без набора обычно 0. Не равно количеству параметров.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_field_count, mysqli_stmt::$field_count.

mysqli_stmt_num_rowsУзнать число строк в буфере команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_num_rows(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$num_rows

Показать размер буферизованного ответа statement. Размер известен после store_result; без буфера число до окончания чтения может быть 0. Это число строк текущего ответа, не изменённых записей.

Данные и действие: mysqli_stmt_num_rows
  1. $stmt->num_rows
  2. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
  3. После выполнения: В списке: 3 товара · Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Показать размер буферизованного ответа statementПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
echo 'В списке: ', $stmt->num_rows, " товара\n";
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->free_result();
$stmt->close();
Ожидаемый результат
В списке: 3 товара
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Если нужен только счётчик, SELECT COUNT(*) не требует полного буфера товаров. Для огромных ответов не включайте store_result ради одного числа.

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

Узнать число строк в буфере команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Надёжный полный размер получают после store_result. Без буфера возвращает 0, пока все строки не получены. Число больше PHP_INT_MAX возвращается строкой; это не число всех строк таблицы.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_num_rows, mysqli_stmt::$num_rows.

mysqli_stmt::$num_rowsУзнать число строк в буфере команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_num_rows(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$num_rows

Показать размер буферизованного ответа statement. Размер известен после store_result; без буфера число до окончания чтения может быть 0. Это число строк текущего ответа, не изменённых записей.

Данные и действие: mysqli_stmt::$num_rows
  1. $stmt->num_rows
  2. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
  3. После выполнения: В списке: 3 товара · Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Показать размер буферизованного ответа statementПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
echo 'В списке: ', $stmt->num_rows, " товара\n";
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->free_result();
$stmt->close();
Ожидаемый результат
В списке: 3 товара
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Если нужен только счётчик, SELECT COUNT(*) не требует полного буфера товаров. Для огромных ответов не включайте store_result ради одного числа.

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

Узнать число строк в буфере команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementПодготовленная команда; для числа строк также выполненная и буферизованная.

Надёжный полный размер получают после store_result. Без буфера возвращает 0, пока все строки не получены. Число больше PHP_INT_MAX возвращается строкой; это не число всех строк таблицы.

Путь данных. SQL-шаблон задаёт входы и колонки → execute создаёт строки → Счётчик читает нужное измерение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_store_result, mysqli_stmt_bind_param.

Оба входа к этой операции: mysqli_stmt_num_rows, mysqli_stmt::$num_rows.

mysqli_stmt::num_rowsПолучить число строк методом вместо свойства.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt::num_rows(): int|string

Показать размер буферизованного ответа statement. Размер известен после store_result; без буфера число до окончания чтения может быть 0. Это число строк текущего ответа, не изменённых записей.

Данные и действие: mysqli_stmt::num_rows
  1. $stmt->num_rows
  2. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
  3. После выполнения: В списке: 3 товара · Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
Показать размер буферизованного ответа statementПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('SELECT name, stock FROM products ORDER BY id');
$stmt->execute();
$stmt->store_result();
echo 'В списке: ', $stmt->num_rows, " товара\n";
$stmt->bind_result($name, $stock);
while ($stmt->fetch()) { echo $name, ' — ', $stock, " шт.\n"; }
$stmt->free_result();
$stmt->close();
Ожидаемый результат
В списке: 3 товара
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Число в заголовке относится к тому же буферу, из которого затем показаны три товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Если нужен только счётчик, SELECT COUNT(*) не требует полного буфера товаров. Для огромных ответов не включайте store_result ради одного числа.

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

Получить число строк методом вместо свойства.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Эквивалент mysqli_stmt_num_rows и свойства num_rows: используйте после store_result для полного размера. Значение может быть строкой при превышении PHP_INT_MAX.

Путь данных. store_result получает строки → Метод читает размер → Размер относится к текущему набору.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Один входной ?, две выходные колонки, одна найденная строка. Эти три счётчика отвечают на разные вопросы.

Различить число входов и выходовПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT name, price FROM course_products WHERE id = ?');
echo $s->param_count, ':', $s->field_count, "\n";
$s->execute([1]); $s->store_result();
echo $s->num_rows, "\n";
Ожидаемый результат
1:2
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Пустой результат сохраняет свои колонки, а отсутствие ? не запрещает подготовить постоянный SQL.

Нет параметров и нет найденных строкПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('SELECT id, name FROM course_products WHERE id < 0');
$s->execute(); $s->store_result();
echo mysqli_stmt_param_count($s), ':', mysqli_stmt_field_count($s), ':', mysqli_stmt_num_rows($s), "\n";
Ожидаемый результат
0:2:0

Связанные операции: mysqli_stmt_num_rows.

mysqli_stmt_affected_rowsУзнать количество изменённых, вставленных, удалённых или найденных строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_affected_rows(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$affected_rows

Подтвердить резерв после условного UPDATE. Счётчик относится к последнему выполнению данного statement. Для нашего UPDATE1 означает выполненное списание,0 — условие не нашло подходящий товар.

Данные и действие: mysqli_stmt_affected_rows
  1. $stmt->affected_rows
  2. Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.
  3. После выполнения: Резерв принят · Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подтвердить резерв после условного UPDATEПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?');
$stmt->execute([2,1,2]);
echo $stmt->affected_rows === 1 ? "Резерв принят\n" : "Недостаточно товара\n";
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Резерв принят
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. CLIENT_FOUND_ROWS меняет смысл ряда UPDATE-счётчиков; одинаковые значения не означают ошибку. Полноценный заказ должен связать резерв и запись заказа транзакцией.

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

Узнать количество изменённых, вставленных, удалённых или найденных строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после execute.

Положительное число — затронутые строки; 0 — нет изменений/совпадений либо ещё не было выполнения. −1 — ошибка или SELECT до store_result. Для SELECT после буферизации соответствует num_rows. При переполнении PHP int возвращается строка. FOUND_ROWS влияет на UPDATE; INSERT ... ON DUPLICATE KEY UPDATE имеет особый счётчик 1/2/0 по действию.

Путь данных. execute меняет товары → Сервер возвращает счётчик → Код различает успех SQL и полезное изменение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. При обычном соединении повторная запись того же значения не считается изменением. Флаг MYSQLI_CLIENT_FOUND_ROWS меняет смысл UPDATE на число найденных строк.

Узнать, что UPDATE действительно изменил строкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
$s->execute([130, 1]); echo $s->affected_rows, "\n";
$s->execute([130, 1]); echo $s->affected_rows, "\n";
Ожидаемый результат
1
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Успех SQL с нулём затронутых строк не означает сетевую ошибку: ID мог отсутствовать. Для бизнес-операции отдельно решите, допустим ли такой повтор.

Проверить результат удаления по проверенному IDПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('DELETE FROM course_products WHERE id = ?');
$s->execute([3]); echo mysqli_stmt_affected_rows($s), "\n";
$s->execute([999]); echo mysqli_stmt_affected_rows($s), "\n";
Ожидаемый результат
1
0

Связанные операции: mysqli_affected_rows, mysqli_stmt_num_rows.

Оба входа к этой операции: mysqli_stmt_affected_rows, mysqli_stmt::$affected_rows.

mysqli_stmt::$affected_rowsУзнать количество изменённых, вставленных, удалённых или найденных строк.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_affected_rows(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$affected_rows

Подтвердить резерв после условного UPDATE. Счётчик относится к последнему выполнению данного statement. Для нашего UPDATE1 означает выполненное списание,0 — условие не нашло подходящий товар.

Данные и действие: mysqli_stmt::$affected_rows
  1. $stmt->affected_rows
  2. Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.
  3. После выполнения: Резерв принят · Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подтвердить резерв после условного UPDATEПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?');
$stmt->execute([2,1,2]);
echo $stmt->affected_rows === 1 ? "Резерв принят\n" : "Недостаточно товара\n";
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Резерв принят
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. CLIENT_FOUND_ROWS меняет смысл ряда UPDATE-счётчиков; одинаковые значения не означают ошибку. Полноценный заказ должен связать резерв и запись заказа транзакцией.

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

Узнать количество изменённых, вставленных, удалённых или найденных строк.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после execute.

Положительное число — затронутые строки; 0 — нет изменений/совпадений либо ещё не было выполнения. −1 — ошибка или SELECT до store_result. Для SELECT после буферизации соответствует num_rows. При переполнении PHP int возвращается строка. FOUND_ROWS влияет на UPDATE; INSERT ... ON DUPLICATE KEY UPDATE имеет особый счётчик 1/2/0 по действию.

Путь данных. execute меняет товары → Сервер возвращает счётчик → Код различает успех SQL и полезное изменение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. При обычном соединении повторная запись того же значения не считается изменением. Флаг MYSQLI_CLIENT_FOUND_ROWS меняет смысл UPDATE на число найденных строк.

Узнать, что UPDATE действительно изменил строкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('UPDATE course_products SET price = ? WHERE id = ?');
$s->execute([130, 1]); echo $s->affected_rows, "\n";
$s->execute([130, 1]); echo $s->affected_rows, "\n";
Ожидаемый результат
1
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Успех SQL с нулём затронутых строк не означает сетевую ошибку: ID мог отсутствовать. Для бизнес-операции отдельно решите, допустим ли такой повтор.

Проверить результат удаления по проверенному IDПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$s = $db->prepare('DELETE FROM course_products WHERE id = ?');
$s->execute([3]); echo mysqli_stmt_affected_rows($s), "\n";
$s->execute([999]); echo mysqli_stmt_affected_rows($s), "\n";
Ожидаемый результат
1
0

Связанные операции: mysqli_affected_rows, mysqli_stmt_num_rows.

Оба входа к этой операции: mysqli_stmt_affected_rows, mysqli_stmt::$affected_rows.

mysqli_stmt_insert_idПолучить AUTO_INCREMENT-ключ результата вставки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_insert_id(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$insert_id

Получить созданную запись по выданному номеру. После INSERT без id сервер назначает AUTO_INCREMENT. Считываем номер именно этого statement до следующего исполнения.

Данные и действие: mysqli_stmt_insert_id
  1. $stmt->insert_id
  2. ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.
  3. После выполнения: Товар #4: Отвёртка — 4 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить созданную запись по выданному номеруПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('INSERT INTO products (name, stock) VALUES (?, ?)');
$stmt->execute(['Отвёртка',4]);
$id = $stmt->insert_id;
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [$id]);
$row = $result->fetch_assoc();
echo 'Товар #', $id, ': ', $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Товар #4: Отвёртка — 4 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Товар #4: Отвёртка4 шт.

Если требование изменится. Это не MAX(id), не номер обновлённой строки и не гарантированно последовательный счётчик без пропусков. Пакетный INSERT имеет особый контракт первого сгенерированногоID.

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

Получить AUTO_INCREMENT-ключ результата вставки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement сразу после успешного INSERT/операции, изменившей insert ID.

int либо строка для числа вне PHP_INT_MAX. Отдельная официальная страница содержит только сигнатуру; смысл подтверждается общим insert_id и реализацией PHP 8.5.11. При нескольких вставках возвращается первый сгенерированный ключ, при отсутствии нового ID — 0; LAST_INSERT_ID(expr) может менять его. Не используйте MAX(id), который подвержен конкуренции.

Путь данных. INSERT создаёт запись → Сервер выдаёт ID этому выполнению → Свойство сохраняется в переменную для следующего действия.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ID выдаёт AUTO_INCREMENT, а не SELECT MAX(id). Снимите значение сразу после вставки на том же statement/соединении.

Получить ключ только что созданной записиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$s = $db->prepare('INSERT INTO course_orders (title) VALUES (?)');
$s->execute(['First']);
echo $s->insert_id, "\n";
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первый сгенерированный ID и число вставок не дают общего правила вычислить все ключи в реальном сервере: учитывайте шаг AUTO_INCREMENT, конфликты и пропуски.

Несколько строк: возвращается первый ключПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$s = $db->prepare('INSERT INTO course_orders (title) VALUES (?), (?)');
$s->execute(['First', 'Second']);
echo mysqli_stmt_insert_id($s), ':', $s->affected_rows, "\n";
Ожидаемый результат
1:2

Связанные операции: mysqli_insert_id, mysqli_stmt_affected_rows.

Оба входа к этой операции: mysqli_stmt_insert_id, mysqli_stmt::$insert_id.

mysqli_stmt::$insert_idПолучить AUTO_INCREMENT-ключ результата вставки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_insert_id(mysqli_stmt $statement): int|string; readonly mysqli_stmt::$insert_id

Получить созданную запись по выданному номеру. После INSERT без id сервер назначает AUTO_INCREMENT. Считываем номер именно этого statement до следующего исполнения.

Данные и действие: mysqli_stmt::$insert_id
  1. $stmt->insert_id
  2. ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.
  3. После выполнения: Товар #4: Отвёртка — 4 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Получить созданную запись по выданному номеруПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare('INSERT INTO products (name, stock) VALUES (?, ?)');
$stmt->execute(['Отвёртка',4]);
$id = $stmt->insert_id;
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [$id]);
$row = $result->fetch_assoc();
echo 'Товар #', $id, ': ', $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Товар #4: Отвёртка — 4 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Товар #4: Отвёртка4 шт.

Если требование изменится. Это не MAX(id), не номер обновлённой строки и не гарантированно последовательный счётчик без пропусков. Пакетный INSERT имеет особый контракт первого сгенерированногоID.

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

Получить AUTO_INCREMENT-ключ результата вставки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement сразу после успешного INSERT/операции, изменившей insert ID.

int либо строка для числа вне PHP_INT_MAX. Отдельная официальная страница содержит только сигнатуру; смысл подтверждается общим insert_id и реализацией PHP 8.5.11. При нескольких вставках возвращается первый сгенерированный ключ, при отсутствии нового ID — 0; LAST_INSERT_ID(expr) может менять его. Не используйте MAX(id), который подвержен конкуренции.

Путь данных. INSERT создаёт запись → Сервер выдаёт ID этому выполнению → Свойство сохраняется в переменную для следующего действия.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ID выдаёт AUTO_INCREMENT, а не SELECT MAX(id). Снимите значение сразу после вставки на том же statement/соединении.

Получить ключ только что созданной записиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$s = $db->prepare('INSERT INTO course_orders (title) VALUES (?)');
$s->execute(['First']);
echo $s->insert_id, "\n";
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первый сгенерированный ID и число вставок не дают общего правила вычислить все ключи в реальном сервере: учитывайте шаг AUTO_INCREMENT, конфликты и пропуски.

Несколько строк: возвращается первый ключПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$s = $db->prepare('INSERT INTO course_orders (title) VALUES (?), (?)');
$s->execute(['First', 'Second']);
echo mysqli_stmt_insert_id($s), ':', $s->affected_rows, "\n";
Ожидаемый результат
1:2

Связанные операции: mysqli_insert_id, mysqli_stmt_affected_rows.

Оба входа к этой операции: mysqli_stmt_insert_id, mysqli_stmt::$insert_id.

mysqli_stmt_errnoПолучить числовой код последней ошибки statement.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_errno(mysqli_stmt $statement): int; readonly mysqli_stmt::$errno

Разобрать отказ вставки, сохранив исходный товар. Числовой код ошибки MySQL подходит для выбора конкретной ветки обработки.

Данные и действие: mysqli_stmt_errno
  1. $stmt->errno
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->errno;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->errno === 1062) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить числовой код последней ошибки statement.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

0 — ошибки нет. Число относится к драйверу/серверу; для переносимой категории смотрят SQLSTATE.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_errno, mysqli_stmt::$errno.

mysqli_stmt::$errnoПолучить числовой код последней ошибки statement.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_errno(mysqli_stmt $statement): int; readonly mysqli_stmt::$errno

Разобрать отказ вставки, сохранив исходный товар. Числовой код ошибки MySQL подходит для выбора конкретной ветки обработки.

Данные и действие: mysqli_stmt::$errno
  1. $stmt->errno
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->errno;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->errno === 1062) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить числовой код последней ошибки statement.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

0 — ошибки нет. Число относится к драйверу/серверу; для переносимой категории смотрят SQLSTATE.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_errno, mysqli_stmt::$errno.

mysqli_stmt_errorПолучить описание последней ошибки statement.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_error(mysqli_stmt $statement): string; readonly mysqli_stmt::$error

Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.

Данные и действие: mysqli_stmt_error
  1. $stmt->error
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->error;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->error !== '') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить описание последней ошибки statement.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Пустая строка — ошибки нет; текст не подходит для стабильного сравнения и может раскрывать структуру SQL.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_error, mysqli_stmt::$error.

mysqli_stmt::$errorПолучить описание последней ошибки statement.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_error(mysqli_stmt $statement): string; readonly mysqli_stmt::$error

Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.

Данные и действие: mysqli_stmt::$error
  1. $stmt->error
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->error;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->error !== '') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить описание последней ошибки statement.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Пустая строка — ошибки нет; текст не подходит для стабильного сравнения и может раскрывать структуру SQL.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_error, mysqli_stmt::$error.

mysqli_stmt_error_listПолучить структурированный список ошибок команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_error_list(mysqli_stmt $statement): array; readonly mysqli_stmt::$error_list

Разобрать отказ вставки, сохранив исходный товар. Список диагностик содержит код, SQLSTATE и текст; это массив сообщений, а не строки SELECT.

Данные и действие: mysqli_stmt_error_list
  1. $stmt->error_list
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->error_list;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if (count($stmt->error_list) > 0) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить структурированный список ошибок команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Список массивов errno, error, sqlstate; [] при отсутствии. Доступен с PHP 5.4. Не путайте с массивом серверных warnings.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_error_list, mysqli_stmt::$error_list.

mysqli_stmt::$error_listПолучить структурированный список ошибок команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_error_list(mysqli_stmt $statement): array; readonly mysqli_stmt::$error_list

Разобрать отказ вставки, сохранив исходный товар. Список диагностик содержит код, SQLSTATE и текст; это массив сообщений, а не строки SELECT.

Данные и действие: mysqli_stmt::$error_list
  1. $stmt->error_list
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->error_list;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if (count($stmt->error_list) > 0) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить структурированный список ошибок команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Список массивов errno, error, sqlstate; [] при отсутствии. Доступен с PHP 5.4. Не путайте с массивом серверных warnings.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_error_list, mysqli_stmt::$error_list.

mysqli_stmt_sqlstateПолучить SQLSTATE последней ошибки команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_sqlstate(mysqli_stmt $statement): string; readonly mysqli_stmt::$sqlstate

Разобрать отказ вставки, сохранив исходный товар. SQLSTATE — пятисимвольная категория отказа. 23000 в этом случае означает нарушение ограничения целостности.

Данные и действие: mysqli_stmt_sqlstate
  1. $stmt->sqlstate
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->sqlstate;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->sqlstate === '23000') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить SQLSTATE последней ошибки команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Пять символов; 00000 — нет ошибки. Категория определена SQL/ODBC, но конкретную логику повторов проектируют по операции и серверной ошибке.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_sqlstate, mysqli_stmt::$sqlstate.

mysqli_stmt::$sqlstateПолучить SQLSTATE последней ошибки команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_sqlstate(mysqli_stmt $statement): string; readonly mysqli_stmt::$sqlstate

Разобрать отказ вставки, сохранив исходный товар. SQLSTATE — пятисимвольная категория отказа. 23000 в этом случае означает нарушение ограничения целостности.

Данные и действие: mysqli_stmt::$sqlstate
  1. $stmt->sqlstate
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$stmt = $db->prepare('INSERT INTO products VALUES (?, ?, ?)');
$stmt->execute([1, 'Дубликат', 1]);
$details = $stmt->sqlstate;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($stmt->sqlstate === '23000') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Получить SQLSTATE последней ошибки команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementКоманда сразу после интересующей операции.

Пять символов; 00000 — нет ошибки. Категория определена SQL/ODBC, но конкретную логику повторов проектируют по операции и серверной ошибке.

Путь данных. Операция завершилась → Statement сохраняет диагностику → Приложение снимает её до следующего вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Текст зависит от версии MySQL; код 1064/SQLSTATE 42000 характерны для этого синтаксического отказа. Состояние читайте до следующей операции. Посетителю не выводят сырой SQL/сообщение.

Снять диагностику намеренно неверного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->stmt_init();
try { $s->prepare('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $s->errno, ':', $s->sqlstate, "\n";
    echo $s->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($s->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Диагностика относится к последней операции, а не ко всей истории сервиса. Если ошибка нужна для журнала, сохраните её сразу.

Успех не оставляет последнюю ошибку вечным флагомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute();
echo mysqli_stmt_errno($s), ':', mysqli_stmt_sqlstate($s), "\n";
var_dump(mysqli_stmt_error($s), mysqli_stmt_error_list($s));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_report, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_stmt_sqlstate, mysqli_stmt::$sqlstate.

mysqli_stmt_more_resultsПроверить, остались ли результаты подготовленного CALL.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_more_results(mysqli_stmt $statement): bool; mysqli_stmt::more_results(): bool

Прочитать оба ответа подготовленного CALL. Один вызов процедуры способен вернуть несколько наборов. more_results сообщает о следующем, next_result переключает текущий; каждый набор надо освободить.

Данные и действие: mysqli_stmt_more_results
  1. $stmt->more_results()
  2. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать оба ответа подготовленного CALLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE PROCEDURE course_ref_catalog() BEGIN SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products; END');
try {
    $stmt = $db->prepare('CALL course_ref_catalog()');
    $stmt->execute();
    do {
        $result = $stmt->get_result();
        if ($result !== false) {
            while ($row = $result->fetch_assoc()) {
                echo isset($row['name']) ? $row['name'].' — '.$row['stock']." шт.\n" : 'Всего: '.$row['total']."\n";
            }
            $result->free();
        }
    } while ($stmt->more_results() && $stmt->next_result());
    $stmt->close();
} finally {
    $db->query('DROP PROCEDURE course_ref_catalog');
}
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Дополнительно нужны CREATE ROUTINE, ALTER ROUTINE и EXECUTE в учебной базе; базового README для этой операции недостаточно. Выдайте эти права отдельному учебному пользователю осознанно. Серверный пример проверен только lint.

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

Проверить, остались ли результаты подготовленного CALL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненный CALL с уже обработанным текущим набором.

true/false; только mysqlnd. Проверка сообщает наличие, а не успех следующего результата. Для перехода нужен stmt_next_result; не подменяйте его одноимённым методом соединения при работе с подготовленной командой.

Путь данных. CALL выдаёт первый набор → more_results обнаруживает продолжение → next_result переходит к нему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база, нужны CREATE ROUTINE/ALTER ROUTINE. Если имя уже существует, CREATE откажет до try: чужая процедура не удаляется. CALL возвращает два набора и завершающий статус без строк; обработайте все.

Прочитать несколько наборов процедурыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_two() BEGIN SELECT 12 AS value; SELECT 25 AS value; END');
try {
    $s = $db->prepare('CALL course_ref_two()'); $s->execute();
    do {
        if ($result = $s->get_result()) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_two'); }
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Prepared statement содержит один CALL, а не пакет из нескольких произвольных SQL. Процедура может сама выдавать несколько ответов. Не забывайте хвостовой статус, иначе следующая команда получает Commands out of sync.

Обработать CALL с одним набором и финальным статусомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_one() SELECT 42 AS value');
try {
    $s = mysqli_prepare($db, 'CALL course_ref_one()'); mysqli_stmt_execute($s);
    do {
        if ($result = mysqli_stmt_get_result($s)) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!mysqli_stmt_more_results($s)) { break; }
    } while (mysqli_stmt_next_result($s));
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_one'); }
Ожидаемый результат
42

Связанные операции: mysqli_stmt_next_result, mysqli_more_results.

Оба входа к этой операции: mysqli_stmt_more_results, mysqli_stmt::more_results.

mysqli_stmt::more_resultsПроверить, остались ли результаты подготовленного CALL.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_more_results(mysqli_stmt $statement): bool; mysqli_stmt::more_results(): bool

Прочитать оба ответа подготовленного CALL. Один вызов процедуры способен вернуть несколько наборов. more_results сообщает о следующем, next_result переключает текущий; каждый набор надо освободить.

Данные и действие: mysqli_stmt::more_results
  1. $stmt->more_results()
  2. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать оба ответа подготовленного CALLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE PROCEDURE course_ref_catalog() BEGIN SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products; END');
try {
    $stmt = $db->prepare('CALL course_ref_catalog()');
    $stmt->execute();
    do {
        $result = $stmt->get_result();
        if ($result !== false) {
            while ($row = $result->fetch_assoc()) {
                echo isset($row['name']) ? $row['name'].' — '.$row['stock']." шт.\n" : 'Всего: '.$row['total']."\n";
            }
            $result->free();
        }
    } while ($stmt->more_results() && $stmt->next_result());
    $stmt->close();
} finally {
    $db->query('DROP PROCEDURE course_ref_catalog');
}
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Дополнительно нужны CREATE ROUTINE, ALTER ROUTINE и EXECUTE в учебной базе; базового README для этой операции недостаточно. Выдайте эти права отдельному учебному пользователю осознанно. Серверный пример проверен только lint.

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

Проверить, остались ли результаты подготовленного CALL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementВыполненный CALL с уже обработанным текущим набором.

true/false; только mysqlnd. Проверка сообщает наличие, а не успех следующего результата. Для перехода нужен stmt_next_result; не подменяйте его одноимённым методом соединения при работе с подготовленной командой.

Путь данных. CALL выдаёт первый набор → more_results обнаруживает продолжение → next_result переходит к нему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база, нужны CREATE ROUTINE/ALTER ROUTINE. Если имя уже существует, CREATE откажет до try: чужая процедура не удаляется. CALL возвращает два набора и завершающий статус без строк; обработайте все.

Прочитать несколько наборов процедурыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_two() BEGIN SELECT 12 AS value; SELECT 25 AS value; END');
try {
    $s = $db->prepare('CALL course_ref_two()'); $s->execute();
    do {
        if ($result = $s->get_result()) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_two'); }
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Prepared statement содержит один CALL, а не пакет из нескольких произвольных SQL. Процедура может сама выдавать несколько ответов. Не забывайте хвостовой статус, иначе следующая команда получает Commands out of sync.

Обработать CALL с одним набором и финальным статусомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_one() SELECT 42 AS value');
try {
    $s = mysqli_prepare($db, 'CALL course_ref_one()'); mysqli_stmt_execute($s);
    do {
        if ($result = mysqli_stmt_get_result($s)) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!mysqli_stmt_more_results($s)) { break; }
    } while (mysqli_stmt_next_result($s));
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_one'); }
Ожидаемый результат
42

Связанные операции: mysqli_stmt_next_result, mysqli_more_results.

Оба входа к этой операции: mysqli_stmt_more_results, mysqli_stmt::more_results.

mysqli_stmt_next_resultПерейти к следующему ответу подготовленного CALL.

PHP 5.3+; libmysqlclient с 8.1 · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_next_result(mysqli_stmt $statement): bool; mysqli_stmt::next_result(): bool

Прочитать оба ответа подготовленного CALL. Один вызов процедуры способен вернуть несколько наборов. more_results сообщает о следующем, next_result переключает текущий; каждый набор надо освободить.

Данные и действие: mysqli_stmt_next_result
  1. $stmt->next_result()
  2. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать оба ответа подготовленного CALLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE PROCEDURE course_ref_catalog() BEGIN SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products; END');
try {
    $stmt = $db->prepare('CALL course_ref_catalog()');
    $stmt->execute();
    do {
        $result = $stmt->get_result();
        if ($result !== false) {
            while ($row = $result->fetch_assoc()) {
                echo isset($row['name']) ? $row['name'].' — '.$row['stock']." шт.\n" : 'Всего: '.$row['total']."\n";
            }
            $result->free();
        }
    } while ($stmt->more_results() && $stmt->next_result());
    $stmt->close();
} finally {
    $db->query('DROP PROCEDURE course_ref_catalog');
}
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Дополнительно нужны CREATE ROUTINE, ALTER ROUTINE и EXECUTE в учебной базе; базового README для этой операции недостаточно. Выдайте эти права отдельному учебному пользователю осознанно. Серверный пример проверен только lint.

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

Перейти к следующему ответу подготовленного CALL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement с несколькими результатами.

true при успешном следующем ответе, false при отказе/отсутствии; SQL-ошибка может выбросить исключение здесь. До PHP 8.1 только mysqlnd, с 8.1 также историческая сборка libmysqlclient. Обработайте текущий набор до перехода.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущий набор освобождён → next_result получает следующий → get_result читает его или распознаёт статус.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база, нужны CREATE ROUTINE/ALTER ROUTINE. Если имя уже существует, CREATE откажет до try: чужая процедура не удаляется. CALL возвращает два набора и завершающий статус без строк; обработайте все.

Прочитать несколько наборов процедурыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_two() BEGIN SELECT 12 AS value; SELECT 25 AS value; END');
try {
    $s = $db->prepare('CALL course_ref_two()'); $s->execute();
    do {
        if ($result = $s->get_result()) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_two'); }
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Prepared statement содержит один CALL, а не пакет из нескольких произвольных SQL. Процедура может сама выдавать несколько ответов. Не забывайте хвостовой статус, иначе следующая команда получает Commands out of sync.

Обработать CALL с одним набором и финальным статусомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_one() SELECT 42 AS value');
try {
    $s = mysqli_prepare($db, 'CALL course_ref_one()'); mysqli_stmt_execute($s);
    do {
        if ($result = mysqli_stmt_get_result($s)) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!mysqli_stmt_more_results($s)) { break; }
    } while (mysqli_stmt_next_result($s));
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_one'); }
Ожидаемый результат
42

Связанные операции: mysqli_stmt_more_results, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_next_result, mysqli_stmt::next_result.

mysqli_stmt::next_resultПерейти к следующему ответу подготовленного CALL.

PHP 5.3+; libmysqlclient с 8.1 · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_next_result(mysqli_stmt $statement): bool; mysqli_stmt::next_result(): bool

Прочитать оба ответа подготовленного CALL. Один вызов процедуры способен вернуть несколько наборов. more_results сообщает о следующем, next_result переключает текущий; каждый набор надо освободить.

Данные и действие: mysqli_stmt::next_result
  1. $stmt->next_result()
  2. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
  3. После выполнения: Молоток — 8 шт. · Перчатки — 15 шт. · Кисть — 0 шт. · Всего: 3

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Прочитать оба ответа подготовленного CALLПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('CREATE PROCEDURE course_ref_catalog() BEGIN SELECT name, stock FROM products ORDER BY id; SELECT COUNT(*) AS total FROM products; END');
try {
    $stmt = $db->prepare('CALL course_ref_catalog()');
    $stmt->execute();
    do {
        $result = $stmt->get_result();
        if ($result !== false) {
            while ($row = $result->fetch_assoc()) {
                echo isset($row['name']) ? $row['name'].' — '.$row['stock']." шт.\n" : 'Всего: '.$row['total']."\n";
            }
            $result->free();
        }
    } while ($stmt->more_results() && $stmt->next_result());
    $stmt->close();
} finally {
    $db->query('DROP PROCEDURE course_ref_catalog');
}
Ожидаемый результат
Молоток — 8 шт.
Перчатки — 15 шт.
Кисть — 0 шт.
Всего: 3

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Дополнительно нужны CREATE ROUTINE, ALTER ROUTINE и EXECUTE в учебной базе; базового README для этой операции недостаточно. Выдайте эти права отдельному учебному пользователю осознанно. Серверный пример проверен только lint.

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

Перейти к следующему ответу подготовленного CALL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement с несколькими результатами.

true при успешном следующем ответе, false при отказе/отсутствии; SQL-ошибка может выбросить исключение здесь. До PHP 8.1 только mysqlnd, с 8.1 также историческая сборка libmysqlclient. Обработайте текущий набор до перехода.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Текущий набор освобождён → next_result получает следующий → get_result читает его или распознаёт статус.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельная учебная база, нужны CREATE ROUTINE/ALTER ROUTINE. Если имя уже существует, CREATE откажет до try: чужая процедура не удаляется. CALL возвращает два набора и завершающий статус без строк; обработайте все.

Прочитать несколько наборов процедурыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_two() BEGIN SELECT 12 AS value; SELECT 25 AS value; END');
try {
    $s = $db->prepare('CALL course_ref_two()'); $s->execute();
    do {
        if ($result = $s->get_result()) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!$s->more_results()) { break; }
    } while ($s->next_result());
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_two'); }
Ожидаемый результат
12
25

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Prepared statement содержит один CALL, а не пакет из нескольких произвольных SQL. Процедура может сама выдавать несколько ответов. Не забывайте хвостовой статус, иначе следующая команда получает Commands out of sync.

Обработать CALL с одним набором и финальным статусомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE PROCEDURE course_ref_one() SELECT 42 AS value');
try {
    $s = mysqli_prepare($db, 'CALL course_ref_one()'); mysqli_stmt_execute($s);
    do {
        if ($result = mysqli_stmt_get_result($s)) {
            echo $result->fetch_column(), "\n"; $result->free();
        }
        if (!mysqli_stmt_more_results($s)) { break; }
    } while (mysqli_stmt_next_result($s));
    $s->close();
} finally { $db->query('DROP PROCEDURE course_ref_one'); }
Ожидаемый результат
42

Связанные операции: mysqli_stmt_more_results, mysqli_stmt_get_result.

Оба входа к этой операции: mysqli_stmt_next_result, mysqli_stmt::next_result.

mysqli_stmt_get_warningsСнять предупреждения последней выполненной команды.

PHP 5.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_get_warnings(mysqli_stmt $statement): mysqli_warning|false; mysqli_stmt::get_warnings(): mysqli_warning|false

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_stmt_get_warnings
  1. $stmt->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare("SELECT CAST('12x' AS UNSIGNED)");
$stmt->execute();
$stmt->get_result()->free();
$warning = $stmt->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Снять предупреждения последней выполненной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement, результаты которого уже корректно получены/освобождены.

mysqli_warning или false. Объект хранит message, sqlstate, errno; next() проходит остальные. Нельзя без чтения результата отправлять ещё один запрос: завершите поток, затем снимайте предупреждения. Текст храните во внутреннем журнале с ограничением чувствительных данных.

Путь данных. Сервер выполнил SQL с предупреждением → Результат обработан → get_warnings получает список → next перебирает сообщения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается предупреждение преобразования MySQL; точный текст зависит от версии сервера. Снимите warnings до следующего SQL. Это другой канал, чем PHP warning о вызове API.

Получить предупреждение преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare("SELECT CAST('not-number' AS UNSIGNED)");
$s->execute(); $result = $s->get_result(); $result->free();
$warning = $s->get_warnings();
if ($warning) { echo $warning->errno, ':', $warning->sqlstate, "\n"; }
Ожидаемый результат
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. false означает отсутствие списка. У метода официально доступна лишь сигнатура; практическое поведение сопоставлено с mysqli_warning и реализацией PHP 8.5.11.

Успешный SELECT без предупрежденийПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->get_result()->free();
var_dump(mysqli_stmt_get_warnings($s));
Ожидаемый результат
bool(false)

Связанные операции: mysqli_get_warnings, mysqli_warning::next.

Оба входа к этой операции: mysqli_stmt_get_warnings, mysqli_stmt::get_warnings.

mysqli_stmt::get_warningsСнять предупреждения последней выполненной команды.

PHP 5.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_stmt_get_warnings(mysqli_stmt $statement): mysqli_warning|false; mysqli_stmt::get_warnings(): mysqli_warning|false

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_stmt::get_warnings
  1. $stmt->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$stmt = $db->prepare("SELECT CAST('12x' AS UNSIGNED)");
$stmt->execute();
$stmt->get_result()->free();
$warning = $stmt->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Снять предупреждения последней выполненной команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$statementStatement, результаты которого уже корректно получены/освобождены.

mysqli_warning или false. Объект хранит message, sqlstate, errno; next() проходит остальные. Нельзя без чтения результата отправлять ещё один запрос: завершите поток, затем снимайте предупреждения. Текст храните во внутреннем журнале с ограничением чувствительных данных.

Путь данных. Сервер выполнил SQL с предупреждением → Результат обработан → get_warnings получает список → next перебирает сообщения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается предупреждение преобразования MySQL; точный текст зависит от версии сервера. Снимите warnings до следующего SQL. Это другой канал, чем PHP warning о вызове API.

Получить предупреждение преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare("SELECT CAST('not-number' AS UNSIGNED)");
$s->execute(); $result = $s->get_result(); $result->free();
$warning = $s->get_warnings();
if ($warning) { echo $warning->errno, ':', $warning->sqlstate, "\n"; }
Ожидаемый результат
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. false означает отсутствие списка. У метода официально доступна лишь сигнатура; практическое поведение сопоставлено с mysqli_warning и реализацией PHP 8.5.11.

Успешный SELECT без предупрежденийПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$s = $db->prepare('SELECT 42');
$s->execute(); $s->get_result()->free();
var_dump(mysqli_stmt_get_warnings($s));
Ожидаемый результат
bool(false)

Связанные операции: mysqli_get_warnings, mysqli_warning::next.

Оба входа к этой операции: mysqli_stmt_get_warnings, mysqli_stmt::get_warnings.

mysqli_begin_transactionНачать согласованное изменение нескольких записей, например заказ плюс резерв товара.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_begin_transaction(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::begin_transaction(int $flags = 0, ?string $name = null): bool

Начать единое изменение заказа. begin_transaction начинает транзакцию: дальнейшие совместимые операции соединения можно подтвердить вместе либо отменить.

Данные и действие: mysqli_begin_transaction
  1. $db->begin_transaction(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Начать единое изменение заказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Начать согласованное изменение нескольких записей, например заказ плюс резерв товара.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flags0; MYSQLI_TRANS_START_READ_ONLY, READ_WRITE (MySQL 5.6+), WITH_CONSISTENT_SNAPSHOT, совместимые флаги объединяются |.
$nameНеобязательная диагностическая метка; nullable с PHP 8.0. Не заменяет отдельный savepoint.

true/false. Нужен InnoDB/транзакционный движок. READ ONLY оптимизирует договор о чтении, snapshot действует в рамках правил изоляции сервера. В mysqli/mysqlnd name вставляется как комментарий в START TRANSACTION: несмотря на формулировку отдельной страницы, это не SAVEPOINT. Повторное начало не создаёт вложенную транзакцию; DDL и некоторые административные команды вызывают implicit commit. Держите транзакцию короткой, не ждите внутри неё API доставки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. begin обозначает границу → Первое SQL меняет товар → Второе SQL меняет связанное состояние → commit сохраняет либо rollback отменяет.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Транзакция соединяет несколько SQL-действий в один итог: сохранить оба либо откатить. Временная таблица InnoDB создана до начала. Транзакция не включает отправленное письмо или внешний HTTP-запрос.

Два изменения цены как одно действиеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [130, 1]);
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [360, 2]);
    $db->commit();
} catch (Throwable $error) {
    $db->rollback(); throw $error;
}
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
690

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После rollback исходная цена возвращается. Это работает для транзакционного движка InnoDB; MyISAM не откатывает изменения таким способом. AUTO_INCREMENT может сохранять пропуски, даже если вставка откатилась.

Отменить промежуточное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [999, 1]);
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Связанные операции: mysqli_commit, mysqli_rollback, mysqli_savepoint.

Оба входа к этой операции: mysqli_begin_transaction, mysqli::begin_transaction.

mysqli::begin_transactionНачать согласованное изменение нескольких записей, например заказ плюс резерв товара.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_begin_transaction(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::begin_transaction(int $flags = 0, ?string $name = null): bool

Начать единое изменение заказа. begin_transaction начинает транзакцию: дальнейшие совместимые операции соединения можно подтвердить вместе либо отменить.

Данные и действие: mysqli::begin_transaction
  1. $db->begin_transaction(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Начать единое изменение заказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Начать согласованное изменение нескольких записей, например заказ плюс резерв товара.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flags0; MYSQLI_TRANS_START_READ_ONLY, READ_WRITE (MySQL 5.6+), WITH_CONSISTENT_SNAPSHOT, совместимые флаги объединяются |.
$nameНеобязательная диагностическая метка; nullable с PHP 8.0. Не заменяет отдельный savepoint.

true/false. Нужен InnoDB/транзакционный движок. READ ONLY оптимизирует договор о чтении, snapshot действует в рамках правил изоляции сервера. В mysqli/mysqlnd name вставляется как комментарий в START TRANSACTION: несмотря на формулировку отдельной страницы, это не SAVEPOINT. Повторное начало не создаёт вложенную транзакцию; DDL и некоторые административные команды вызывают implicit commit. Держите транзакцию короткой, не ждите внутри неё API доставки.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. begin обозначает границу → Первое SQL меняет товар → Второе SQL меняет связанное состояние → commit сохраняет либо rollback отменяет.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Транзакция соединяет несколько SQL-действий в один итог: сохранить оба либо откатить. Временная таблица InnoDB создана до начала. Транзакция не включает отправленное письмо или внешний HTTP-запрос.

Два изменения цены как одно действиеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [130, 1]);
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [360, 2]);
    $db->commit();
} catch (Throwable $error) {
    $db->rollback(); throw $error;
}
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
690

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После rollback исходная цена возвращается. Это работает для транзакционного движка InnoDB; MyISAM не откатывает изменения таким способом. AUTO_INCREMENT может сохранять пропуски, даже если вставка откатилась.

Отменить промежуточное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [999, 1]);
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Связанные операции: mysqli_commit, mysqli_rollback, mysqli_savepoint.

Оба входа к этой операции: mysqli_begin_transaction, mysqli::begin_transaction.

mysqli_commitПодтвердить все изменения текущей транзакции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_commit(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::commit(int $flags = 0, ?string $name = null): bool

Подтвердить успешно собранное изменение. commit подтверждает накопленные изменения транзакции. Это отдельный шаг после успешных запросов, не замена их проверки.

Данные и действие: mysqli_commit
  1. $db->commit(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подтвердить успешно собранное изменениеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Подтвердить все изменения текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_TRANS_COR_*, обычно 0.
$nameНеобязательная метка комментария; null с PHP 8.0.

true/false. Флаги MYSQLI_TRANS_COR_AND_CHAIN начинают следующую транзакцию с теми же характеристиками, AND_NO_CHAIN запрещает цепочку; RELEASE закрывает серверную сессию, NO_RELEASE запрещает закрытие. Не сочетайте противоположные флаги. Параметр name — комментарий /*name*/, а не имя savepoint. Успешный commit делает изменения окончательными для этой транзакции. При разрыве связи во время подтверждения нельзя автоматически заключать, что сервер ничего не сохранил: операция нуждается в идемпотентном ключе и проверке состояния, а не слепом повторе списания.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Все SQL прошли → commit просит сервер зафиксировать → Успех подтверждает итог.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Транзакция соединяет несколько SQL-действий в один итог: сохранить оба либо откатить. Временная таблица InnoDB создана до начала. Транзакция не включает отправленное письмо или внешний HTTP-запрос.

Два изменения цены как одно действиеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [130, 1]);
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [360, 2]);
    $db->commit();
} catch (Throwable $error) {
    $db->rollback(); throw $error;
}
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
690

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Одна SQL-команда уже атомарна на уровне InnoDB; пример нужен для границ API. Реальная причина явной транзакции — согласовать несколько шагов.

Сохранить одно явное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [150, 1]);
mysqli_commit($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
150

Связанные операции: mysqli_rollback, mysqli_autocommit.

Оба входа к этой операции: mysqli_commit, mysqli::commit.

mysqli::commitПодтвердить все изменения текущей транзакции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_commit(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::commit(int $flags = 0, ?string $name = null): bool

Подтвердить успешно собранное изменение. commit подтверждает накопленные изменения транзакции. Это отдельный шаг после успешных запросов, не замена их проверки.

Данные и действие: mysqli::commit
  1. $db->commit(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Подтвердить успешно собранное изменениеПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Подтвердить все изменения текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_TRANS_COR_*, обычно 0.
$nameНеобязательная метка комментария; null с PHP 8.0.

true/false. Флаги MYSQLI_TRANS_COR_AND_CHAIN начинают следующую транзакцию с теми же характеристиками, AND_NO_CHAIN запрещает цепочку; RELEASE закрывает серверную сессию, NO_RELEASE запрещает закрытие. Не сочетайте противоположные флаги. Параметр name — комментарий /*name*/, а не имя savepoint. Успешный commit делает изменения окончательными для этой транзакции. При разрыве связи во время подтверждения нельзя автоматически заключать, что сервер ничего не сохранил: операция нуждается в идемпотентном ключе и проверке состояния, а не слепом повторе списания.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Все SQL прошли → commit просит сервер зафиксировать → Успех подтверждает итог.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Транзакция соединяет несколько SQL-действий в один итог: сохранить оба либо откатить. Временная таблица InnoDB создана до начала. Транзакция не включает отправленное письмо или внешний HTTP-запрос.

Два изменения цены как одно действиеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [130, 1]);
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [360, 2]);
    $db->commit();
} catch (Throwable $error) {
    $db->rollback(); throw $error;
}
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
690

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Одна SQL-команда уже атомарна на уровне InnoDB; пример нужен для границ API. Реальная причина явной транзакции — согласовать несколько шагов.

Сохранить одно явное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [150, 1]);
mysqli_commit($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
150

Связанные операции: mysqli_rollback, mysqli_autocommit.

Оба входа к этой операции: mysqli_commit, mysqli::commit.

mysqli_rollbackОтменить неподтверждённые изменения текущей транзакции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_rollback(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::rollback(int $flags = 0, ?string $name = null): bool

Вернуть остаток после отмены заказа. rollback отменяет неподтверждённые изменения транзакционных таблиц. Здесь списанные две штуки возвращаются в остаток.

Данные и действие: mysqli_rollback
  1. $db->rollback(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Вернуть остаток после отмены заказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->rollback();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Отменить неподтверждённые изменения текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_TRANS_COR_*, обычно 0.
$nameНеобязательный комментарий команды, не цель ROLLBACK TO.

true/false. Флаги MYSQLI_TRANS_COR_AND_CHAIN начинают следующую транзакцию с теми же характеристиками, AND_NO_CHAIN запрещает цепочку; RELEASE закрывает серверную сессию, NO_RELEASE запрещает закрытие. Не сочетайте противоположные флаги. Параметр name — комментарий /*name*/, а не имя savepoint. Не отменяет уже выполненный commit, изменения нетранзакционных таблиц, DDL с implicit commit и действия внешних сервисов. Для частичного возврата используйте SQL ROLLBACK TO SAVEPOINT с доверенным именем.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Транзакция ещё не подтверждена → rollback отменяет её изменения → Код проверяет восстановленные данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После rollback исходная цена возвращается. Это работает для транзакционного движка InnoDB; MyISAM не откатывает изменения таким способом. AUTO_INCREMENT может сохранять пропуски, даже если вставка откатилась.

Отменить промежуточное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [999, 1]);
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Бизнес-исключение здесь создано намеренно. Реальный обработчик сохраняет причину во внутреннем журнале и возвращает понятный ответ пользователю.

Откатить бизнес-отказ до оплатыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [1, 1]);
    throw new RuntimeException('Скидка не согласована');
} catch (RuntimeException $error) {
    $db->rollback(); echo 'Отменено', "\n";
}
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
Отменено
120

Связанные операции: mysqli_savepoint, mysqli_commit.

Оба входа к этой операции: mysqli_rollback, mysqli::rollback.

mysqli::rollbackОтменить неподтверждённые изменения текущей транзакции.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_rollback(mysqli $mysql, int $flags = 0, ?string $name = null): bool; mysqli::rollback(int $flags = 0, ?string $name = null): bool

Вернуть остаток после отмены заказа. rollback отменяет неподтверждённые изменения транзакционных таблиц. Здесь списанные две штуки возвращаются в остаток.

Данные и действие: mysqli::rollback
  1. $db->rollback(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Вернуть остаток после отмены заказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->rollback();
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Отменить неподтверждённые изменения текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_TRANS_COR_*, обычно 0.
$nameНеобязательный комментарий команды, не цель ROLLBACK TO.

true/false. Флаги MYSQLI_TRANS_COR_AND_CHAIN начинают следующую транзакцию с теми же характеристиками, AND_NO_CHAIN запрещает цепочку; RELEASE закрывает серверную сессию, NO_RELEASE запрещает закрытие. Не сочетайте противоположные флаги. Параметр name — комментарий /*name*/, а не имя savepoint. Не отменяет уже выполненный commit, изменения нетранзакционных таблиц, DDL с implicit commit и действия внешних сервисов. Для частичного возврата используйте SQL ROLLBACK TO SAVEPOINT с доверенным именем.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Транзакция ещё не подтверждена → rollback отменяет её изменения → Код проверяет восстановленные данные.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. После rollback исходная цена возвращается. Это работает для транзакционного движка InnoDB; MyISAM не откатывает изменения таким способом. AUTO_INCREMENT может сохранять пропуски, даже если вставка откатилась.

Отменить промежуточное изменениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_execute_query($db, 'UPDATE course_products SET price = ? WHERE id = ?', [999, 1]);
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Бизнес-исключение здесь создано намеренно. Реальный обработчик сохраняет причину во внутреннем журнале и возвращает понятный ответ пользователю.

Откатить бизнес-отказ до оплатыПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
try {
    $db->execute_query('UPDATE course_products SET price = ? WHERE id = ?', [1, 1]);
    throw new RuntimeException('Скидка не согласована');
} catch (RuntimeException $error) {
    $db->rollback(); echo 'Отменено', "\n";
}
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
Отменено
120

Связанные операции: mysqli_savepoint, mysqli_commit.

Оба входа к этой операции: mysqli_rollback, mysqli::rollback.

mysqli_autocommitУправлять автоматическим подтверждением на соединении.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_autocommit(mysqli $mysql, bool $enable): bool; mysqli::autocommit(bool $enable): bool

Управлять подтверждением группы запросов. autocommit(false) отключает автоматическое подтверждение каждого запроса. После группы требуется commit/rollback и осознанное восстановление режима.

Данные и действие: mysqli_autocommit
  1. $db->autocommit(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Управлять подтверждением группы запросовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->autocommit(false);
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$db->autocommit(true);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Управлять автоматическим подтверждением на соединении.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$enabletrue включает, false выключает.

true/false. Текущее состояние читается SELECT @@autocommit. Выключение требует явных commit/rollback; включение может подтвердить текущую транзакцию. Для одного ограниченного действия обычно понятнее begin_transaction, чем менять долговременный режим соединения.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. autocommit false меняет политику → SQL остаётся в транзакции → commit/rollback определяет итог → Режим возвращается осознанно.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Режим относится ко всему соединению. После завершения задания верните ожидаемое состояние, особенно если соединение живёт в worker или пуле.

Ручное завершение при выключенном autocommitПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->autocommit(false);
try {
    $db->query('UPDATE course_products SET price = 999 WHERE id = 1');
    $db->rollback();
} finally { $db->autocommit(true); }
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Включение autocommit при незавершённой транзакции может её подтвердить. Поэтому нельзя использовать autocommit(true) вместо rollback в аварийном пути.

Проверить состояние через серверную переменнуюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_autocommit($db, false);
echo $db->query('SELECT @@autocommit')->fetch_column(), "\n";
mysqli_autocommit($db, true);
echo $db->query('SELECT @@autocommit')->fetch_column(), "\n";
Ожидаемый результат
0
1

Связанные операции: mysqli_begin_transaction, mysqli_commit, mysqli_rollback.

Оба входа к этой операции: mysqli_autocommit, mysqli::autocommit.

mysqli::autocommitУправлять автоматическим подтверждением на соединении.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_autocommit(mysqli $mysql, bool $enable): bool; mysqli::autocommit(bool $enable): bool

Управлять подтверждением группы запросов. autocommit(false) отключает автоматическое подтверждение каждого запроса. После группы требуется commit/rollback и осознанное восстановление режима.

Данные и действие: mysqli::autocommit
  1. $db->autocommit(...)
  2. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
  3. После выполнения: Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Управлять подтверждением группы запросовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->autocommit(false);
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->commit();
$db->autocommit(true);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Таблица примера InnoDB. Некоторые DDL вызывают неявный commit; нетранзакционные таблицы не получают свойства InnoDB. В приложении оборачивайте группу в try/catch и rollback при отказе, повторяйте транзакцию целиком при выбранной политике deadlock.

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

Управлять автоматическим подтверждением на соединении.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$enabletrue включает, false выключает.

true/false. Текущее состояние читается SELECT @@autocommit. Выключение требует явных commit/rollback; включение может подтвердить текущую транзакцию. Для одного ограниченного действия обычно понятнее begin_transaction, чем менять долговременный режим соединения.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. autocommit false меняет политику → SQL остаётся в транзакции → commit/rollback определяет итог → Режим возвращается осознанно.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Режим относится ко всему соединению. После завершения задания верните ожидаемое состояние, особенно если соединение живёт в worker или пуле.

Ручное завершение при выключенном autocommitПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->autocommit(false);
try {
    $db->query('UPDATE course_products SET price = 999 WHERE id = 1');
    $db->rollback();
} finally { $db->autocommit(true); }
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Включение autocommit при незавершённой транзакции может её подтвердить. Поэтому нельзя использовать autocommit(true) вместо rollback в аварийном пути.

Проверить состояние через серверную переменнуюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
mysqli_autocommit($db, false);
echo $db->query('SELECT @@autocommit')->fetch_column(), "\n";
mysqli_autocommit($db, true);
echo $db->query('SELECT @@autocommit')->fetch_column(), "\n";
Ожидаемый результат
0
1

Связанные операции: mysqli_begin_transaction, mysqli_commit, mysqli_rollback.

Оба входа к этой операции: mysqli_autocommit, mysqli::autocommit.

mysqli_savepointПоставить точку возврата внутри текущей транзакции.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_savepoint(mysqli $mysql, string $name): bool; mysqli::savepoint(string $name): bool

Сохранить резерв товара и отменить только дополнительную правку. SAVEPOINT отмечает промежуточное состояние текущей транзакции. ROLLBACK TO возвращает к нему, RELEASE удаляет отметку, но не подтверждает всю транзакцию.

Данные и действие: mysqli_savepoint
  1. $db->savepoint('extra')
  2. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
  3. После выполнения: Молоток — 6 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить резерв товара и отменить только дополнительную правкуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->savepoint('extra');
$db->query('UPDATE products SET stock = 0 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT extra');
$db->release_savepoint('extra');
$db->commit();
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 6 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Имя отметки здесь постоянное и доверенное; параметр SQL для идентификатора не подходит. RELEASE не отменяет изменений и не делает их независимыми от последующего rollback всей транзакции.

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

Поставить точку возврата внутри текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$nameДоверенный SQL-идентификатор точки; используйте фиксированные простые имена.

true/false. Соответствует SAVEPOINT. Повторное имя заменяет предыдущую точку того же имени. Для возврата — SQL ROLLBACK TO SAVEPOINT; rollback(name: ...) этой операции не делает. Общие commit/rollback заканчивают жизнь точек.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Транзакция сделала первый шаг → savepoint запомнил границу → Необязательный шаг может откатиться до неё.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первое изменение осталось, второе отменилось. Savepoint — точка внутри текущей транзакции, не отдельная вложенная транзакция с самостоятельным commit.

Отменить только необязательную часть измененияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
$db->savepoint('optional_price');
$db->query('UPDATE course_products SET price = 999 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT optional_price');
$db->release_savepoint('optional_price');
$db->commit();
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
680

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. RELEASE не сохраняет изменения: общий rollback всё ещё отменяет их. Имена точек фиксирует программа, не ввод посетителя.

Убрать ненужную точку без подтверждения всей транзакцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_savepoint($db, 'price_step');
$db->query('UPDATE course_products SET price = 999 WHERE id = 1');
mysqli_release_savepoint($db, 'price_step');
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Связанные операции: mysqli_release_savepoint, mysqli_rollback.

Оба входа к этой операции: mysqli_savepoint, mysqli::savepoint.

mysqli::savepointПоставить точку возврата внутри текущей транзакции.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_savepoint(mysqli $mysql, string $name): bool; mysqli::savepoint(string $name): bool

Сохранить резерв товара и отменить только дополнительную правку. SAVEPOINT отмечает промежуточное состояние текущей транзакции. ROLLBACK TO возвращает к нему, RELEASE удаляет отметку, но не подтверждает всю транзакцию.

Данные и действие: mysqli::savepoint
  1. $db->savepoint('extra')
  2. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
  3. После выполнения: Молоток — 6 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить резерв товара и отменить только дополнительную правкуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->savepoint('extra');
$db->query('UPDATE products SET stock = 0 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT extra');
$db->release_savepoint('extra');
$db->commit();
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 6 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Имя отметки здесь постоянное и доверенное; параметр SQL для идентификатора не подходит. RELEASE не отменяет изменений и не делает их независимыми от последующего rollback всей транзакции.

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

Поставить точку возврата внутри текущей транзакции.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$nameДоверенный SQL-идентификатор точки; используйте фиксированные простые имена.

true/false. Соответствует SAVEPOINT. Повторное имя заменяет предыдущую точку того же имени. Для возврата — SQL ROLLBACK TO SAVEPOINT; rollback(name: ...) этой операции не делает. Общие commit/rollback заканчивают жизнь точек.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Транзакция сделала первый шаг → savepoint запомнил границу → Необязательный шаг может откатиться до неё.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первое изменение осталось, второе отменилось. Savepoint — точка внутри текущей транзакции, не отдельная вложенная транзакция с самостоятельным commit.

Отменить только необязательную часть измененияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
$db->savepoint('optional_price');
$db->query('UPDATE course_products SET price = 999 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT optional_price');
$db->release_savepoint('optional_price');
$db->commit();
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
680

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. RELEASE не сохраняет изменения: общий rollback всё ещё отменяет их. Имена точек фиксирует программа, не ввод посетителя.

Убрать ненужную точку без подтверждения всей транзакцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_savepoint($db, 'price_step');
$db->query('UPDATE course_products SET price = 999 WHERE id = 1');
mysqli_release_savepoint($db, 'price_step');
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Связанные операции: mysqli_release_savepoint, mysqli_rollback.

Оба входа к этой операции: mysqli_savepoint, mysqli::savepoint.

mysqli_release_savepointУдалить точку возврата, которая больше не нужна.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_release_savepoint(mysqli $mysql, string $name): bool; mysqli::release_savepoint(string $name): bool

Сохранить резерв товара и отменить только дополнительную правку. SAVEPOINT отмечает промежуточное состояние текущей транзакции. ROLLBACK TO возвращает к нему, RELEASE удаляет отметку, но не подтверждает всю транзакцию.

Данные и действие: mysqli_release_savepoint
  1. $db->release_savepoint('extra')
  2. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
  3. После выполнения: Молоток — 6 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить резерв товара и отменить только дополнительную правкуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->savepoint('extra');
$db->query('UPDATE products SET stock = 0 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT extra');
$db->release_savepoint('extra');
$db->commit();
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 6 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Имя отметки здесь постоянное и доверенное; параметр SQL для идентификатора не подходит. RELEASE не отменяет изменений и не делает их независимыми от последующего rollback всей транзакции.

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

Удалить точку возврата, которая больше не нужна.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$nameСуществующее имя savepoint текущей транзакции.

true/false. RELEASE SAVEPOINT не выполняет ни commit, ни rollback. Отсутствующее имя — SQL-ошибка. После удаления частичный возврат к этой точке невозможен, но общий rollback сохраняется.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Программа завершила необязательный шаг → release убирает метку → Транзакция всё ещё ждёт commit/rollback.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. RELEASE не сохраняет изменения: общий rollback всё ещё отменяет их. Имена точек фиксирует программа, не ввод посетителя.

Убрать ненужную точку без подтверждения всей транзакцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_savepoint($db, 'price_step');
$db->query('UPDATE course_products SET price = 999 WHERE id = 1');
mysqli_release_savepoint($db, 'price_step');
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первое изменение осталось, второе отменилось. Savepoint — точка внутри текущей транзакции, не отдельная вложенная транзакция с самостоятельным commit.

Отменить только необязательную часть измененияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
$db->savepoint('optional_price');
$db->query('UPDATE course_products SET price = 999 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT optional_price');
$db->release_savepoint('optional_price');
$db->commit();
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
680

Связанные операции: mysqli_savepoint, mysqli_commit.

Оба входа к этой операции: mysqli_release_savepoint, mysqli::release_savepoint.

mysqli::release_savepointУдалить точку возврата, которая больше не нужна.

PHP 5.5+ · mysqli; mysqlnd для отмеченных операций

mysqli_release_savepoint(mysqli $mysql, string $name): bool; mysqli::release_savepoint(string $name): bool

Сохранить резерв товара и отменить только дополнительную правку. SAVEPOINT отмечает промежуточное состояние текущей транзакции. ROLLBACK TO возвращает к нему, RELEASE удаляет отметку, но не подтверждает всю транзакцию.

Данные и действие: mysqli::release_savepoint
  1. $db->release_savepoint('extra')
  2. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
  3. После выполнения: Молоток — 6 шт. · Перчатки — 15 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить резерв товара и отменить только дополнительную правкуПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->begin_transaction();
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
$db->savepoint('extra');
$db->query('UPDATE products SET stock = 0 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT extra');
$db->release_savepoint('extra');
$db->commit();
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 6 шт.
Перчатки — 15 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.
Перчатки15 шт.
Кисть0 шт.

Если требование изменится. Имя отметки здесь постоянное и доверенное; параметр SQL для идентификатора не подходит. RELEASE не отменяет изменений и не делает их независимыми от последующего rollback всей транзакции.

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

Удалить точку возврата, которая больше не нужна.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$nameСуществующее имя savepoint текущей транзакции.

true/false. RELEASE SAVEPOINT не выполняет ни commit, ни rollback. Отсутствующее имя — SQL-ошибка. После удаления частичный возврат к этой точке невозможен, но общий rollback сохраняется.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Программа завершила необязательный шаг → release убирает метку → Транзакция всё ещё ждёт commit/rollback.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. RELEASE не сохраняет изменения: общий rollback всё ещё отменяет их. Имена точек фиксирует программа, не ввод посетителя.

Убрать ненужную точку без подтверждения всей транзакцииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_begin_transaction($db);
mysqli_savepoint($db, 'price_step');
$db->query('UPDATE course_products SET price = 999 WHERE id = 1');
mysqli_release_savepoint($db, 'price_step');
mysqli_rollback($db);
echo $db->query('SELECT price FROM course_products WHERE id = 1')->fetch_column(), "\n";
Ожидаемый результат
120

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Первое изменение осталось, второе отменилось. Savepoint — точка внутри текущей транзакции, не отдельная вложенная транзакция с самостоятельным commit.

Отменить только необязательную часть измененияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->begin_transaction();
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
$db->savepoint('optional_price');
$db->query('UPDATE course_products SET price = 999 WHERE id = 2');
$db->query('ROLLBACK TO SAVEPOINT optional_price');
$db->release_savepoint('optional_price');
$db->commit();
echo $db->query('SELECT SUM(price) FROM course_products')->fetch_column(), "\n";
Ожидаемый результат
680

Связанные операции: mysqli_savepoint, mysqli_commit.

Оба входа к этой операции: mysqli_release_savepoint, mysqli::release_savepoint.

mysqli_reportЗадать, как MySQLi сообщает об отказе SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_report(int $flags): true; mysqli_driver::$report_mode: int

Дать приложению единый путь обработки отказа. Режим включает исключения mysqli_sql_exception. try содержит запрос; catch получает отказ, чтобы показать человеку понятное сообщение и сохранить технические сведения отдельно.

Данные и действие: mysqli_report
  1. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
  2. catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.
  3. После выполнения: Этот номер товара уже занят · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Дать приложению единый путь обработки отказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
try {
    $db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
} catch (mysqli_sql_exception $error) {
    echo "Этот номер товара уже занят\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Этот номер товара уже занят
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Учебный catch знает единственную намеренно вызванную ошибку. В рабочем коде отделяйте конфликт уникальности от потери соединения и других причин; не называйте любой отказ дубликатом. Режим задаётся для драйвера, а не только одного объекта.

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

Задать, как MySQLi сообщает об отказе SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsMYSQLI_REPORT_OFF; ERROR — сообщение ошибки; STRICT вместе с ERROR — mysqli_sql_exception; INDEX — запросы без/с плохим индексом; ALL — все признаки.

Всегда true при допустимом вызове. Default с 8.1 ERROR|STRICT, ранее OFF. INDEX/ALL могут сообщать и о корректном, но неоптимальном запросе; не включайте их неожиданно в прикладной обработчик. Режим общий для MySQLi, а не персональный для одного $db; изменение error_reporting PHP не заменяет эту настройку.

Путь данных. Политика задаётся до подключения → Отказ превращается в исключение → catch выбирает понятный ответ.

Как читать этот вариант. С PHP 8.1 это default, но явная настройка делает зависимость проекта заметной. Соединение не открывается.

Включить явную политику исключенийСамостоятельный пример
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$driver = new mysqli_driver();
var_dump($driver->report_mode === (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT));
Ожидаемый результат
bool(true)

Как читать этот вариант. mysqli_driver — monostate: экземпляров много, настройка общая внутри PHP-контекста. Библиотека не должна молча отключать ошибки соседнего кода.

Два объекта настройки видят одно состояниеСамостоятельный пример
<?php
$first = new mysqli_driver();
$second = new mysqli_driver();
$previous = $first->report_mode;
$first->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
var_dump($first->report_mode === $second->report_mode);
$first->report_mode = $previous;
Ожидаемый результат
bool(true)

Связанные операции: mysqli_sql_exception::getSqlState, mysqli_errno.

Оба входа к этой операции: mysqli_report, mysqli_driver::$report_mode.

mysqli_driver::$report_modeЗадать, как MySQLi сообщает об отказе SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_report(int $flags): true; mysqli_driver::$report_mode: int

Дать приложению единый путь обработки отказа. Режим включает исключения mysqli_sql_exception. try содержит запрос; catch получает отказ, чтобы показать человеку понятное сообщение и сохранить технические сведения отдельно.

Данные и действие: mysqli_driver::$report_mode
  1. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
  2. catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.
  3. После выполнения: Этот номер товара уже занят · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Дать приложению единый путь обработки отказаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
try {
    $db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
} catch (mysqli_sql_exception $error) {
    echo "Этот номер товара уже занят\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Этот номер товара уже занят
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Учебный catch знает единственную намеренно вызванную ошибку. В рабочем коде отделяйте конфликт уникальности от потери соединения и других причин; не называйте любой отказ дубликатом. Режим задаётся для драйвера, а не только одного объекта.

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

Задать, как MySQLi сообщает об отказе SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsMYSQLI_REPORT_OFF; ERROR — сообщение ошибки; STRICT вместе с ERROR — mysqli_sql_exception; INDEX — запросы без/с плохим индексом; ALL — все признаки.

Всегда true при допустимом вызове. Default с 8.1 ERROR|STRICT, ранее OFF. INDEX/ALL могут сообщать и о корректном, но неоптимальном запросе; не включайте их неожиданно в прикладной обработчик. Режим общий для MySQLi, а не персональный для одного $db; изменение error_reporting PHP не заменяет эту настройку.

Путь данных. Политика задаётся до подключения → Отказ превращается в исключение → catch выбирает понятный ответ.

Как читать этот вариант. С PHP 8.1 это default, но явная настройка делает зависимость проекта заметной. Соединение не открывается.

Включить явную политику исключенийСамостоятельный пример
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$driver = new mysqli_driver();
var_dump($driver->report_mode === (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT));
Ожидаемый результат
bool(true)

Как читать этот вариант. mysqli_driver — monostate: экземпляров много, настройка общая внутри PHP-контекста. Библиотека не должна молча отключать ошибки соседнего кода.

Два объекта настройки видят одно состояниеСамостоятельный пример
<?php
$first = new mysqli_driver();
$second = new mysqli_driver();
$previous = $first->report_mode;
$first->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
var_dump($first->report_mode === $second->report_mode);
$first->report_mode = $previous;
Ожидаемый результат
bool(true)

Связанные операции: mysqli_sql_exception::getSqlState, mysqli_errno.

Оба входа к этой операции: mysqli_report, mysqli_driver::$report_mode.

mysqli_connect_errnoПрочитать диагностику последней попытки подключения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_connect_errno(): int; readonly mysqli::$connect_errno

Показать доступный каталог или понятный отказ подключения. connect_errno/connect_error относятся к установлению соединения. Обычные errno/error относятся к последующим запросам и не заменяют эти сведения.

Данные и действие: mysqli_connect_errno
  1. $db->connect_errno
  2. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
  3. После выполнения: При правильном config.php: Молоток — 8 шт. · При отказе подключения: Каталог временно недоступен

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать доступный каталог или понятный отказ подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
if ($db->connect_errno !== 0) {
    $diagnostic = $db->connect_errno;
    if (file_put_contents(__DIR__ . '/connection-error.json', json_encode($diagnostic, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать диагностику'); }
    echo "Каталог временно недоступен\n";
    exit;
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
При правильном config.php: Молоток — 8 шт.
При отказе подключения: Каталог временно недоступен

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
При правильном config.php: Молоток8 шт.

Если требование изменится. Отказ может означать неверный адрес, пароль, права или отсутствие сервера. Для HTTP нужен статус 503 и серверное логирование с отключённым display_errors; пример предназначен для терминала. Синтаксическая проверка не моделирует сетевой отказ.

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

Прочитать диагностику последней попытки подключения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

0 означает отсутствие ошибки. Число нельзя путать с errno последней SQL-команды. Значение относится к последнему connect независимо от экземпляра, через который оно прочитано. При стандартном строгом режиме первичным каналом будет исключение; сведения не показывают посетителю вместе с реквизитами подключения.

Путь данных. Попытка подключения → Connect-состояние обновилось → Код получает безопасный статус и внутреннюю диагностику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекст отказа: в отдельном учебном сервере нет такой учётной записи. Никакой попытки подключения при проверке этого пособия не выполнялось. OFF выбран только для изучения legacy API; современный вариант ловит mysqli_sql_exception.

Получить подробности неудачной попытки подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$db = new mysqli('127.0.0.1', 'invalid_course_user', 'invalid_course_password', 'course_demo', 3306);
if ($db->connect_errno !== 0) {
    echo 'Подключение не выполнено', "\n";
    echo $db->connect_error !== null ? 'Есть диагностика' : 'Нет диагностики';
    echo "\n";
}
Ожидаемый результат
Подключение не выполнено
Есть диагностика

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Эти функции без аргументов описывают последнюю попытку соединения в контексте MySQLi, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.

Успешное соединение сбрасывает connect errorПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_connect_errno(), "\n";
var_dump(mysqli_connect_error());
Ожидаемый результат
0
NULL

Связанные операции: mysqli_report, mysqli_connect.

Оба входа к этой операции: mysqli_connect_errno, mysqli::$connect_errno.

mysqli::$connect_errnoПрочитать диагностику последней попытки подключения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_connect_errno(): int; readonly mysqli::$connect_errno

Показать доступный каталог или понятный отказ подключения. connect_errno/connect_error относятся к установлению соединения. Обычные errno/error относятся к последующим запросам и не заменяют эти сведения.

Данные и действие: mysqli::$connect_errno
  1. $db->connect_errno
  2. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
  3. После выполнения: При правильном config.php: Молоток — 8 шт. · При отказе подключения: Каталог временно недоступен

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать доступный каталог или понятный отказ подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
if ($db->connect_errno !== 0) {
    $diagnostic = $db->connect_errno;
    if (file_put_contents(__DIR__ . '/connection-error.json', json_encode($diagnostic, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать диагностику'); }
    echo "Каталог временно недоступен\n";
    exit;
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
При правильном config.php: Молоток — 8 шт.
При отказе подключения: Каталог временно недоступен

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
При правильном config.php: Молоток8 шт.

Если требование изменится. Отказ может означать неверный адрес, пароль, права или отсутствие сервера. Для HTTP нужен статус 503 и серверное логирование с отключённым display_errors; пример предназначен для терминала. Синтаксическая проверка не моделирует сетевой отказ.

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

Прочитать диагностику последней попытки подключения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

0 означает отсутствие ошибки. Число нельзя путать с errno последней SQL-команды. Значение относится к последнему connect независимо от экземпляра, через который оно прочитано. При стандартном строгом режиме первичным каналом будет исключение; сведения не показывают посетителю вместе с реквизитами подключения.

Путь данных. Попытка подключения → Connect-состояние обновилось → Код получает безопасный статус и внутреннюю диагностику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекст отказа: в отдельном учебном сервере нет такой учётной записи. Никакой попытки подключения при проверке этого пособия не выполнялось. OFF выбран только для изучения legacy API; современный вариант ловит mysqli_sql_exception.

Получить подробности неудачной попытки подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$db = new mysqli('127.0.0.1', 'invalid_course_user', 'invalid_course_password', 'course_demo', 3306);
if ($db->connect_errno !== 0) {
    echo 'Подключение не выполнено', "\n";
    echo $db->connect_error !== null ? 'Есть диагностика' : 'Нет диагностики';
    echo "\n";
}
Ожидаемый результат
Подключение не выполнено
Есть диагностика

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Эти функции без аргументов описывают последнюю попытку соединения в контексте MySQLi, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.

Успешное соединение сбрасывает connect errorПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_connect_errno(), "\n";
var_dump(mysqli_connect_error());
Ожидаемый результат
0
NULL

Связанные операции: mysqli_report, mysqli_connect.

Оба входа к этой операции: mysqli_connect_errno, mysqli::$connect_errno.

mysqli_connect_errorПрочитать диагностику последней попытки подключения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_connect_error(): ?string; readonly mysqli::$connect_error

Показать доступный каталог или понятный отказ подключения. connect_errno/connect_error относятся к установлению соединения. Обычные errno/error относятся к последующим запросам и не заменяют эти сведения.

Данные и действие: mysqli_connect_error
  1. $db->connect_error
  2. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
  3. После выполнения: При правильном config.php: Молоток — 8 шт. · При отказе подключения: Каталог временно недоступен

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать доступный каталог или понятный отказ подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
if ($db->connect_errno !== 0) {
    $diagnostic = $db->connect_error;
    if (file_put_contents(__DIR__ . '/connection-error.json', json_encode($diagnostic, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать диагностику'); }
    echo "Каталог временно недоступен\n";
    exit;
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
При правильном config.php: Молоток — 8 шт.
При отказе подключения: Каталог временно недоступен

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
При правильном config.php: Молоток8 шт.

Если требование изменится. Отказ может означать неверный адрес, пароль, права или отсутствие сервера. Для HTTP нужен статус 503 и серверное логирование с отключённым display_errors; пример предназначен для терминала. Синтаксическая проверка не моделирует сетевой отказ.

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

Прочитать диагностику последней попытки подключения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Строка при отказе, null при отсутствии. В отличие от error успешного SQL это null, не пустая строка. Значение относится к последнему connect независимо от экземпляра, через который оно прочитано. При стандартном строгом режиме первичным каналом будет исключение; сведения не показывают посетителю вместе с реквизитами подключения.

Путь данных. Попытка подключения → Connect-состояние обновилось → Код получает безопасный статус и внутреннюю диагностику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекст отказа: в отдельном учебном сервере нет такой учётной записи. Никакой попытки подключения при проверке этого пособия не выполнялось. OFF выбран только для изучения legacy API; современный вариант ловит mysqli_sql_exception.

Получить подробности неудачной попытки подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$db = new mysqli('127.0.0.1', 'invalid_course_user', 'invalid_course_password', 'course_demo', 3306);
if ($db->connect_errno !== 0) {
    echo 'Подключение не выполнено', "\n";
    echo $db->connect_error !== null ? 'Есть диагностика' : 'Нет диагностики';
    echo "\n";
}
Ожидаемый результат
Подключение не выполнено
Есть диагностика

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Эти функции без аргументов описывают последнюю попытку соединения в контексте MySQLi, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.

Успешное соединение сбрасывает connect errorПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_connect_errno(), "\n";
var_dump(mysqli_connect_error());
Ожидаемый результат
0
NULL

Связанные операции: mysqli_report, mysqli_connect.

Оба входа к этой операции: mysqli_connect_error, mysqli::$connect_error.

mysqli::$connect_errorПрочитать диагностику последней попытки подключения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_connect_error(): ?string; readonly mysqli::$connect_error

Показать доступный каталог или понятный отказ подключения. connect_errno/connect_error относятся к установлению соединения. Обычные errno/error относятся к последующим запросам и не заменяют эти сведения.

Данные и действие: mysqli::$connect_error
  1. $db->connect_error
  2. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
  3. После выполнения: При правильном config.php: Молоток — 8 шт. · При отказе подключения: Каталог временно недоступен

В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.

Запись в этом примереКак читать
require __DIR__ . ...Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные.
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Показать доступный каталог или понятный отказ подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$config = require __DIR__ . '/config.php';
$db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
if ($db->connect_errno !== 0) {
    $diagnostic = $db->connect_error;
    if (file_put_contents(__DIR__ . '/connection-error.json', json_encode($diagnostic, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать диагностику'); }
    echo "Каталог временно недоступен\n";
    exit;
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db->set_charset('utf8mb4');
require __DIR__ . '/seed.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
При правильном config.php: Молоток — 8 шт.
При отказе подключения: Каталог временно недоступен

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
При правильном config.php: Молоток8 шт.

Если требование изменится. Отказ может означать неверный адрес, пароль, права или отсутствие сервера. Для HTTP нужен статус 503 и серверное логирование с отключённым display_errors; пример предназначен для терминала. Синтаксическая проверка не моделирует сетевой отказ.

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

Прочитать диагностику последней попытки подключения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Строка при отказе, null при отсутствии. В отличие от error успешного SQL это null, не пустая строка. Значение относится к последнему connect независимо от экземпляра, через который оно прочитано. При стандартном строгом режиме первичным каналом будет исключение; сведения не показывают посетителю вместе с реквизитами подключения.

Путь данных. Попытка подключения → Connect-состояние обновилось → Код получает безопасный статус и внутреннюю диагностику.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекст отказа: в отдельном учебном сервере нет такой учётной записи. Никакой попытки подключения при проверке этого пособия не выполнялось. OFF выбран только для изучения legacy API; современный вариант ловит mysqli_sql_exception.

Получить подробности неудачной попытки подключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_OFF);
$db = new mysqli('127.0.0.1', 'invalid_course_user', 'invalid_course_password', 'course_demo', 3306);
if ($db->connect_errno !== 0) {
    echo 'Подключение не выполнено', "\n";
    echo $db->connect_error !== null ? 'Есть диагностика' : 'Нет диагностики';
    echo "\n";
}
Ожидаемый результат
Подключение не выполнено
Есть диагностика

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Эти функции без аргументов описывают последнюю попытку соединения в контексте MySQLi, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.

Успешное соединение сбрасывает connect errorПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_connect_errno(), "\n";
var_dump(mysqli_connect_error());
Ожидаемый результат
0
NULL

Связанные операции: mysqli_report, mysqli_connect.

Оба входа к этой операции: mysqli_connect_error, mysqli::$connect_error.

mysqli_errnoЧисловой код последней ошибки соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_errno(mysqli $mysql): int; readonly mysqli::$errno

Разобрать отказ вставки, сохранив исходный товар. Числовой код ошибки MySQL подходит для выбора конкретной ветки обработки.

Данные и действие: mysqli_errno
  1. $db->errno
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->errno;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->errno === 1062) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Числовой код последней ошибки соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

0 — ошибок нет. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_errno, mysqli::$errno.

mysqli::$errnoЧисловой код последней ошибки соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_errno(mysqli $mysql): int; readonly mysqli::$errno

Разобрать отказ вставки, сохранив исходный товар. Числовой код ошибки MySQL подходит для выбора конкретной ветки обработки.

Данные и действие: mysqli::$errno
  1. $db->errno
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->errno;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->errno === 1062) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Числовой код последней ошибки соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

0 — ошибок нет. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_errno, mysqli::$errno.

mysqli_errorТекст последней ошибки SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_error(mysqli $mysql): string; readonly mysqli::$error

Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.

Данные и действие: mysqli_error
  1. $db->error
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->error;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->error !== '') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Текст последней ошибки SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

Пустая строка при отсутствии. Не сравнивайте бизнес-ветки по английскому тексту. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_error, mysqli::$error.

mysqli::$errorТекст последней ошибки SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_error(mysqli $mysql): string; readonly mysqli::$error

Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.

Данные и действие: mysqli::$error
  1. $db->error
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->error;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->error !== '') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Текст последней ошибки SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

Пустая строка при отсутствии. Не сравнивайте бизнес-ветки по английскому тексту. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_error, mysqli::$error.

mysqli_error_listСтруктурированный список ошибок последней команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_error_list(mysqli $mysql): array; readonly mysqli::$error_list

Разобрать отказ вставки, сохранив исходный товар. Список диагностик содержит код, SQLSTATE и текст; это массив сообщений, а не строки SELECT.

Данные и действие: mysqli_error_list
  1. $db->error_list
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->error_list;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if (count($db->error_list) > 0) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Структурированный список ошибок последней команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

Каждый элемент содержит errno, error, sqlstate; [] при отсутствии. PHP 5.4+. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_error_list, mysqli::$error_list.

mysqli::$error_listСтруктурированный список ошибок последней команды.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_error_list(mysqli $mysql): array; readonly mysqli::$error_list

Разобрать отказ вставки, сохранив исходный товар. Список диагностик содержит код, SQLSTATE и текст; это массив сообщений, а не строки SELECT.

Данные и действие: mysqli::$error_list
  1. $db->error_list
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->error_list;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if (count($db->error_list) > 0) { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Структурированный список ошибок последней команды.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

Каждый элемент содержит errno, error, sqlstate; [] при отсутствии. PHP 5.4+. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_error_list, mysqli::$error_list.

mysqli_sqlstateПятисимвольная категория SQL-ошибки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_sqlstate(mysqli $mysql): string; readonly mysqli::$sqlstate

Разобрать отказ вставки, сохранив исходный товар. SQLSTATE — пятисимвольная категория отказа. 23000 в этом случае означает нарушение ограничения целостности.

Данные и действие: mysqli_sqlstate
  1. $db->sqlstate
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->sqlstate;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->sqlstate === '23000') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Пятисимвольная категория SQL-ошибки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

00000 — успех; HY000 — общая/ещё не сопоставленная категория MySQL. Конкретный errno уточняет причину. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_sqlstate, mysqli::$sqlstate.

mysqli::$sqlstateПятисимвольная категория SQL-ошибки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_sqlstate(mysqli $mysql): string; readonly mysqli::$sqlstate

Разобрать отказ вставки, сохранив исходный товар. SQLSTATE — пятисимвольная категория отказа. 23000 в этом случае означает нарушение ограничения целостности.

Данные и действие: mysqli::$sqlstate
  1. $db->sqlstate
  2. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
  3. После выполнения: Вставка отклонена; сведения в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Разобрать отказ вставки, сохранив исходный товарПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
mysqli_report(MYSQLI_REPORT_OFF);
$db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
$details = $db->sqlstate;
if (file_put_contents(__DIR__ . '/diagnostic.json', json_encode($details, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR)) === false) { throw new RuntimeException('Не удалось записать diagnostic.json'); }
if ($db->sqlstate === '23000') { echo "Вставка отклонена; сведения в diagnostic.json\n"; }
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Вставка отклонена; сведения в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Считывайте диагностику до следующего запроса: он меняет состояние ошибки. Проверяйте и результат записи файла в приложении; каталог журнала должен быть непубличным. Для обычного кода режим исключений даёт более короткий единый путь отказа.

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

Пятисимвольная категория SQL-ошибки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после операции, которая может отказать.

00000 — успех; HY000 — общая/ещё не сопоставленная категория MySQL. Конкретный errno уточняет причину. Это состояние последней операции, а не вся история. Для отдельного prepared statement используйте его диагностику. Не передавайте сообщение SQL в открытую страницу: оно может раскрыть таблицы, параметры и внутреннее устройство.

Путь данных. SQL выполнился или отказал → Драйвер сохранил сведения → Код снимает их до нового вызова.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это специально неверный учебный SQL. Код/SQLSTATE устойчивее текста, но не заменяют понимание причины. В HTTP-ответе используют собственное сообщение и ID события, а подробности держат в закрытом журнале.

Снять SQL-ошибку до следующего запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $db->errno, ':', $db->sqlstate, "\n";
    echo $db->error !== '' ? 'Есть описание' : 'Нет описания';
    echo "\n";
    echo count($db->error_list), "\n";
}
Ожидаемый результат
1064:42000
Есть описание
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.

Прочитать состояние после корректного SQLПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('SELECT 42')->free();
echo mysqli_errno($db), ':', mysqli_sqlstate($db), "\n";
var_dump(mysqli_error($db), mysqli_error_list($db));
Ожидаемый результат
0:00000
string(0) ""
array(0) {
}

Связанные операции: mysqli_stmt_errno, mysqli_report.

Оба входа к этой операции: mysqli_sqlstate, mysqli::$sqlstate.

mysqli_sql_exception::getSqlStateПолучить SQLSTATE из пойманного исключения базы.

PHP 8.1.2+ · mysqli; mysqlnd для отмеченных операций

mysqli_sql_exception::getSqlState(): string

Отличить конфликт ограничения от других отказов. Исключение хранит SQLSTATE в момент отказа; последующие запросы не заменят эти сведения в уже созданном объекте.

Данные и действие: mysqli_sql_exception::getSqlState
  1. $error->getSqlState()
  2. Проверены и категория, и код конкретного конфликта. Неизвестный отказ снова передаётся внешнему обработчику, а ожидаемый превращается в понятное сообщение.
  3. После выполнения: Номер занят: выберите другой · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
try / catch / finallytry содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Отличить конфликт ограничения от других отказовПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
try {
    $db->query("INSERT INTO products VALUES (1, 'Дубликат', 1)");
} catch (mysqli_sql_exception $error) {
    if ($error->getSqlState() !== '23000' || $error->getCode() !== 1062) { throw $error; }
    echo "Номер занят: выберите другой\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Номер занят: выберите другой
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Проверены и категория, и код конкретного конфликта. Неизвестный отказ снова передаётся внешнему обработчику, а ожидаемый превращается в понятное сообщение.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. SQLSTATE 23000 охватывает несколько ограничений; без дополнительного контекста нельзя всегда называть его дубликатом. Пароль, DSN и внутренний SQL не выводят посетителю.

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

Получить SQLSTATE из пойманного исключения базы.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

PHP 8.1.2+: строка из пяти символов; HY000 используется для общей/несопоставленной ошибки. Это не целое число getCode. Класс final extends RuntimeException, sqlstate protected; читайте через метод. Унаследованы getMessage/getCode/getFile/getLine/getTrace/getTraceAsString/getPrevious и __toString. Стек и строковое представление предназначены внутренней диагностике.

Путь данных. SQL-отказ создал исключение → catch получает объект → getSqlState определяет категорию → Приложение выбирает обработку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. getCode — числовой MySQL-код, getSqlState — пятисимвольная категория. Исключение хранит сведения даже после того, как состояние соединения изменится.

Разделить код сервера и SQLSTATE исключенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
    echo $error->getCode(), ':', $error->getSqlState(), "\n";
}
Ожидаемый результат
1064:42000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Внутренняя причина передана третьим параметром previous. Внешнее сообщение понятнее пользователю; лог может связать его с исходным SQL-отказом.

Сохранить причину в исключении уровня приложенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    try { $db->query('SELECT FROM'); } catch (mysqli_sql_exception $error) {
        throw new RuntimeException('Не удалось подготовить отчёт', 0, $error);
    }
} catch (RuntimeException $error) {
    $cause = $error->getPrevious();
    echo $error->getMessage(), "\n";
    if ($cause instanceof mysqli_sql_exception) { echo $cause->getSqlState(), "\n"; }
}
Ожидаемый результат
Не удалось подготовить отчёт
42000

Связанные операции: mysqli_report, mysqli_sqlstate.

mysqli_get_warningsПолучить предупреждения MySQL, даже когда запрос формально успешен.

PHP 5.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_get_warnings(mysqli $mysql): mysqli_warning|false; mysqli::get_warnings(): mysqli_warning|false

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_get_warnings
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Получить предупреждения MySQL, даже когда запрос формально успешен.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после обработки результата интересующего запроса.

mysqli_warning или false при отсутствии. Список односвязный: next перезаписывает свойства текущего объекта; перемотки/повторного извлечения списка нет. Для ограниченного результата рекомендуется SHOW WARNINGS LIMIT N. Не путайте серверное предупреждение преобразования с PHP warning о неверном аргументе.

Путь данных. SQL успешно вернул данные с предупреждениями → get_warnings получает первое → next перемещает к следующему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная документация рекомендует SHOW WARNINGS с LIMIT для сообщений. Получайте их сразу, пока другой SQL не изменил состояние. get_warnings и SHOW WARNINGS — две альтернативы, не два обязательных шага.

Получить ограниченный список SHOW WARNINGSПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
echo mysqli_warning_count($db), "\n";
$rows = $db->query('SHOW WARNINGS LIMIT 10')->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) { echo $row['Level'], ':', $row['Code'], "\n"; }
Ожидаемый результат
1
Warning:1292

Связанные операции: mysqli_warning::next, mysqli_warning_count, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_get_warnings, mysqli::get_warnings.

mysqli::get_warningsПолучить предупреждения MySQL, даже когда запрос формально успешен.

PHP 5.1+ · mysqli; mysqlnd для отмеченных операций

mysqli_get_warnings(mysqli $mysql): mysqli_warning|false; mysqli::get_warnings(): mysqli_warning|false

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli::get_warnings
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Получить предупреждения MySQL, даже когда запрос формально успешен.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после обработки результата интересующего запроса.

mysqli_warning или false при отсутствии. Список односвязный: next перезаписывает свойства текущего объекта; перемотки/повторного извлечения списка нет. Для ограниченного результата рекомендуется SHOW WARNINGS LIMIT N. Не путайте серверное предупреждение преобразования с PHP warning о неверном аргументе.

Путь данных. SQL успешно вернул данные с предупреждениями → get_warnings получает первое → next перемещает к следующему.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная документация рекомендует SHOW WARNINGS с LIMIT для сообщений. Получайте их сразу, пока другой SQL не изменил состояние. get_warnings и SHOW WARNINGS — две альтернативы, не два обязательных шага.

Получить ограниченный список SHOW WARNINGSПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
echo mysqli_warning_count($db), "\n";
$rows = $db->query('SHOW WARNINGS LIMIT 10')->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) { echo $row['Level'], ':', $row['Code'], "\n"; }
Ожидаемый результат
1
Warning:1292

Связанные операции: mysqli_warning::next, mysqli_warning_count, mysqli_stmt_get_warnings.

Оба входа к этой операции: mysqli_get_warnings, mysqli::get_warnings.

mysqli_warning_countУзнать, появились ли предупреждения у последнего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning_count(mysqli $mysql): int; readonly mysqli::$warning_count

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_warning_count
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
if ($db->warning_count === 0) { throw new RuntimeException('Ожидалось предупреждение преобразования'); }
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Узнать, появились ли предупреждения у последнего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после текущего SQL.

Количество предупреждений либо 0. Сам счётчик не содержит сообщения; используйте SHOW WARNINGS или get_warnings. Необходим при импорте: успешный INSERT IGNORE может пропустить/изменить данные и сообщить об этом предупреждением.

Путь данных. Запрос завершился → warning_count показывает число → При ненулевом числе код изучает сообщения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная документация рекомендует SHOW WARNINGS с LIMIT для сообщений. Получайте их сразу, пока другой SQL не изменил состояние. get_warnings и SHOW WARNINGS — две альтернативы, не два обязательных шага.

Получить ограниченный список SHOW WARNINGSПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
echo mysqli_warning_count($db), "\n";
$rows = $db->query('SHOW WARNINGS LIMIT 10')->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) { echo $row['Level'], ':', $row['Code'], "\n"; }
Ожидаемый результат
1
Warning:1292

Связанные операции: mysqli_get_warnings.

Оба входа к этой операции: mysqli_warning_count, mysqli::$warning_count.

mysqli::$warning_countУзнать, появились ли предупреждения у последнего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning_count(mysqli $mysql): int; readonly mysqli::$warning_count

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli::$warning_count
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
if ($db->warning_count === 0) { throw new RuntimeException('Ожидалось предупреждение преобразования'); }
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Узнать, появились ли предупреждения у последнего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после текущего SQL.

Количество предупреждений либо 0. Сам счётчик не содержит сообщения; используйте SHOW WARNINGS или get_warnings. Необходим при импорте: успешный INSERT IGNORE может пропустить/изменить данные и сообщить об этом предупреждением.

Путь данных. Запрос завершился → warning_count показывает число → При ненулевом числе код изучает сообщения.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Официальная документация рекомендует SHOW WARNINGS с LIMIT для сообщений. Получайте их сразу, пока другой SQL не изменил состояние. get_warnings и SHOW WARNINGS — две альтернативы, не два обязательных шага.

Получить ограниченный список SHOW WARNINGSПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
echo mysqli_warning_count($db), "\n";
$rows = $db->query('SHOW WARNINGS LIMIT 10')->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) { echo $row['Level'], ':', $row['Code'], "\n"; }
Ожидаемый результат
1
Warning:1292

Связанные операции: mysqli_get_warnings.

Оба входа к этой операции: mysqli_warning_count, mysqli::$warning_count.

mysqli_warning::nextПрочитать следующее предупреждение уже полученного списка.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning::next(): bool

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_warning::next
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Прочитать следующее предупреждение уже полученного списка.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

true — поля message, sqlstate, errno обновлены; false — больше сообщений нет. Текущий объект меняется, поэтому сохранение одной и той же ссылки в массив не создаёт независимые снимки предупреждений. Первый элемент уже доступен до next: нужен do...while, а не предварительное пропускание первого.

Путь данных. Первое сообщение уже в объекте → Код сохраняет поля → next обновляет объект → false заканчивает обход.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Массив содержит значения, а не несколько ссылок на один изменяющийся warning.

Сохранить отдельные снимки предупрежденийПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
$items = []; $warning = mysqli_get_warnings($db);
if ($warning) {
    do { $items[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message]; } while ($warning->next());
}
echo count($items), ':', $items[0]['code'], "\n";
Ожидаемый результат
1:1292

Связанные операции: mysqli_get_warnings.

mysqli_warning::__constructПонять, откуда берётся объект предупреждения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

private mysqli_warning::__construct()

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент. Конструктор закрыт: объект получают от соединения или statement, а не через new mysqli_warning.

Данные и действие: mysqli_warning::__construct
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Понять, откуда берётся объект предупреждения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Конструктор закрыт; new mysqli_warning извне вызывает Error. Получайте объект через mysqli::get_warnings или mysqli_stmt::get_warnings. Это пример API, которое само создаёт корректное состояние объекта.

Путь данных. SQL породил предупреждение → API создаёт warning → Приложение только читает и проходит список.

Как читать этот вариант. Это безопасная демонстрация private-конструктора без базы: объект выдаёт только API get_warnings.

Убедиться, что warning не создаётся вручнуюСамостоятельный пример
<?php
try { new mysqli_warning(); } catch (Error $error) { echo 'Конструктор закрыт', "\n"; }
Ожидаемый результат
Конструктор закрыт

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Класс описывает сведения уже выполненного SQL. Для своего сообщения приложения создавайте собственный объект/массив, а не внутренний mysqli_warning.

Получить warning правильным способомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
$warning = $db->get_warnings();
var_dump($warning instanceof mysqli_warning);
Ожидаемый результат
bool(true)

Связанные операции: mysqli_get_warnings, mysqli_stmt_get_warnings.

mysqli_warning::$messageПрочитать message текущего предупреждения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning::$message: string

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_warning::$message
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Прочитать message текущего предупреждения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Текст серверного предупреждения; не выводите без HTML-экранирования и оценки чувствительных сведений. next меняет состояние объекта. Для сохранения истории копируйте поле в собственный массив.

Путь данных. Список имеет текущую позицию → Свойство содержит её значение → После next будет другое предупреждение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Класс описывает сведения уже выполненного SQL. Для своего сообщения приложения создавайте собственный объект/массив, а не внутренний mysqli_warning.

Получить warning правильным способомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
$warning = $db->get_warnings();
var_dump($warning instanceof mysqli_warning);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Связанные операции: mysqli_warning::next.

mysqli_warning::$sqlstateПрочитать sqlstate текущего предупреждения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning::$sqlstate: string

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_warning::$sqlstate
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Прочитать sqlstate текущего предупреждения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Пятисимвольная категория; в warnings часто HY000, поэтому errno уточняет событие. next меняет состояние объекта. Для сохранения истории копируйте поле в собственный массив.

Путь данных. Список имеет текущую позицию → Свойство содержит её значение → После next будет другое предупреждение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Класс описывает сведения уже выполненного SQL. Для своего сообщения приложения создавайте собственный объект/массив, а не внутренний mysqli_warning.

Получить warning правильным способомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
$warning = $db->get_warnings();
var_dump($warning instanceof mysqli_warning);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Связанные операции: mysqli_warning::next.

mysqli_warning::$errnoПрочитать errno текущего предупреждения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_warning::$errno: int

Сохранить причины неполного числового преобразования. SQL может завершиться с предупреждением. get_warnings возвращает первый элемент либо false; next переводит к следующему, а свойства описывают именно текущий элемент.

Данные и действие: mysqli_warning::$errno
  1. $db->get_warnings()
  2. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
  3. После выполнения: Преобразование требует проверки; причины в warnings.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить причины неполного числового преобразованияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query("SELECT CAST('12x' AS UNSIGNED)");
$warning = $db->get_warnings();
$messages = [];
if ($warning !== false) {
    do {
        $messages[] = ['code' => $warning->errno, 'state' => $warning->sqlstate, 'message' => $warning->message];
    } while ($warning->next());
}
if ($messages !== []) {
    $json = json_encode($messages, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    if (file_put_contents(__DIR__ . '/warnings.json', $json) === false) { throw new RuntimeException('Не удалось сохранить предупреждения'); }
    echo "Преобразование требует проверки; причины в warnings.json\n";
}
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Преобразование требует проверки; причины в warnings.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Предупреждения считывают до следующей SQL-команды. Это диагностический опыт; ввод пользователя проверяйте до CAST. Политика предупреждений зависит от типа команды и SQL mode: UPDATE/INSERT могут дать иной отказ.

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

Прочитать errno текущего предупреждения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Номер предупреждения MySQL, например 1292 при ошибочном преобразовании. next меняет состояние объекта. Для сохранения истории копируйте поле в собственный массив.

Путь данных. Список имеет текущую позицию → Свойство содержит её значение → После next будет другое предупреждение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Класс описывает сведения уже выполненного SQL. Для своего сообщения приложения создавайте собственный объект/массив, а не внутренний mysqli_warning.

Получить warning правильным способомПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED)")->free();
$warning = $db->get_warnings();
var_dump($warning instanceof mysqli_warning);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается поведение MySQL с предупреждениями преобразования. next меняет поля того же объекта: если нужен архив всех сообщений, сохраняйте значения в массив при каждом шаге.

Собрать два предупреждения преобразованияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query("SELECT CAST('bad' AS UNSIGNED), CAST('wrong' AS UNSIGNED)")->free();
echo $db->warning_count, "\n";
$warning = $db->get_warnings();
if ($warning) {
    do { echo $warning->errno, ':', $warning->sqlstate, "\n"; } while ($warning->next());
}
Ожидаемый результат
2
1292:HY000
1292:HY000

Связанные операции: mysqli_warning::next.

mysqli_affected_rowsПрочитать число строк, затронутых последним SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_affected_rows(mysqli $mysql): int|string; readonly mysqli::$affected_rows

Связать служебный результат команды с изменёнными товарами. Счётчик меняется после каждой команды. Условный UPDATE показывает успешное изменение, а SELECT подтверждает новый остаток; ноль не является универсальным признаком ошибки.

Данные и действие: mysqli_affected_rows
  1. mysqli_affected_rows($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Резерв принят · Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
echo $db->affected_rows === 1 ? "Резерв принят\n" : "Резерв не выполнен\n";
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Резерв принят
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать число строк, затронутых последним SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после INSERT/UPDATE/REPLACE/DELETE или буферизованного SELECT.

Больше нуля — затронутые/полученные строки, 0 — нет изменения/совпадений/запроса, −1 — отказ или небуферизованный SELECT. Число сверх PHP_INT_MAX возвращается строкой. Для SELECT похоже на num_rows, но удобнее читать сам результат. FOUND_ROWS меняет смысл UPDATE; REPLACE и ON DUPLICATE KEY UPDATE имеют свои правила счётчика. Снимайте значение до следующего SQL.

Путь данных. SQL выполнил действие → Соединение хранит счётчик → Код определяет, случилось ли полезное изменение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это обычное соединение без FOUND_ROWS: возвращается число реально изменённых строк, а не всех совпавших с WHERE.

Отличить изменение от записи того же значенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
echo $db->affected_rows, "\n";
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
echo $db->affected_rows, "\n";
Ожидаемый результат
1
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для повторяемой операции удаления ноль иногда нормален; для списания последнего товара может означать конфликт. Бизнес-решение следует из задачи, а не из bool query.

Успешный DELETE может не найти строкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_query($db, 'DELETE FROM course_products WHERE id = 999');
echo mysqli_affected_rows($db), "\n";
Ожидаемый результат
0

Связанные операции: mysqli_stmt_affected_rows, mysqli_num_rows.

Оба входа к этой операции: mysqli_affected_rows, mysqli::$affected_rows.

mysqli::$affected_rowsПрочитать число строк, затронутых последним SQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_affected_rows(mysqli $mysql): int|string; readonly mysqli::$affected_rows

Связать служебный результат команды с изменёнными товарами. Счётчик меняется после каждой команды. Условный UPDATE показывает успешное изменение, а SELECT подтверждает новый остаток; ноль не является универсальным признаком ошибки.

Данные и действие: mysqli::$affected_rows
  1. mysqli_affected_rows($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Резерв принят · Молоток — 6 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('UPDATE products SET stock = stock - 2 WHERE id = 1 AND stock >= 2');
echo $db->affected_rows === 1 ? "Резерв принят\n" : "Резерв не выполнен\n";
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Резерв принят
Молоток — 6 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток6 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать число строк, затронутых последним SQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после INSERT/UPDATE/REPLACE/DELETE или буферизованного SELECT.

Больше нуля — затронутые/полученные строки, 0 — нет изменения/совпадений/запроса, −1 — отказ или небуферизованный SELECT. Число сверх PHP_INT_MAX возвращается строкой. Для SELECT похоже на num_rows, но удобнее читать сам результат. FOUND_ROWS меняет смысл UPDATE; REPLACE и ON DUPLICATE KEY UPDATE имеют свои правила счётчика. Снимайте значение до следующего SQL.

Путь данных. SQL выполнил действие → Соединение хранит счётчик → Код определяет, случилось ли полезное изменение.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Это обычное соединение без FOUND_ROWS: возвращается число реально изменённых строк, а не всех совпавших с WHERE.

Отличить изменение от записи того же значенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
echo $db->affected_rows, "\n";
$db->query('UPDATE course_products SET price = 130 WHERE id = 1');
echo $db->affected_rows, "\n";
Ожидаемый результат
1
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для повторяемой операции удаления ноль иногда нормален; для списания последнего товара может означать конфликт. Бизнес-решение следует из задачи, а не из bool query.

Успешный DELETE может не найти строкуПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_query($db, 'DELETE FROM course_products WHERE id = 999');
echo mysqli_affected_rows($db), "\n";
Ожидаемый результат
0

Связанные операции: mysqli_stmt_affected_rows, mysqli_num_rows.

Оба входа к этой операции: mysqli_affected_rows, mysqli::$affected_rows.

mysqli_insert_idПрочитать AUTO_INCREMENT-значение последней вставки/обновления.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_insert_id(mysqli $mysql): int|string; readonly mysqli::$insert_id

Связать служебный результат команды с изменёнными товарами. insert_id читают сразу после INSERT в том же соединении. Это назначенный AUTO_INCREMENT, по которому можно открыть созданную карточку.

Данные и действие: mysqli_insert_id
  1. mysqli_insert_id($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Отвёртка — 4 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->execute_query('INSERT INTO products (name, stock) VALUES (?, ?)', ['Отвёртка',4]);
$id = $db->insert_id;
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [$id]);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Отвёртка — 4 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Отвёртка4 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать AUTO_INCREMENT-значение последней вставки/обновления.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlТо же соединение, которое выполнило операцию; читать сразу после неё.

int либо строка при превышении PHP_INT_MAX. 0 — предыдущая команда не меняла AUTO_INCREMENT. Несколько строк дают первый сгенерированный ключ. LAST_INSERT_ID(expr) в INSERT/UPDATE меняет возвращаемое значение на expr. Действия других соединений его не меняют, но следующий запрос вашего соединения может изменить состояние.

Путь данных. INSERT создал ID → Сразу сохраняем insert_id → ID используется для связанных строк заказа.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ID принадлежит этому соединению и не меняется от вставок других клиентов. Не ищите SELECT MAX(id), который может увидеть чужую запись.

Получить ID созданного заказаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$db->execute_query('INSERT INTO course_orders (title) VALUES (?)', ['First']);
$id = $db->insert_id;
echo $id, "\n";
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. При нескольких строках insert_id возвращает первый успешно сгенерированный ID. Не выводите все остальные простой арифметикой без знания серверного режима и конфликтов.

Получить первый ID массовой вставкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$db->query("INSERT INTO course_orders (title) VALUES ('First'), ('Second')");
echo mysqli_insert_id($db), ':', mysqli_affected_rows($db), "\n";
Ожидаемый результат
1:2

Связанные операции: mysqli_stmt_insert_id, mysqli_affected_rows.

Оба входа к этой операции: mysqli_insert_id, mysqli::$insert_id.

mysqli::$insert_idПрочитать AUTO_INCREMENT-значение последней вставки/обновления.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_insert_id(mysqli $mysql): int|string; readonly mysqli::$insert_id

Связать служебный результат команды с изменёнными товарами. insert_id читают сразу после INSERT в том же соединении. Это назначенный AUTO_INCREMENT, по которому можно открыть созданную карточку.

Данные и действие: mysqli::$insert_id
  1. mysqli_insert_id($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Отвёртка — 4 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->execute_query('INSERT INTO products (name, stock) VALUES (?, ?)', ['Отвёртка',4]);
$id = $db->insert_id;
$result = $db->execute_query('SELECT name, stock FROM products WHERE id = ?', [$id]);
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Отвёртка — 4 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Отвёртка4 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать AUTO_INCREMENT-значение последней вставки/обновления.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlТо же соединение, которое выполнило операцию; читать сразу после неё.

int либо строка при превышении PHP_INT_MAX. 0 — предыдущая команда не меняла AUTO_INCREMENT. Несколько строк дают первый сгенерированный ключ. LAST_INSERT_ID(expr) в INSERT/UPDATE меняет возвращаемое значение на expr. Действия других соединений его не меняют, но следующий запрос вашего соединения может изменить состояние.

Путь данных. INSERT создал ID → Сразу сохраняем insert_id → ID используется для связанных строк заказа.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. ID принадлежит этому соединению и не меняется от вставок других клиентов. Не ищите SELECT MAX(id), который может увидеть чужую запись.

Получить ID созданного заказаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$db->execute_query('INSERT INTO course_orders (title) VALUES (?)', ['First']);
$id = $db->insert_id;
echo $id, "\n";
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. При нескольких строках insert_id возвращает первый успешно сгенерированный ID. Не выводите все остальные простой арифметикой без знания серверного режима и конфликтов.

Получить первый ID массовой вставкиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_orders (id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(80)) ENGINE=InnoDB');
$db->query("INSERT INTO course_orders (title) VALUES ('First'), ('Second')");
echo mysqli_insert_id($db), ':', mysqli_affected_rows($db), "\n";
Ожидаемый результат
1:2

Связанные операции: mysqli_stmt_insert_id, mysqli_affected_rows.

Оба входа к этой операции: mysqli_insert_id, mysqli::$insert_id.

mysqli_field_countПрочитать количество колонок самого последнего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_count(mysqli $mysql): int; readonly mysqli::$field_count

Связать служебный результат команды с изменёнными товарами. field_count относится к колонкам последнего ответа соединения. Это два поля name/stock, а не число найденных товаров.

Данные и действие: mysqli_field_count
  1. mysqli_field_count($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
if ($db->field_count !== 2) { throw new RuntimeException('Ожидались name и stock'); }
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать количество колонок самого последнего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после SQL.

Целое число. Помогает отличить false от store_result как отсутствие набора от отказа получения ожидаемых колонок. Отдельный результат имеет своё field_count/num_fields, не зависящее от более нового запроса соединения.

Путь данных. SQL определил колонки → field_count сообщает их число → store_result нужен при наличии набора.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Набор имеет две колонки, хотя строк нет. По field_count решают, нужен ли объект результата, а не по числу товаров.

Понять, ожидается ли результат после real_queryПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 1 AS id, 2 AS quantity WHERE 1 = 0');
echo $db->field_count, "\n";
$result = $db->store_result();
echo $result->num_rows, "\n";
Ожидаемый результат
2
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У UPDATE здесь ноль колонок, но одна изменённая строка. Это разные виды результата.

Команда без колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'UPDATE course_products SET price = 130 WHERE id = 1');
echo mysqli_field_count($db), ':', mysqli_affected_rows($db), "\n";
Ожидаемый результат
0:1

Связанные операции: mysqli_store_result, mysqli_num_fields.

Оба входа к этой операции: mysqli_field_count, mysqli::$field_count.

mysqli::$field_countПрочитать количество колонок самого последнего запроса.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_field_count(mysqli $mysql): int; readonly mysqli::$field_count

Связать служебный результат команды с изменёнными товарами. field_count относится к колонкам последнего ответа соединения. Это два поля name/stock, а не число найденных товаров.

Данные и действие: mysqli::$field_count
  1. mysqli_field_count($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
if ($db->field_count !== 2) { throw new RuntimeException('Ожидались name и stock'); }
$row = $result->fetch_assoc();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Прочитать количество колонок самого последнего запроса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение после SQL.

Целое число. Помогает отличить false от store_result как отсутствие набора от отказа получения ожидаемых колонок. Отдельный результат имеет своё field_count/num_fields, не зависящее от более нового запроса соединения.

Путь данных. SQL определил колонки → field_count сообщает их число → store_result нужен при наличии набора.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Набор имеет две колонки, хотя строк нет. По field_count решают, нужен ли объект результата, а не по числу товаров.

Понять, ожидается ли результат после real_queryПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->real_query('SELECT 1 AS id, 2 AS quantity WHERE 1 = 0');
echo $db->field_count, "\n";
$result = $db->store_result();
echo $result->num_rows, "\n";
Ожидаемый результат
2
0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У UPDATE здесь ноль колонок, но одна изменённая строка. Это разные виды результата.

Команда без колонокПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
mysqli_real_query($db, 'UPDATE course_products SET price = 130 WHERE id = 1');
echo mysqli_field_count($db), ':', mysqli_affected_rows($db), "\n";
Ожидаемый результат
0:1

Связанные операции: mysqli_store_result, mysqli_num_fields.

Оба входа к этой операции: mysqli_field_count, mysqli::$field_count.

mysqli_infoПолучить человекочитаемую сводку последнего массового изменения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_info(mysqli $mysql): ?string; readonly mysqli::$info

Связать служебный результат команды с изменёнными товарами. info описывает результаты ряда команд текстом. Сохраняем её до SELECT в update-info.txt, но для бизнес-решений используем определённые счётчики и запрос результата, а не разбор локализованного текста.

Данные и действие: mysqli_info
  1. mysqli_info($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Молоток — 9 шт. · Перчатки — 16 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('UPDATE products SET stock = stock + 1 WHERE id IN (1,2)');
$info = $db->info;
if (file_put_contents(__DIR__ . '/update-info.txt', $info ?? 'Информация не предоставлена') === false) { throw new RuntimeException('Не удалось сохранить отчёт'); }
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 9 шт.
Перчатки — 16 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток9 шт.
Перчатки16 шт.
Кисть0 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Получить человекочитаемую сводку последнего массового изменения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после интересующего SQL.

Дополнительная строка или null/пустое значение при отсутствии. Поддерживается INSERT ... SELECT, многострочный INSERT VALUES, LOAD DATA INFILE, ALTER TABLE, UPDATE. Поля сводки зависят от команды: Records/Duplicates/Warnings; для LOAD DATA также Deleted/Skipped; UPDATE — Rows matched/Changed/Warnings. Формат предназначен диагностике, не переносимому протоколу приложения.

Путь данных. Сервер выполнил массовую команду → info содержит сводку → Разработчик видит найденное/изменённое.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Точный формат и пробелы определяет сервер. Человеку эта строка помогает понять отличие matched и changed, но машинную бизнес-логику не стройте на парсинге английской фразы.

Развести найденные и изменённые строки UPDATEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 120 WHERE id = 1');
echo $db->info, "\n";
Ожидаемый результат
Rows matched: 1  Changed: 0  Warnings: 0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У отдельных видов команд дополнительной строки нет. Для счётчика используйте affected_rows, для предупреждений warning_count/SHOW WARNINGS.

Посмотреть сводку массового INSERTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_notes (id INT PRIMARY KEY)');
$db->query('INSERT INTO course_notes VALUES (1), (2)');
echo mysqli_info($db), "\n";
Ожидаемый результат
Records: 2  Duplicates: 0  Warnings: 0

Связанные операции: mysqli_affected_rows, mysqli_warning_count.

Оба входа к этой операции: mysqli_info, mysqli::$info.

mysqli::$infoПолучить человекочитаемую сводку последнего массового изменения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_info(mysqli $mysql): ?string; readonly mysqli::$info

Связать служебный результат команды с изменёнными товарами. info описывает результаты ряда команд текстом. Сохраняем её до SELECT в update-info.txt, но для бизнес-решений используем определённые счётчики и запрос результата, а не разбор локализованного текста.

Данные и действие: mysqli::$info
  1. mysqli_info($db)
  2. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
  3. После выполнения: Молоток — 9 шт. · Перчатки — 16 шт. · Кисть — 0 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
while (...)Повторяет блок, пока условие истинно. В чтении результата проверка конца связана с конкретным методом: false или null указаны в его контракте.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Связать служебный результат команды с изменёнными товарамиПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$db->query('UPDATE products SET stock = stock + 1 WHERE id IN (1,2)');
$info = $db->info;
if (file_put_contents(__DIR__ . '/update-info.txt', $info ?? 'Информация не предоставлена') === false) { throw new RuntimeException('Не удалось сохранить отчёт'); }
$result = $db->query('SELECT name, stock FROM products ORDER BY id');
while (($row = $result->fetch_assoc()) !== null) {
    if ($row === false) { throw new RuntimeException('Не удалось прочитать строку'); }
    echo $row['name'], ' — ', $row['stock'], " шт.\n";
}
Ожидаемый результат
Молоток — 9 шт.
Перчатки — 16 шт.
Кисть — 0 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток9 шт.
Перчатки16 шт.
Кисть0 шт.

Если требование изменится. Служебные свойства не заменяют проверку входа, ограничения схемы и транзакцию. Не применяйте affected_rows для подсчёта всей таблицы: COUNT(*) решает другую задачу.

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

Получить человекочитаемую сводку последнего массового изменения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение сразу после интересующего SQL.

Дополнительная строка или null/пустое значение при отсутствии. Поддерживается INSERT ... SELECT, многострочный INSERT VALUES, LOAD DATA INFILE, ALTER TABLE, UPDATE. Поля сводки зависят от команды: Records/Duplicates/Warnings; для LOAD DATA также Deleted/Skipped; UPDATE — Rows matched/Changed/Warnings. Формат предназначен диагностике, не переносимому протоколу приложения.

Путь данных. Сервер выполнил массовую команду → info содержит сводку → Разработчик видит найденное/изменённое.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Точный формат и пробелы определяет сервер. Человеку эта строка помогает понять отличие matched и changed, но машинную бизнес-логику не стройте на парсинге английской фразы.

Развести найденные и изменённые строки UPDATEПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_products (id INT PRIMARY KEY, name VARCHAR(80) NOT NULL, price INT NOT NULL) ENGINE=InnoDB');
$db->query("INSERT INTO course_products VALUES (1, 'Pen', 120), (2, 'Notebook', 350), (3, 'Box', 200)");
$db->query('UPDATE course_products SET price = 120 WHERE id = 1');
echo $db->info, "\n";
Ожидаемый результат
Rows matched: 1  Changed: 0  Warnings: 0

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. У отдельных видов команд дополнительной строки нет. Для счётчика используйте affected_rows, для предупреждений warning_count/SHOW WARNINGS.

Посмотреть сводку массового INSERTПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$db->query('CREATE TEMPORARY TABLE course_notes (id INT PRIMARY KEY)');
$db->query('INSERT INTO course_notes VALUES (1), (2)');
echo mysqli_info($db), "\n";
Ожидаемый результат
Records: 2  Duplicates: 0  Warnings: 0

Связанные операции: mysqli_affected_rows, mysqli_warning_count.

Оба входа к этой операции: mysqli_info, mysqli::$info.

mysqli_get_client_infoУзнать строковую версию клиентской библиотеки PHP.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_client_info(?mysqli $mysql = null): string; readonly mysqli::$client_info

Приложить сведения окружения к отчёту о работе каталога. Версия клиентской библиотеки PHP помогает понять наличие mysqlnd. Это не версия сервера MySQL.

Данные и действие: mysqli_get_client_info
  1. mysqli_get_client_info()
  2. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_info();
$report = ['client' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать строковую версию клиентской библиотеки PHP.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlНе передавать: необязательный исторический аргумент deprecated с 8.1.

Строка, например mysqlnd 8.5.11. Подключение не нужно. OO-метод get_client_info deprecated с 8.1, свойство client_info остаётся допустимым. Для проверки наличия функции надёжнее function_exists/method_exists, чем разбор текста версии.

Путь данных. Расширение загружено → API читает версию библиотеки → Разработчик отличает клиент от сервера.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_version, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_client_info, mysqli::$client_info.

mysqli::$client_infoУзнать строковую версию клиентской библиотеки PHP.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_client_info(?mysqli $mysql = null): string; readonly mysqli::$client_info

Приложить сведения окружения к отчёту о работе каталога. Версия клиентской библиотеки PHP помогает понять наличие mysqlnd. Это не версия сервера MySQL.

Данные и действие: mysqli::$client_info
  1. mysqli_get_client_info()
  2. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_info();
$report = ['client' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать строковую версию клиентской библиотеки PHP.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlНе передавать: необязательный исторический аргумент deprecated с 8.1.

Строка, например mysqlnd 8.5.11. Подключение не нужно. OO-метод get_client_info deprecated с 8.1, свойство client_info остаётся допустимым. Для проверки наличия функции надёжнее function_exists/method_exists, чем разбор текста версии.

Путь данных. Расширение загружено → API читает версию библиотеки → Разработчик отличает клиент от сервера.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_version, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_client_info, mysqli::$client_info.

mysqli::get_client_infoРаспознать устаревший метод сведений о клиенте.

PHP 5+; deprecated 8.1 · mysqli; mysqlnd для отмеченных операций

mysqli::get_client_info(): string

Приложить сведения окружения к отчёту о работе каталога. Версия клиентской библиотеки PHP помогает понять наличие mysqlnd. Это не версия сервера MySQL.

Данные и действие: mysqli::get_client_info
  1. mysqli_get_client_info()
  2. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_info();
$report = ['client' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Распознать устаревший метод сведений о клиенте.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Deprecated с PHP 8.1; заменяется mysqli_get_client_info() без аргумента либо свойством client_info. Его смысл не связан с сервером, несмотря на вызов у объекта соединения.

Путь данных. Старый метод читает клиент → Новый код вызывает функцию без соединения → Версия сервера читается отдельно.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_info.

mysqli_get_client_versionПолучить числовую версию клиентской библиотеки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_client_version(): int; readonly mysqli::$client_version

Приложить сведения окружения к отчёту о работе каталога. Числовая версия относится к клиенту; её формат описан в контракте. Не сравнивайте её с серверной как равные величины.

Данные и действие: mysqli_get_client_version
  1. mysqli_get_client_version()
  2. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_version();
$report = ['client_version' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить числовую версию клиентской библиотеки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Формула major×10000 + minor×100 + patch, например 40100 для 4.1.0. Не равно PHP_VERSION_ID по смыслу даже когда mysqlnd собран вместе с PHP. Возможности сервера определяются отдельно.

Путь данных. Клиент сообщает номер → Код сравнивает формат major/minor/patch → Возможность при необходимости проверяется отдельно.

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_get_server_version.

Оба входа к этой операции: mysqli_get_client_version, mysqli::$client_version.

mysqli::$client_versionПолучить числовую версию клиентской библиотеки.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_client_version(): int; readonly mysqli::$client_version

Приложить сведения окружения к отчёту о работе каталога. Числовая версия относится к клиенту; её формат описан в контракте. Не сравнивайте её с серверной как равные величины.

Данные и действие: mysqli::$client_version
  1. mysqli_get_client_version()
  2. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_version();
$report = ['client_version' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить числовую версию клиентской библиотеки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Формула major×10000 + minor×100 + patch, например 40100 для 4.1.0. Не равно PHP_VERSION_ID по смыслу даже когда mysqlnd собран вместе с PHP. Возможности сервера определяются отдельно.

Путь данных. Клиент сообщает номер → Код сравнивает формат major/minor/patch → Возможность при необходимости проверяется отдельно.

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_get_server_version.

Оба входа к этой операции: mysqli_get_client_version, mysqli::$client_version.

mysqli_driver::$client_infoПрочитать client_info у общего драйвера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

readonly mysqli_driver::$client_info: string

Приложить сведения окружения к отчёту о работе каталога. Версия клиентской библиотеки PHP помогает понять наличие mysqlnd. Это не версия сервера MySQL.

Данные и действие: mysqli_driver::$client_info
  1. mysqli_get_client_info()
  2. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_info();
$report = ['client' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Прочитать client_info у общего драйвера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Строка версии клиентского API. Не требует сетевого соединения; значение только для чтения.

Путь данных. new mysqli_driver открывает доступ к настройкам → Свойство описывает локальную библиотеку → Приложение не обращается к MySQL.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_get_client_version.

mysqli_driver::$client_versionПрочитать client_version у общего драйвера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

readonly mysqli_driver::$client_version: int

Приложить сведения окружения к отчёту о работе каталога. Числовая версия относится к клиенту; её формат описан в контракте. Не сравнивайте её с серверной как равные величины.

Данные и действие: mysqli_driver::$client_version
  1. mysqli_get_client_version()
  2. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_version();
$report = ['client_version' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Прочитать client_version у общего драйвера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Числовая версия клиентской библиотеки по схеме major×10000+minor×100+patch. Не требует сетевого соединения; значение только для чтения.

Путь данных. new mysqli_driver открывает доступ к настройкам → Свойство описывает локальную библиотеку → Приложение не обращается к MySQL.

Как читать этот вариант. Клиент — библиотека на стороне PHP, не версия MySQL-сервера. Проверка выполнена без сети.

Проверить библиотеку PHP без подключенияСамостоятельный пример
<?php
echo str_starts_with(mysqli_get_client_info(), 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump(mysqli_get_client_version() > 0);
Ожидаемый результат
mysqlnd
bool(true)

Как читать этот вариант. mysqli_driver хранит сведения о клиентской библиотеке, а не конкретном подключении.

Прочитать сведения через объект драйвераСамостоятельный пример
<?php
$driver = new mysqli_driver();
echo str_starts_with($driver->client_info, 'mysqlnd') ? 'mysqlnd' : 'Другой клиент';
echo "\n";
var_dump($driver->client_version === mysqli_get_client_version());
Ожидаемый результат
mysqlnd
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_get_client_version.

mysqli_get_host_infoУзнать хост и способ соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_host_info(mysqli $mysql): string; readonly mysqli::$host_info

Приложить сведения окружения к отчёту о работе каталога. Сведения показывают фактически выбранный транспорт соединения, например TCP/IP или сокет; полезно при проверке localhost против 127.0.0.1.

Данные и действие: mysqli_get_host_info
  1. $db->host_info
  2. Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->host_info;
$report = ['host' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать хост и способ соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Строка с именем сервера и транспортом. Она помогает отличить TCP от socket; это не пароль и не URL приложения.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_host_info, mysqli::$host_info.

mysqli::$host_infoУзнать хост и способ соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_host_info(mysqli $mysql): string; readonly mysqli::$host_info

Приложить сведения окружения к отчёту о работе каталога. Сведения показывают фактически выбранный транспорт соединения, например TCP/IP или сокет; полезно при проверке localhost против 127.0.0.1.

Данные и действие: mysqli::$host_info
  1. $db->host_info
  2. Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->host_info;
$report = ['host' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать хост и способ соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Строка с именем сервера и транспортом. Она помогает отличить TCP от socket; это не пароль и не URL приложения.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_host_info, mysqli::$host_info.

mysqli_get_proto_infoПрочитать версию протокола MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_proto_info(mysqli $mysql): int; readonly mysqli::$protocol_version

Приложить сведения окружения к отчёту о работе каталога. Это номер протокола обмена, а не версия SQL, приложения либо сервера.

Данные и действие: mysqli_get_proto_info
  1. $db->protocol_version
  2. Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->protocol_version;
$report = ['protocol' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Прочитать версию протокола MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Целое число wire protocol. Не равно версии сервера и не является номером TLS.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_proto_info, mysqli::$protocol_version.

mysqli::$protocol_versionПрочитать версию протокола MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_proto_info(mysqli $mysql): int; readonly mysqli::$protocol_version

Приложить сведения окружения к отчёту о работе каталога. Это номер протокола обмена, а не версия SQL, приложения либо сервера.

Данные и действие: mysqli::$protocol_version
  1. $db->protocol_version
  2. Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->protocol_version;
$report = ['protocol' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Прочитать версию протокола MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Целое число wire protocol. Не равно версии сервера и не является номером TLS.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_proto_info, mysqli::$protocol_version.

mysqli_get_server_infoУзнать строковую версию подключённого сервера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_server_info(mysqli $mysql): string; readonly mysqli::$server_info

Приложить сведения окружения к отчёту о работе каталога. Строка версии удалённого сервера нужна для воспроизводимого отчёта об ошибке и проверки поддерживаемых SQL-возможностей.

Данные и действие: mysqli_get_server_info
  1. $db->server_info
  2. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->server_info;
$report = ['server' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать строковую версию подключённого сервера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Строка сервера, иногда с суффиксом поставщика. Возможности лучше сверять с серверной документацией, не только лексикографическим сравнением.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_host_info.

Оба входа к этой операции: mysqli_get_server_info, mysqli::$server_info.

mysqli::$server_infoУзнать строковую версию подключённого сервера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_server_info(mysqli $mysql): string; readonly mysqli::$server_info

Приложить сведения окружения к отчёту о работе каталога. Строка версии удалённого сервера нужна для воспроизводимого отчёта об ошибке и проверки поддерживаемых SQL-возможностей.

Данные и действие: mysqli::$server_info
  1. $db->server_info
  2. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->server_info;
$report = ['server' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать строковую версию подключённого сервера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

Строка сервера, иногда с суффиксом поставщика. Возможности лучше сверять с серверной документацией, не только лексикографическим сравнением.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_host_info.

Оба входа к этой операции: mysqli_get_server_info, mysqli::$server_info.

mysqli_get_server_versionУзнать числовую версию подключённого сервера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_server_version(mysqli $mysql): int; readonly mysqli::$server_version

Приложить сведения окружения к отчёту о работе каталога. Числовая версия сервера удобна для грубой проверки версии; конкретная возможность может зависеть также от конфигурации и разновидности сервера.

Данные и действие: mysqli_get_server_version
  1. $db->server_version
  2. Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->server_version;
$report = ['server_version' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать числовую версию подключённого сервера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

major×10000 + minor×100 + patch. Номер клиента читается другой функцией; форки и backport требуют отдельной проверки функциональности.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_server_version, mysqli::$server_version.

mysqli::$server_versionУзнать числовую версию подключённого сервера.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_get_server_version(mysqli $mysql): int; readonly mysqli::$server_version

Приложить сведения окружения к отчёту о работе каталога. Числовая версия сервера удобна для грубой проверки версии; конкретная возможность может зависеть также от конфигурации и разновидности сервера.

Данные и действие: mysqli::$server_version
  1. $db->server_version
  2. Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->server_version;
$report = ['server_version' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать числовую версию подключённого сервера.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlУстановленное соединение.

major×10000 + minor×100 + patch. Номер клиента читается другой функцией; форки и backport требуют отдельной проверки функциональности.

Путь данных. Открытое соединение знает сервер → Getter читает сведения → Диагностика сравнивает клиент и сервер.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

Оба входа к этой операции: mysqli_get_server_version, mysqli::$server_version.

mysqli::get_server_infoПолучить серверную версию методом объекта.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli::get_server_info(): string

Приложить сведения окружения к отчёту о работе каталога. Строка версии удалённого сервера нужна для воспроизводимого отчёта об ошибке и проверки поддерживаемых SQL-возможностей.

Данные и действие: mysqli::get_server_info
  1. $db->server_info
  2. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->server_info;
$report = ['server' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить серверную версию методом объекта.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Та же строка, что у свойства server_info и функции mysqli_get_server_info. Метод актуален; его нельзя путать с deprecated get_client_info.

Путь данных. Объект соединён с сервером → Метод получает его версию → Код выводит диагностическую строку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидаемая форма зависит от установленного сервера. Протокол 10 — версия wire protocol, а не MySQL 10. MariaDB и MySQL могут иметь разные функции при похожих числах.

Различить серверную версию и протоколПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->server_info, "\n";
echo $db->server_version, "\n";
echo $db->protocol_version, "\n";
Ожидаемый результат
<строка версии учебного MySQL>
<числовая версия сервера>
10

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Host info указывает транспорт: localhost может вести к Unix socket, 127.0.0.1 — TCP. Диагностический endpoint держат закрытым, чтобы не раскрывать инфраструктуру.

Диагностика подключения без пароляПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo mysqli_get_host_info($db), "\n";
echo mysqli_get_server_info($db), ':', mysqli_get_server_version($db), "\n";
echo mysqli_get_proto_info($db), "\n";
Ожидаемый результат
127.0.0.1 via TCP/IP
<версия сервера>:<числовая версия>
10

Связанные операции: mysqli_get_server_info.

mysqli_thread_idУзнать серверный ID текущего соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_thread_id(mysqli $mysql): int; readonly mysqli::$thread_id

Приложить сведения окружения к отчёту о работе каталога. ID относится к текущему серверному соединению. Он связывает локальную диагностику со списком сессий администратора, не является номером HTTP-пользователя.

Данные и действие: mysqli_thread_id
  1. $db->thread_id
  2. Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->thread_id;
$report = ['connection_id' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать серверный ID текущего соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlЖивое соединение.

Целое число. При пересоединении выдаётся новый ID. Историческое упоминание reconnect через ping не относится к современной mysqlnd: авто reconnect отсутствует. KILL QUERY прекращает запрос, KILL CONNECTION закрывает сессию; mysqli_kill deprecated с 8.4.

Путь данных. Подключение создало серверную сессию → thread_id связывает её с диагностикой → Новое подключение получает иной ID.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Thread ID относится к серверной сессии, а не PHP-процессу. После нового подключения ID может измениться; не кешируйте его как вечный идентификатор пользователя.

Сопоставить соединение с серверной сессиейПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$id = $db->thread_id;
$serverId = $db->query('SELECT CONNECTION_ID()')->fetch_column();
var_dump((string) $id === (string) $serverId);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для отмены запроса используют доверенный ID нужной своей сессии. Произвольный ID от посетителя нельзя передавать административной команде.

Снять ID для закрытого журнала диагностикиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$connectionId = mysqli_thread_id($db);
echo $connectionId > 0 ? 'ID получен' : 'Нет ID';
echo "\n";
Ожидаемый результат
ID получен

Связанные операции: mysqli_kill, mysqli_ping.

Оба входа к этой операции: mysqli_thread_id, mysqli::$thread_id.

mysqli::$thread_idУзнать серверный ID текущего соединения.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_thread_id(mysqli $mysql): int; readonly mysqli::$thread_id

Приложить сведения окружения к отчёту о работе каталога. ID относится к текущему серверному соединению. Он связывает локальную диагностику со списком сессий администратора, не является номером HTTP-пользователя.

Данные и действие: mysqli::$thread_id
  1. $db->thread_id
  2. Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->thread_id;
$report = ['connection_id' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать серверный ID текущего соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlЖивое соединение.

Целое число. При пересоединении выдаётся новый ID. Историческое упоминание reconnect через ping не относится к современной mysqlnd: авто reconnect отсутствует. KILL QUERY прекращает запрос, KILL CONNECTION закрывает сессию; mysqli_kill deprecated с 8.4.

Путь данных. Подключение создало серверную сессию → thread_id связывает её с диагностикой → Новое подключение получает иной ID.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Thread ID относится к серверной сессии, а не PHP-процессу. После нового подключения ID может измениться; не кешируйте его как вечный идентификатор пользователя.

Сопоставить соединение с серверной сессиейПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$id = $db->thread_id;
$serverId = $db->query('SELECT CONNECTION_ID()')->fetch_column();
var_dump((string) $id === (string) $serverId);
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Для отмены запроса используют доверенный ID нужной своей сессии. Произвольный ID от посетителя нельзя передавать административной команде.

Снять ID для закрытого журнала диагностикиПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$connectionId = mysqli_thread_id($db);
echo $connectionId > 0 ? 'ID получен' : 'Нет ID';
echo "\n";
Ожидаемый результат
ID получен

Связанные операции: mysqli_kill, mysqli_ping.

Оба входа к этой операции: mysqli_thread_id, mysqli::$thread_id.

mysqli_thread_safeУзнать, собрана ли клиентская библиотека с поддержкой потокобезопасности.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_thread_safe(): bool; mysqli::thread_safe(): bool

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

Данные и действие: mysqli_thread_safe
  1. mysqli_thread_safe()
  2. Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_thread_safe();
$report = ['thread_safe' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать, собрана ли клиентская библиотека с поддержкой потокобезопасности.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

true/false, без параметров. Не делает пользовательские глобальные переменные безопасными для конкурентного доступа и не разрешает отправлять два SQL одновременно по одному протоколу соединения.

Путь данных. Локальная сборка имеет признак → API возвращает bool → Приложение отдельно организует владение соединением.

Как читать этот вариант. В проверочной mysqlnd возвращает true. Это не означает, что один $db можно без координации использовать конкурентно или что транзакции приложения автоматически корректны.

Прочитать признак безопасности клиентской библиотекиСамостоятельный пример
<?php
var_dump(mysqli_thread_safe());
Ожидаемый результат
bool(true)

Как читать этот вариант. Соединение не открывается: проверяется свойство сборки клиентской библиотеки. Оно отлично от PHP_ZTS и серверных блокировок.

Тот же признак через объект MySQLiСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->thread_safe() === mysqli_thread_safe());
Ожидаемый результат
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_poll.

Оба входа к этой операции: mysqli_thread_safe, mysqli::thread_safe.

mysqli::thread_safeУзнать, собрана ли клиентская библиотека с поддержкой потокобезопасности.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_thread_safe(): bool; mysqli::thread_safe(): bool

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

Данные и действие: mysqli::thread_safe
  1. mysqli_thread_safe()
  2. Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_thread_safe();
$report = ['thread_safe' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Узнать, собрана ли клиентская библиотека с поддержкой потокобезопасности.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

true/false, без параметров. Не делает пользовательские глобальные переменные безопасными для конкурентного доступа и не разрешает отправлять два SQL одновременно по одному протоколу соединения.

Путь данных. Локальная сборка имеет признак → API возвращает bool → Приложение отдельно организует владение соединением.

Как читать этот вариант. В проверочной mysqlnd возвращает true. Это не означает, что один $db можно без координации использовать конкурентно или что транзакции приложения автоматически корректны.

Прочитать признак безопасности клиентской библиотекиСамостоятельный пример
<?php
var_dump(mysqli_thread_safe());
Ожидаемый результат
bool(true)

Как читать этот вариант. Соединение не открывается: проверяется свойство сборки клиентской библиотеки. Оно отлично от PHP_ZTS и серверных блокировок.

Тот же признак через объект MySQLiСамостоятельный пример
<?php
$db = new mysqli();
var_dump($db->thread_safe() === mysqli_thread_safe());
Ожидаемый результат
bool(true)

Связанные операции: mysqli_get_client_info, mysqli_poll.

Оба входа к этой операции: mysqli_thread_safe, mysqli::thread_safe.

mysqli_get_connection_statsПолучить клиентские счётчики одного соединения для диагностики нагрузки.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_get_connection_stats(mysqli $mysql): array; mysqli::get_connection_stats(): array

Приложить сведения окружения к отчёту о работе каталога. mysqlnd предоставляет счётчики именно этого соединения: запросы, байты и способы чтения. Снимок не является сам по себе замером скорости.

Данные и действие: mysqli_get_connection_stats
  1. $db->get_connection_stats()
  2. Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->get_connection_stats();
$report = ['connection_stats' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить клиентские счётчики одного соединения для диагностики нагрузки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение mysqlnd.

Массив статистики mysqlnd: байты, пакеты, результаты и прочие показатели. Это метрики клиента, не EXPLAIN и не загрузка CPU сервера. Сбор зависит от mysqlnd.collect_statistics/collect_memory_statistics, некоторые значения приходят строками. Измеряйте разницу до/после ограниченной операции.

Путь данных. Снимаем счётчики до → Выполняем SQL → Снимаем после → Разница показывает дополнительную работу.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только mysqlnd. На счётчики влияет mysqlnd.collect_statistics; точные значения зависят от протокола/сервера, поэтому сравнивается направление, а не выдуманный размер пакета.

Посмотреть объём сетевых данных одного соединенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$before = $db->get_connection_stats();
$db->query('SELECT 42')->free();
$after = $db->get_connection_stats();
echo ((int) $after['bytes_received'] >= (int) $before['bytes_received']) ? 'Байты учтены' : 'Проверьте сбор статистики';
echo "\n";
Ожидаемый результат
Байты учтены

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Список метрик относится к mysqlnd и версии; не путайте переданные байты с временем выполнения SQL или объёмом полезных строк.

Убедиться, что приложение читает известный счётчикПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$stats = mysqli_get_connection_stats($db);
var_dump(array_key_exists('bytes_sent', $stats));
var_dump(array_key_exists('bytes_received', $stats));
Ожидаемый результат
bool(true)
bool(true)

Связанные операции: mysqli_get_client_stats, mysqli_stat.

Оба входа к этой операции: mysqli_get_connection_stats, mysqli::get_connection_stats.

mysqli::get_connection_statsПолучить клиентские счётчики одного соединения для диагностики нагрузки.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_get_connection_stats(mysqli $mysql): array; mysqli::get_connection_stats(): array

Приложить сведения окружения к отчёту о работе каталога. mysqlnd предоставляет счётчики именно этого соединения: запросы, байты и способы чтения. Снимок не является сам по себе замером скорости.

Данные и действие: mysqli::get_connection_stats
  1. $db->get_connection_stats()
  2. Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->get_connection_stats();
$report = ['connection_stats' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить клиентские счётчики одного соединения для диагностики нагрузки.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение mysqlnd.

Массив статистики mysqlnd: байты, пакеты, результаты и прочие показатели. Это метрики клиента, не EXPLAIN и не загрузка CPU сервера. Сбор зависит от mysqlnd.collect_statistics/collect_memory_statistics, некоторые значения приходят строками. Измеряйте разницу до/после ограниченной операции.

Путь данных. Снимаем счётчики до → Выполняем SQL → Снимаем после → Разница показывает дополнительную работу.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только mysqlnd. На счётчики влияет mysqlnd.collect_statistics; точные значения зависят от протокола/сервера, поэтому сравнивается направление, а не выдуманный размер пакета.

Посмотреть объём сетевых данных одного соединенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$before = $db->get_connection_stats();
$db->query('SELECT 42')->free();
$after = $db->get_connection_stats();
echo ((int) $after['bytes_received'] >= (int) $before['bytes_received']) ? 'Байты учтены' : 'Проверьте сбор статистики';
echo "\n";
Ожидаемый результат
Байты учтены

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Список метрик относится к mysqlnd и версии; не путайте переданные байты с временем выполнения SQL или объёмом полезных строк.

Убедиться, что приложение читает известный счётчикПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$stats = mysqli_get_connection_stats($db);
var_dump(array_key_exists('bytes_sent', $stats));
var_dump(array_key_exists('bytes_received', $stats));
Ожидаемый результат
bool(true)
bool(true)

Связанные операции: mysqli_get_client_stats, mysqli_stat.

Оба входа к этой операции: mysqli_get_connection_stats, mysqli::get_connection_stats.

mysqli_get_client_statsПрочитать общую статистику mysqlnd для процесса.

PHP 5.3+; mysqlnd · mysqli; mysqlnd для отмеченных операций

mysqli_get_client_stats(): array

Приложить сведения окружения к отчёту о работе каталога. Клиентские счётчики mysqlnd охватывают несколько соединений текущего процесса. Отдельную страницу нельзя оценивать по общему числу без начального снимка.

Данные и действие: mysqli_get_client_stats
  1. mysqli_get_client_stats()
  2. Файл рядом со скриптом содержит конкретное значение client_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = mysqli_get_client_stats();
$report = ['client_stats' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение client_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Прочитать общую статистику mysqlnd для процесса.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Массив клиентских метрик; только mysqlnd. Не требует соединения аргументом. Зависит от настроек сбора mysqlnd, не является серверным мониторингом и не объединяет PHP-процессы.

Путь данных. mysqlnd учитывает соединения процесса → Функция выдаёт снимок → Код сохраняет выбранные метрики.

Как читать этот вариант. Это все соединения данного процесса PHP, не весь кластер приложения. Проверено без сети.

Получить метрики процесса без подключенияСамостоятельный пример
<?php
$stats = mysqli_get_client_stats();
var_dump(is_array($stats), array_key_exists('bytes_received', $stats));
Ожидаемый результат
bool(true)
bool(true)

Как читать этот вариант. Для сравнения операций снимайте два снимка в одном процессе. В PHP-FPM следующий запрос может попасть другому worker, поэтому глобальный счётчик сайта так не строят.

Сохранить выбранные счётчики в понятную структуруСамостоятельный пример
<?php
$stats = mysqli_get_client_stats();
$selected = ['received' => (int) $stats['bytes_received'], 'sent' => (int) $stats['bytes_sent']];
var_dump($selected['received'] >= 0, $selected['sent'] >= 0);
Ожидаемый результат
bool(true)
bool(true)

Связанные операции: mysqli_get_connection_stats, mysqli_get_links_stats.

mysqli_statПолучить краткий системный статус MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stat(mysqli $mysql): string|false; mysqli::stat(): string|false

Приложить сведения окружения к отчёту о работе каталога. Краткая строка статистики описывает серверное состояние. Для точных метрик используйте серверные средства мониторинга и права доступа.

Данные и действие: mysqli_stat
  1. $db->stat()
  2. Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->stat();
$report = ['server_status' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить краткий системный статус MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение, которому доступны сведения сервера.

Строка uptime в секундах, число потоков/запросов/reloads/open tables и другие сведения либо false при ошибке. Это состояние сервера, в отличие от mysqlnd-метрик клиента; не публикуйте техническую панель без контроля доступа.

Путь данных. Клиент запрашивает статус → Сервер возвращает сводку → Оператор анализирует нагрузку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Фактические значения зависят от нагрузки; это ожидаемая форма, не зафиксированный вывод выполненного теста.

Получить диагностическую строку сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$status = $db->stat();
echo $status, "\n";
Ожидаемый результат
Uptime: <секунды> Threads: <число> Questions: <число> ...

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не превращайте формат строки mysqladmin status в строгий протокол бизнес-логики. Для мониторинга конкретных показателей изучают SHOW GLOBAL STATUS и права доступа.

Обработать отсутствие ответа статусаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$status = mysqli_stat($db);
if ($status === false) { throw new RuntimeException('Статус сервера недоступен'); }
echo str_contains($status, 'Uptime:') ? 'Статус получен' : 'Неизвестный формат';
echo "\n";
Ожидаемый результат
Статус получен

Связанные операции: mysqli_get_connection_stats, mysqli_get_server_info.

Оба входа к этой операции: mysqli_stat, mysqli::stat.

mysqli::statПолучить краткий системный статус MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_stat(mysqli $mysql): string|false; mysqli::stat(): string|false

Приложить сведения окружения к отчёту о работе каталога. Краткая строка статистики описывает серверное состояние. Для точных метрик используйте серверные средства мониторинга и права доступа.

Данные и действие: mysqli::stat
  1. $db->stat()
  2. Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
  3. После выполнения: Сведения соединения сохранены в diagnostic.json · Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Приложить сведения окружения к отчёту о работе каталогаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$details = $db->stat();
$report = ['server_status' => $details, 'product' => $row];
$json = json_encode($report, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
if (file_put_contents(__DIR__ . '/diagnostic.json', $json) === false) { throw new RuntimeException('Нет права записать diagnostic.json'); }
echo "Сведения соединения сохранены в diagnostic.json\n";
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Сведения соединения сохранены в diagnostic.json
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.

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

Получить краткий системный статус MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlСоединение, которому доступны сведения сервера.

Строка uptime в секундах, число потоков/запросов/reloads/open tables и другие сведения либо false при ошибке. Это состояние сервера, в отличие от mysqlnd-метрик клиента; не публикуйте техническую панель без контроля доступа.

Путь данных. Клиент запрашивает статус → Сервер возвращает сводку → Оператор анализирует нагрузку.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Фактические значения зависят от нагрузки; это ожидаемая форма, не зафиксированный вывод выполненного теста.

Получить диагностическую строку сервераПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$status = $db->stat();
echo $status, "\n";
Ожидаемый результат
Uptime: <секунды> Threads: <число> Questions: <число> ...

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Не превращайте формат строки mysqladmin status в строгий протокол бизнес-логики. Для мониторинга конкретных показателей изучают SHOW GLOBAL STATUS и права доступа.

Обработать отсутствие ответа статусаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$status = mysqli_stat($db);
if ($status === false) { throw new RuntimeException('Статус сервера недоступен'); }
echo str_contains($status, 'Uptime:') ? 'Статус получен' : 'Неизвестный формат';
echo "\n";
Ожидаемый результат
Статус получен

Связанные операции: mysqli_get_connection_stats, mysqli_get_server_info.

Оба входа к этой операции: mysqli_stat, mysqli::stat.

mysqli_pingРаспознать историческую проверку доступности соединения.

PHP 5+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_ping(mysqli $mysql): bool; mysqli::ping(): bool

Проверить возможность прочитать каталог без устаревшего ping. ping устарел; успешный отдельный ping всё равно не гарантирует успех следующего SELECT. Обрабатывайте отказ самой требуемой операции; автоматическое переподключение может потерять транзакцию.

Данные и действие: mysqli_ping
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить возможность прочитать каталог без устаревшего pingПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать историческую проверку доступности соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlРанее открытое соединение.

true/false; deprecated с PHP 8.4. В старой libmysqlclient мог выполняться reconnect при включённой настройке; mysqlnd эту возможность не поддерживал, mysqli.reconnect удалён с 8.2. Проверка не гарантирует успех следующей команды. Новый код обрабатывает отказ самой операции; для отдельного health check использует ограниченный SELECT 1 с тайм-аутом.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Старый ping проверял сессию → Полезный SQL всё равно может отказать → Современный код обрабатывает его отказ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. На PHP 8.4+ показана замена для явной диагностики: ping deprecated. Успех проверки не гарантирует, что следующий полезный запрос не откажет через миллисекунду.

Понять старую проверку живого соединенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) {
    var_dump($db->ping());
} else {
    echo $db->query('SELECT 1')->fetch_column(), "\n";
}
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без предварительного ping нет лишнего round trip. Для переподключения приложение создаёт новое соединение и восстанавливает настройки осознанно; незавершённая транзакция при этом не продолжается.

Обработать отказ самого полезного запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    echo $db->query('SELECT 42')->fetch_column(), "\n";
} catch (mysqli_sql_exception $error) {
    echo 'Сервис временно не может прочитать данные', "\n";
}
Ожидаемый результат
42

Связанные операции: mysqli_query, mysqli_connect.

Оба входа к этой операции: mysqli_ping, mysqli::ping.

mysqli::pingРаспознать историческую проверку доступности соединения.

PHP 5+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_ping(mysqli $mysql): bool; mysqli::ping(): bool

Проверить возможность прочитать каталог без устаревшего ping. ping устарел; успешный отдельный ping всё равно не гарантирует успех следующего SELECT. Обрабатывайте отказ самой требуемой операции; автоматическое переподключение может потерять транзакцию.

Данные и действие: mysqli::ping
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Проверить возможность прочитать каталог без устаревшего pingПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать историческую проверку доступности соединения.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlРанее открытое соединение.

true/false; deprecated с PHP 8.4. В старой libmysqlclient мог выполняться reconnect при включённой настройке; mysqlnd эту возможность не поддерживал, mysqli.reconnect удалён с 8.2. Проверка не гарантирует успех следующей команды. Новый код обрабатывает отказ самой операции; для отдельного health check использует ограниченный SELECT 1 с тайм-аутом.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Старый ping проверял сессию → Полезный SQL всё равно может отказать → Современный код обрабатывает его отказ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. На PHP 8.4+ показана замена для явной диагностики: ping deprecated. Успех проверки не гарантирует, что следующий полезный запрос не откажет через миллисекунду.

Понять старую проверку живого соединенияПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) {
    var_dump($db->ping());
} else {
    echo $db->query('SELECT 1')->fetch_column(), "\n";
}
Ожидаемый результат
1

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Без предварительного ping нет лишнего round trip. Для переподключения приложение создаёт новое соединение и восстанавливает настройки осознанно; незавершённая транзакция при этом не продолжается.

Обработать отказ самого полезного запросаПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    echo $db->query('SELECT 42')->fetch_column(), "\n";
} catch (mysqli_sql_exception $error) {
    echo 'Сервис временно не может прочитать данные', "\n";
}
Ожидаемый результат
42

Связанные операции: mysqli_query, mysqli_connect.

Оба входа к этой операции: mysqli_ping, mysqli::ping.

mysqli_killПонять и заменить старую административную отмену серверной сессии.

PHP 5+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_kill(mysqli $mysql, int $process_id): bool; mysqli::kill(int $process_id): bool

Завершить собственную сессию через close. kill устарел и требует осознанного выбора серверного thread ID. Для собственного уже завершённого учебного соединения достаточно close; это не универсальная замена административному KILL QUERY.

Данные и действие: mysqli_kill
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Завершить собственную сессию через closeПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Понять и заменить старую административную отмену серверной сессии.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$process_idСерверный ID целевой сессии, полученный из доверенного thread_id.

true/false; deprecated с 8.4, применяйте KILL CONNECTION/QUERY. Нужны соответствующие серверные права, чужие сессии не трогают без административной задачи. Для остановки только SQL используйте KILL QUERY. После пересоединения ID меняется, поэтому старый ID нельзя слепо использовать.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Владелец знает ID своей работы → Административное соединение посылает KILL → Сервер прерывает SQL или сессию → Рабочий код получает отказ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекстный пример только для двух своих соединений из отдельной учебной базы; сервер должен разрешать завершение собственных сессий. Не подставляйте ID чужого процесса или ввод HTTP.

Завершить только собственное второе учебное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$worker = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$id = (int) $worker->thread_id;
if (PHP_VERSION_ID < 80400) { $db->kill($id); }
else { $db->query('KILL CONNECTION ' . $id); }
echo 'Учебная сессия закрыта', "\n";
Ожидаемый результат
Учебная сессия закрыта

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется mysqlnd и права на свою сессию; серверная гонка возможна, если запрос успел завершиться. KILL QUERY оставляет соединение, KILL CONNECTION закрывает. Пример не выполнялся при локальной проверке.

Отличить отмену SQL от закрытия сессииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$worker = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$worker->query('SELECT SLEEP(10)', MYSQLI_ASYNC);
$id = (int) $worker->thread_id;
$db->query('KILL QUERY ' . $id);
try { $worker->reap_async_query(); } catch (mysqli_sql_exception $error) {
    echo 'Запрос прерван', "\n";
}
$worker->close();
Ожидаемый результат
Запрос прерван

Связанные операции: mysqli_thread_id, mysqli_poll.

Оба входа к этой операции: mysqli_kill, mysqli::kill.

mysqli::killПонять и заменить старую административную отмену серверной сессии.

PHP 5+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_kill(mysqli $mysql, int $process_id): bool; mysqli::kill(int $process_id): bool

Завершить собственную сессию через close. kill устарел и требует осознанного выбора серверного thread ID. Для собственного уже завершённого учебного соединения достаточно close; это не универсальная замена административному KILL QUERY.

Данные и действие: mysqli::kill
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Завершить собственную сессию через closeПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Понять и заменить старую административную отмену серверной сессии.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$process_idСерверный ID целевой сессии, полученный из доверенного thread_id.

true/false; deprecated с 8.4, применяйте KILL CONNECTION/QUERY. Нужны соответствующие серверные права, чужие сессии не трогают без административной задачи. Для остановки только SQL используйте KILL QUERY. После пересоединения ID меняется, поэтому старый ID нельзя слепо использовать.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Владелец знает ID своей работы → Административное соединение посылает KILL → Сервер прерывает SQL или сессию → Рабочий код получает отказ.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекстный пример только для двух своих соединений из отдельной учебной базы; сервер должен разрешать завершение собственных сессий. Не подставляйте ID чужого процесса или ввод HTTP.

Завершить только собственное второе учебное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$worker = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$id = (int) $worker->thread_id;
if (PHP_VERSION_ID < 80400) { $db->kill($id); }
else { $db->query('KILL CONNECTION ' . $id); }
echo 'Учебная сессия закрыта', "\n";
Ожидаемый результат
Учебная сессия закрыта

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется mysqlnd и права на свою сессию; серверная гонка возможна, если запрос успел завершиться. KILL QUERY оставляет соединение, KILL CONNECTION закрывает. Пример не выполнялся при локальной проверке.

Отличить отмену SQL от закрытия сессииПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
$worker = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$worker->query('SELECT SLEEP(10)', MYSQLI_ASYNC);
$id = (int) $worker->thread_id;
$db->query('KILL QUERY ' . $id);
try { $worker->reap_async_query(); } catch (mysqli_sql_exception $error) {
    echo 'Запрос прерван', "\n";
}
$worker->close();
Ожидаемый результат
Запрос прерван

Связанные операции: mysqli_thread_id, mysqli_poll.

Оба входа к этой операции: mysqli_kill, mysqli::kill.

mysqli_refreshРазобрать старый административный API сброса/перезагрузки серверного состояния.

PHP 5.3+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_refresh(mysqli $mysql, int $flags): bool; mysqli::refresh(int $flags): bool

Оставить обслуживание сервера за административным соединением. refresh — устаревший административный механизм. Читателю каталога не требуется FLUSH; конкретную серверную операцию обслуживания выбирают отдельно с администратором и нужными правами.

Данные и действие: mysqli_refresh
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Оставить обслуживание сервера за административным соединениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Разобрать старый административный API сброса/перезагрузки серверного состояния.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_REFRESH_*; её эффект зависит от конкретного флага и сервера.

true/false. Deprecated с PHP 8.4; используйте явные FLUSH SQL-команды, поддерживаемые вашей версией MySQL. GRANT — права, LOG — журналы, TABLES — таблицы, HOSTS — host cache, STATUS — счётчики, THREADS — thread cache; REPLICA/SLAVE и MASTER относятся к состоянию репликации и особенно опасны без плана администратора. Не все исторические флаги имеют современный прямой эквивалент.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Администратор выбирает конкретное обслуживание → Явная команда показывает эффект → Сервер выполняет её при нужных правах.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельный учебный сервер администратора с нужными правами. FLUSH STATUS изменяет диагностические счётчики; это не способ ускорить любую страницу и не действие пользователя сайта.

Заменить исторический сброс счётчиковПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) { $db->refresh(MYSQLI_REFRESH_STATUS); }
else { $db->query('FLUSH STATUS'); }
echo 'Команда отправлена', "\n";
Ожидаемый результат
Команда отправлена

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Нужны административные права и заранее заданная политика журналов отдельного тестового сервера. Команда влияет на журналы всего сервера, поэтому в работающем приложении её не вызывают по случайной кнопке.

Сопоставить старый флаг с явным FLUSHПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) { mysqli_refresh($db, MYSQLI_REFRESH_LOG); }
else { $db->query('FLUSH LOGS'); }
echo 'Ротация запрошена', "\n";
Ожидаемый результат
Ротация запрошена

Связанные операции: mysqli_stat.

Оба входа к этой операции: mysqli_refresh, mysqli::refresh.

mysqli::refreshРазобрать старый административный API сброса/перезагрузки серверного состояния.

PHP 5.3+; deprecated 8.4 · mysqli; mysqlnd для отмеченных операций

mysqli_refresh(mysqli $mysql, int $flags): bool; mysqli::refresh(int $flags): bool

Оставить обслуживание сервера за административным соединением. refresh — устаревший административный механизм. Читателю каталога не требуется FLUSH; конкретную серверную операцию обслуживания выбирают отдельно с администратором и нужными правами.

Данные и действие: mysqli::refresh
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Оставить обслуживание сервера за административным соединениемПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Разобрать старый административный API сброса/перезагрузки серверного состояния.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$flagsБитовая маска MYSQLI_REFRESH_*; её эффект зависит от конкретного флага и сервера.

true/false. Deprecated с PHP 8.4; используйте явные FLUSH SQL-команды, поддерживаемые вашей версией MySQL. GRANT — права, LOG — журналы, TABLES — таблицы, HOSTS — host cache, STATUS — счётчики, THREADS — thread cache; REPLICA/SLAVE и MASTER относятся к состоянию репликации и особенно опасны без плана администратора. Не все исторические флаги имеют современный прямой эквивалент.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Администратор выбирает конкретное обслуживание → Явная команда показывает эффект → Сервер выполняет её при нужных правах.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Только отдельный учебный сервер администратора с нужными правами. FLUSH STATUS изменяет диагностические счётчики; это не способ ускорить любую страницу и не действие пользователя сайта.

Заменить исторический сброс счётчиковПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) { $db->refresh(MYSQLI_REFRESH_STATUS); }
else { $db->query('FLUSH STATUS'); }
echo 'Команда отправлена', "\n";
Ожидаемый результат
Команда отправлена

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Нужны административные права и заранее заданная политика журналов отдельного тестового сервера. Команда влияет на журналы всего сервера, поэтому в работающем приложении её не вызывают по случайной кнопке.

Сопоставить старый флаг с явным FLUSHПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
if (PHP_VERSION_ID < 80400) { mysqli_refresh($db, MYSQLI_REFRESH_LOG); }
else { $db->query('FLUSH LOGS'); }
echo 'Ротация запрошена', "\n";
Ожидаемый результат
Ротация запрошена

Связанные операции: mysqli_stat.

Оба входа к этой операции: mysqli_refresh, mysqli::refresh.

mysqli_debugНастроить низкоуровневую отладочную трассировку клиента MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_debug(string $options): true; mysqli::debug(string $options): true

Диагностировать запрос средствами исключений и собственного журнала. mysqli_debug зависит от отладочной сборки клиентской библиотеки и не предоставляет универсальную SQL-трассировку mysqlnd. Начните с сообщения исключения, времени и идентификатора операции в журнале приложения.

Данные и действие: mysqli_debug
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Диагностировать запрос средствами исключений и собственного журналаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Настроить низкоуровневую отладочную трассировку клиента MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$optionsПоля через :, в каждом флаг и модификаторы через запятые; o,путь задаёт файл.

С PHP 8.0 всегда true при нормальном вызове, ранее bool. Поддержка реальной трассы зависит от сборки отладки Fred Fish/mysqlnd. Флаги: O flush, A/a append, F имя файла исходника, i PID, L строка исходника, m memory calls, n уровень, o файл вывода, T время, t trace, x профилирование вызовов. Это не универсальный лог произвольной переменной приложения.

Путь данных. Строка задаёт флаги трассы → Клиент выполняет операции → Отладочная сборка записывает сведения → Разработчик анализирует закрытый файл.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекстный пример настройки: запись зависит от сборки/поддержки отладки и последующих операций. Возврат true не доказывает появление полезной трассы. Файл держат вне web-root с закрытым доступом.

Задать файл диагностической трассировки клиентаПример для указанного окружения
<?php
$path = sys_get_temp_dir() . '/course-mysqlnd.trace';
mysqli_debug('t:o,' . $path);
echo 'Настройка трассировки передана', "\n";
Ожидаемый результат
Настройка трассировки передана

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Трассировка увеличивает объём IO и может содержать чувствительные сведения запросов. Используйте ограниченный интервал на учебной/диагностической среде, не включайте бесконтрольно для всех запросов.

Добавить время и PID к локальной диагностикеПример для указанного окружения
<?php
$db = new mysqli();
$path = sys_get_temp_dir() . '/course-mysqlnd-profile.trace';
$db->debug('t:T:i:A:o,' . $path);
echo 'Режим диагностики задан', "\n";
Ожидаемый результат
Режим диагностики задан

Связанные операции: mysqli_get_connection_stats, mysqli_dump_debug_info.

Оба входа к этой операции: mysqli_debug, mysqli::debug.

mysqli::debugНастроить низкоуровневую отладочную трассировку клиента MySQL.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_debug(string $options): true; mysqli::debug(string $options): true

Диагностировать запрос средствами исключений и собственного журнала. mysqli_debug зависит от отладочной сборки клиентской библиотеки и не предоставляет универсальную SQL-трассировку mysqlnd. Начните с сообщения исключения, времени и идентификатора операции в журнале приложения.

Данные и действие: mysqli::debug
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Диагностировать запрос средствами исключений и собственного журналаПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Настроить низкоуровневую отладочную трассировку клиента MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$optionsПоля через :, в каждом флаг и модификаторы через запятые; o,путь задаёт файл.

С PHP 8.0 всегда true при нормальном вызове, ранее bool. Поддержка реальной трассы зависит от сборки отладки Fred Fish/mysqlnd. Флаги: O flush, A/a append, F имя файла исходника, i PID, L строка исходника, m memory calls, n уровень, o файл вывода, T время, t trace, x профилирование вызовов. Это не универсальный лог произвольной переменной приложения.

Путь данных. Строка задаёт флаги трассы → Клиент выполняет операции → Отладочная сборка записывает сведения → Разработчик анализирует закрытый файл.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Контекстный пример настройки: запись зависит от сборки/поддержки отладки и последующих операций. Возврат true не доказывает появление полезной трассы. Файл держат вне web-root с закрытым доступом.

Задать файл диагностической трассировки клиентаПример для указанного окружения
<?php
$path = sys_get_temp_dir() . '/course-mysqlnd.trace';
mysqli_debug('t:o,' . $path);
echo 'Настройка трассировки передана', "\n";
Ожидаемый результат
Настройка трассировки передана

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Трассировка увеличивает объём IO и может содержать чувствительные сведения запросов. Используйте ограниченный интервал на учебной/диагностической среде, не включайте бесконтрольно для всех запросов.

Добавить время и PID к локальной диагностикеПример для указанного окружения
<?php
$db = new mysqli();
$path = sys_get_temp_dir() . '/course-mysqlnd-profile.trace';
$db->debug('t:T:i:A:o,' . $path);
echo 'Режим диагностики задан', "\n";
Ожидаемый результат
Режим диагностики задан

Связанные операции: mysqli_get_connection_stats, mysqli_dump_debug_info.

Оба входа к этой операции: mysqli_debug, mysqli::debug.

mysqli_dump_debug_infoПопросить MySQL записать сведения отладки в серверный журнал.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_dump_debug_info(mysqli $mysql): bool; mysqli::dump_debug_info(): bool

Сохранить воспроизводимые данные запроса локально. dump_debug_info пишет служебную информацию в серверный журнал и требует привилегий. Для отправки разработчику воспроизводимого случая удобнее отдельная учебная схема и локальный отчёт.

Данные и действие: mysqli_dump_debug_info
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить воспроизводимые данные запроса локальноПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Попросить MySQL записать сведения отладки в серверный журнал.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlАдминистративное соединение с нужными правами.

true/false или SQL-ошибка. Официально предназначено пользователю SUPER; точная привилегия и состав журнала зависят от версии сервера. Это серверный журнал, в отличие от mysqli_debug клиентской библиотеки. Прикладному пользователю не выдают лишние права только ради этого вызова.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Клиент просит диагностику → Сервер проверяет права → Сведения попадают в его журнал.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется отдельный учебный сервер и административный пользователь с необходимыми правами (официальная страница указывает SUPER). Обычный пользователь course_user без них получит отказ; файл PHP этим не создаётся.

Запросить серверную диагностику в его журналПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
var_dump($db->dump_debug_info());
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается для учебного пользователя без административной привилегии. Наличие таких прав не нужно обычному интернет-магазину ради удобства отладки.

Предусмотреть отказ обычному пользователюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    mysqli_dump_debug_info($db);
    echo 'Запрос диагностики разрешён', "\n";
} catch (mysqli_sql_exception $error) {
    echo 'Недостаточно серверных прав', "\n";
}
Ожидаемый результат
Недостаточно серверных прав

Связанные операции: mysqli_debug, mysqli_stat.

Оба входа к этой операции: mysqli_dump_debug_info, mysqli::dump_debug_info.

mysqli::dump_debug_infoПопросить MySQL записать сведения отладки в серверный журнал.

PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций

mysqli_dump_debug_info(mysqli $mysql): bool; mysqli::dump_debug_info(): bool

Сохранить воспроизводимые данные запроса локально. dump_debug_info пишет служебную информацию в серверный журнал и требует привилегий. Для отправки разработчику воспроизводимого случая удобнее отдельная учебная схема и локальный отчёт.

Данные и действие: mysqli::dump_debug_info
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Сохранить воспроизводимые данные запроса локальноПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Попросить MySQL записать сведения отладки в серверный журнал.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$mysqlАдминистративное соединение с нужными правами.

true/false или SQL-ошибка. Официально предназначено пользователю SUPER; точная привилегия и состав журнала зависят от версии сервера. Это серверный журнал, в отличие от mysqli_debug клиентской библиотеки. Прикладному пользователю не выдают лишние права только ради этого вызова.

SQL-ошибка при MYSQLI_REPORT_ERROR выдаёт warning, при сочетании с MYSQLI_REPORT_STRICT — mysqli_sql_exception; с PHP 8.1 это сочетание включено по умолчанию. В примерах оно задано явно. Ошибки типов, закрытого объекта и неверных аргументов могут возникать отдельно; сырое сообщение SQL не публикуют посетителю.

Путь данных. Клиент просит диагностику → Сервер проверяет права → Сведения попадают в его журнал.

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Требуется отдельный учебный сервер и административный пользователь с необходимыми правами (официальная страница указывает SUPER). Обычный пользователь course_user без них получит отказ; файл PHP этим не создаётся.

Запросить серверную диагностику в его журналПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
var_dump($db->dump_debug_info());
Ожидаемый результат
bool(true)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Ожидается для учебного пользователя без административной привилегии. Наличие таких прав не нужно обычному интернет-магазину ради удобства отладки.

Предусмотреть отказ обычному пользователюПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
try {
    mysqli_dump_debug_info($db);
    echo 'Запрос диагностики разрешён', "\n";
} catch (mysqli_sql_exception $error) {
    echo 'Недостаточно серверных прав', "\n";
}
Ожидаемый результат
Недостаточно серверных прав

Связанные операции: mysqli_debug, mysqli_stat.

Оба входа к этой операции: mysqli_dump_debug_info, mysqli::dump_debug_info.

mysqli_embedded_server_startРаспознать удалённый API запуска встроенного MySQL в старом коде.

PHP 5.1–7.3; удалён 7.4 · mysqli; mysqlnd для отмеченных операций

mysqli_embedded_server_start(int $start, array $arguments, array $groups): bool; mysqli_driver::embedded_server_start(int $start, array $arguments, array $groups): bool

Использовать обычный MySQL вместо удалённого embedded-сервера. embedded_server_start/end удалены в PHP7.4, свойство embedded — в PHP 8.0. Учебный config.php подключается к отдельному локальному серверу. Если отдельный сервис вообще не нужен, SQLite — другая СУБД с собственными правилами.

Данные и действие: mysqli_embedded_server_start
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Использовать обычный MySQL вместо удалённого embedded-сервераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённый API запуска встроенного MySQL в старом коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$startИсторический режим старта embedded-сборки.
$arguments / $groupsМассивы аргументов и групп конфигурации той сборки; актуальная страница не описывает подробный контракт.

Удалён с PHP 7.4, был в PHP 5.1–7.3 при подходящей библиотеке. В современной PHP вызов отсутствующей функции даст Error. Официальная страница хранит только сигнатуру: не выдаём придуманные значения параметров за переносимую конфигурацию. Новый проект использует отдельный сервер или SQLite по задаче.

Путь данных. Старый проект искал embedded API → Проверка обнаруживает отсутствие → Архитектура подключения переводится на поддерживаемый вариант.

Как читать этот вариант. В PHP 8.5.11 этих функций нет. Они относились к старой сборке embedded MySQL, а не к обычному соединению с отдельным MySQL-сервером.

Узнать, что встроенный сервер удалёнСамостоятельный пример
<?php
var_dump(function_exists('mysqli_embedded_server_start'));
var_dump(function_exists('mysqli_embedded_server_end'));
Ожидаемый результат
bool(false)
bool(false)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Запуск/остановка MySQL теперь относится к службе или изолированному тестовому окружению, а не к embedded-функции PHP. Для БД внутри приложения без отдельного сервера сравните SQLite.

Современная замена: отдельный сервер и обычное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
$db->close();
Ожидаемый результат
42

Связанные операции: mysqli_connect.

Оба входа к этой операции: mysqli_embedded_server_start, mysqli_driver::embedded_server_start.

mysqli_driver::embedded_server_startРаспознать удалённый API запуска встроенного MySQL в старом коде.

PHP 5.1–7.3; удалён 7.4 · mysqli; mysqlnd для отмеченных операций

mysqli_embedded_server_start(int $start, array $arguments, array $groups): bool; mysqli_driver::embedded_server_start(int $start, array $arguments, array $groups): bool

Использовать обычный MySQL вместо удалённого embedded-сервера. embedded_server_start/end удалены в PHP7.4, свойство embedded — в PHP 8.0. Учебный config.php подключается к отдельному локальному серверу. Если отдельный сервис вообще не нужен, SQLite — другая СУБД с собственными правилами.

Данные и действие: mysqli_driver::embedded_server_start
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Использовать обычный MySQL вместо удалённого embedded-сервераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённый API запуска встроенного MySQL в старом коде.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать
$startИсторический режим старта embedded-сборки.
$arguments / $groupsМассивы аргументов и групп конфигурации той сборки; актуальная страница не описывает подробный контракт.

Удалён с PHP 7.4, был в PHP 5.1–7.3 при подходящей библиотеке. В современной PHP вызов отсутствующей функции даст Error. Официальная страница хранит только сигнатуру: не выдаём придуманные значения параметров за переносимую конфигурацию. Новый проект использует отдельный сервер или SQLite по задаче.

Путь данных. Старый проект искал embedded API → Проверка обнаруживает отсутствие → Архитектура подключения переводится на поддерживаемый вариант.

Как читать этот вариант. В PHP 8.5.11 этих функций нет. Они относились к старой сборке embedded MySQL, а не к обычному соединению с отдельным MySQL-сервером.

Узнать, что встроенный сервер удалёнСамостоятельный пример
<?php
var_dump(function_exists('mysqli_embedded_server_start'));
var_dump(function_exists('mysqli_embedded_server_end'));
Ожидаемый результат
bool(false)
bool(false)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Запуск/остановка MySQL теперь относится к службе или изолированному тестовому окружению, а не к embedded-функции PHP. Для БД внутри приложения без отдельного сервера сравните SQLite.

Современная замена: отдельный сервер и обычное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
$db->close();
Ожидаемый результат
42

Связанные операции: mysqli_connect.

Оба входа к этой операции: mysqli_embedded_server_start, mysqli_driver::embedded_server_start.

mysqli_embedded_server_endРаспознать удалённое завершение встроенного MySQL.

PHP 5.1–7.3; удалён 7.4 · mysqli; mysqlnd для отмеченных операций

mysqli_embedded_server_end(): void; mysqli_driver::embedded_server_end(): void

Использовать обычный MySQL вместо удалённого embedded-сервера. embedded_server_start/end удалены в PHP7.4, свойство embedded — в PHP 8.0. Учебный config.php подключается к отдельному локальному серверу. Если отдельный сервис вообще не нужен, SQLite — другая СУБД с собственными правилами.

Данные и действие: mysqli_embedded_server_end
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Использовать обычный MySQL вместо удалённого embedded-сервераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённое завершение встроенного MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Удалён в PHP 7.4; исторически ничего не возвращал и завершал embedded server. mysqli_close закрывает соединение, а не останавливает общий сервер: это правильная граница ответственности современного веб-приложения.

Путь данных. Старый embedded-сервер имел свой жизненный цикл → Современный PHP закрывает своё соединение → Службой MySQL управляет окружение.

Как читать этот вариант. В PHP 8.5.11 этих функций нет. Они относились к старой сборке embedded MySQL, а не к обычному соединению с отдельным MySQL-сервером.

Узнать, что встроенный сервер удалёнСамостоятельный пример
<?php
var_dump(function_exists('mysqli_embedded_server_start'));
var_dump(function_exists('mysqli_embedded_server_end'));
Ожидаемый результат
bool(false)
bool(false)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Запуск/остановка MySQL теперь относится к службе или изолированному тестовому окружению, а не к embedded-функции PHP. Для БД внутри приложения без отдельного сервера сравните SQLite.

Современная замена: отдельный сервер и обычное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
$db->close();
Ожидаемый результат
42

Связанные операции: mysqli_close.

Оба входа к этой операции: mysqli_embedded_server_end, mysqli_driver::embedded_server_end.

mysqli_driver::embedded_server_endРаспознать удалённое завершение встроенного MySQL.

PHP 5.1–7.3; удалён 7.4 · mysqli; mysqlnd для отмеченных операций

mysqli_embedded_server_end(): void; mysqli_driver::embedded_server_end(): void

Использовать обычный MySQL вместо удалённого embedded-сервера. embedded_server_start/end удалены в PHP7.4, свойство embedded — в PHP 8.0. Учебный config.php подключается к отдельному локальному серверу. Если отдельный сервис вообще не нужен, SQLite — другая СУБД с собственными правилами.

Данные и действие: mysqli_driver::embedded_server_end
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Использовать обычный MySQL вместо удалённого embedded-сервераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённое завершение встроенного MySQL.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Удалён в PHP 7.4; исторически ничего не возвращал и завершал embedded server. mysqli_close закрывает соединение, а не останавливает общий сервер: это правильная граница ответственности современного веб-приложения.

Путь данных. Старый embedded-сервер имел свой жизненный цикл → Современный PHP закрывает своё соединение → Службой MySQL управляет окружение.

Как читать этот вариант. В PHP 8.5.11 этих функций нет. Они относились к старой сборке embedded MySQL, а не к обычному соединению с отдельным MySQL-сервером.

Узнать, что встроенный сервер удалёнСамостоятельный пример
<?php
var_dump(function_exists('mysqli_embedded_server_start'));
var_dump(function_exists('mysqli_embedded_server_end'));
Ожидаемый результат
bool(false)
bool(false)

Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Запуск/остановка MySQL теперь относится к службе или изолированному тестовому окружению, а не к embedded-функции PHP. Для БД внутри приложения без отдельного сервера сравните SQLite.

Современная замена: отдельный сервер и обычное соединениеПример для указанного окружения
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', 'course_user', 'course_password', 'course_demo', 3306);
$db->set_charset('utf8mb4');
echo $db->query('SELECT 42')->fetch_column(), "\n";
$db->close();
Ожидаемый результат
42

Связанные операции: mysqli_close.

Оба входа к этой операции: mysqli_embedded_server_end, mysqli_driver::embedded_server_end.

mysqli_driver::$driver_versionПонять старый числовой номер драйвера MySQLi.

PHP 5+; deprecated 8.1 · mysqli; mysqlnd для отмеченных операций

readonly mysqli_driver::$driver_version: int

Записать поддерживаемые сведения драйвера. Историческое свойство driver_version нельзя считать переносимым способом диагностики современных PHP. Получайте сведения клиентской библиотеки через поддерживаемый mysqli_get_client_info и сверяйте контракт версии ниже.

Данные и действие: mysqli_driver::$driver_version
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Записать поддерживаемые сведения драйвераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Понять старый числовой номер драйвера MySQLi.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Deprecated с PHP 8.1. Это не номер сервера и не надёжная универсальная проверка возможностей. Для диагностики читают client_info/client_version и server_info; наличие конкретного API проверяют function_exists/method_exists.

Путь данных. Старый код читает driver_version → Новый выбирает нужное понятие версии → Конкретная функция проверяется напрямую.

Как читать этот вариант. driver_version deprecated с 8.1. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.

Заменить чтение deprecated driver_versionСамостоятельный пример
<?php
$driver = new mysqli_driver();
if (PHP_VERSION_ID < 80100) { echo $driver->driver_version, "\n"; }
else { echo 'Используйте сведения клиента: ', $driver->client_info, "\n"; }
Ожидаемый результат
Используйте сведения клиента: mysqlnd 8.5.11

Как читать этот вариант. В проверочной PHP 8.5.11 execute_query есть, quote_string относится к PHP 8.6. Проверка символа яснее сравнения старого driver_version.

Проверить нужную возможность напрямуюСамостоятельный пример
<?php
var_dump(method_exists(mysqli::class, 'execute_query'));
var_dump(method_exists(mysqli::class, 'quote_string'));
Ожидаемый результат
bool(true)
bool(false)

Связанные операции: mysqli_get_client_info, mysqli_get_server_info.

mysqli_driver::$embeddedРаспознать удалённое свойство embedded.

Удалён 8.0 · mysqli; mysqlnd для отмеченных операций

Историческое mysqli_driver::$embedded

Использовать обычный MySQL вместо удалённого embedded-сервера. embedded_server_start/end удалены в PHP7.4, свойство embedded — в PHP 8.0. Учебный config.php подключается к отдельному локальному серверу. Если отдельный сервис вообще не нужен, SQLite — другая СУБД с собственными правилами.

Данные и действие: mysqli_driver::$embedded
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Использовать обычный MySQL вместо удалённого embedded-сервераПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённое свойство embedded.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Исторический bool поддержки embedded MySQL; сами embedded_server_start/end удалены раньше, в 7.4. Не создавайте динамическое одноимённое свойство в надежде вернуть удалённую функцию: оно не настраивает драйвер.

Путь данных. Старое свойство удалено → Приложение выбирает современное управление соединением → Незавершённая операция обрабатывается отдельно.

Как читать этот вариант. driver_version deprecated с 8.1. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.

Заменить чтение deprecated driver_versionСамостоятельный пример
<?php
$driver = new mysqli_driver();
if (PHP_VERSION_ID < 80100) { echo $driver->driver_version, "\n"; }
else { echo 'Используйте сведения клиента: ', $driver->client_info, "\n"; }
Ожидаемый результат
Используйте сведения клиента: mysqlnd 8.5.11

Как читать этот вариант. В проверочной PHP 8.5.11 execute_query есть, quote_string относится к PHP 8.6. Проверка символа яснее сравнения старого driver_version.

Проверить нужную возможность напрямуюСамостоятельный пример
<?php
var_dump(method_exists(mysqli::class, 'execute_query'));
var_dump(method_exists(mysqli::class, 'quote_string'));
Ожидаемый результат
bool(true)
bool(false)

Связанные операции: mysqli_connect, mysqli_ping.

mysqli_driver::$reconnectРаспознать удалённое свойство reconnect.

Удалён 8.2 · mysqli; mysqlnd для отмеченных операций

Историческое mysqli_driver::$reconnect

Явно обрабатывать потерю соединения. Историческая настройка reconnect не даёт современной гарантии восстановления. Повторное соединение создаёт новую сессию: временные таблицы, блокировки и транзакции прежней сессии потеряны.

Данные и действие: mysqli_driver::$reconnect
  1. $db->query(...)
  2. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
  3. После выполнения: Молоток — 8 шт.

В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.

Запись в этом примереКак читать
$db->method(...)Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =.
[...]Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации.
Явно обрабатывать потерю соединенияПример для указанного окружения
<?php
require __DIR__ . '/catalog.php';
$result = $db->query('SELECT name, stock FROM products WHERE id = 1');
$row = $result->fetch_assoc();
$result->free();
$db->close();
echo $row['name'], ' — ', $row['stock'], " шт.\n";
Ожидаемый результат
Молоток — 8 шт.

Требуется указанное окружение; локально проверен PHP-синтаксис, запрос к этому серверу не выполнялся. Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.

Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.

Товар / строкаНаличие
Молоток8 шт.

Если требование изменится. Этот пример показывает современную задачу приложения, а не имитирует административные побочные эффекты старого API. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.

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

Распознать удалённое свойство reconnect.

Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.

Параметр / входЧто передать

Исторический bool автоматического reconnect. mysqlnd игнорировал такой режим; после потери соединения приложение должно заново определить безопасную границу операции. Не создавайте динамическое одноимённое свойство в надежде вернуть удалённую функцию: оно не настраивает драйвер.

Путь данных. Старое свойство удалено → Приложение выбирает современное управление соединением → Незавершённая операция обрабатывается отдельно.

Как читать этот вариант. driver_version deprecated с 8.1. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.

Заменить чтение deprecated driver_versionСамостоятельный пример
<?php
$driver = new mysqli_driver();
if (PHP_VERSION_ID < 80100) { echo $driver->driver_version, "\n"; }
else { echo 'Используйте сведения клиента: ', $driver->client_info, "\n"; }
Ожидаемый результат
Используйте сведения клиента: mysqlnd 8.5.11

Как читать этот вариант. В проверочной PHP 8.5.11 execute_query есть, quote_string относится к PHP 8.6. Проверка символа яснее сравнения старого driver_version.

Проверить нужную возможность напрямуюСамостоятельный пример
<?php
var_dump(method_exists(mysqli::class, 'execute_query'));
var_dump(method_exists(mysqli::class, 'quote_string'));
Ожидаемый результат
bool(true)
bool(false)

Связанные операции: mysqli_connect, mysqli_ping.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.