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

Дерево руководства
Глава 138 · С нуля → справочник
MySQLi: полный справочник MySQL, запросов и результатов
От первого SELECT до всех функций, методов, свойств, констант, prepared statements, транзакций, CALL, mysqlnd и настройки соединений.
Как запустить любую карточку: файлы, схема и каталог
Все новые карточки используют один небольшой каталог мастерской. Пример можно запускать отдельно: его архив содержит example.php, catalog.php, schema.sql и README. Молоток имеет остаток 8, Перчатки — 15, Кисть — 0. Ноль здесь означает известное отсутствие товара, а не пропавшую строку.
- schema.sql: структура и три известные строки
- catalog.php: подключение и создание учебных данных
- example.php: один изучаемый механизм
- 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 — набор найденных строк.
- config.php/connect.php → соединение MySQL
- catalog.php → временные products с 3 товарами
- bind_param: i связывает minimum1 с единственным ?
- 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 → товары: прочитать строки и освободить result
- следующий набор → total3: прочитать и освободить
- завершающий статус без таблицы → завершить последовательность
- теперь соединение готово для нового запроса
Именно переход от двух обычных 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
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.1 | mysqlnd по умолчанию; --with-mysqli=/path/to/mysql_config выбирал libmysqlclient. |
| 5.3 | libmysqlclient 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 / пусто / SYSTEM | PHP 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 и возвращает результат.
<?php
mysqli_report(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
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; это не нейтральный к памяти поток.
<?php
mysqli_report(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.
<?php
mysqli_report(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 меняет эту гарантию, и такой нестандартный пул требует собственной политики очистки.
<?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/сообщение.
<?php
mysqli_report(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 обычно делает сам язык.
<?php
mysqli_report(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 — две альтернативы, не два обязательных шага.
<?php
mysqli_report(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 — пятисимвольная категория. Исключение хранит сведения даже после того, как состояние соединения изменится.
<?php
mysqli_report(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_NATIVE | mysqlnd: преобразовывать подходящие целые/float колонки текстового протокола в PHP-числа в допустимом диапазоне. |
MYSQLI_OPT_NET_CMD_BUFFER_SIZE | mysqlnd: размер внутреннего командного/сетевого буфера в байтах; не max_allowed_packet сервера. |
MYSQLI_OPT_NET_READ_BUFFER_SIZE | mysqlnd: максимальная порция чтения тела сетевого пакета в байтах. |
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_RESULT | 0: полный клиентский буфер, доступен num_rows и data_seek. |
MYSQLI_USE_RESULT | 1: поток строк; соединение занято до чтения/free, произвольной перемотки нет. |
MYSQLI_STORE_RESULT_COPY_DATA | Историческая копия данных из mysqlnd-буфера; с 8.1 не влияет, deprecated 8.4 вместе с mode у store_result. |
MYSQLI_ASYNC | mysqlnd: запуск 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_FLAG | BLOB-подобный тип по серверным метаданным. |
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_BIT | BIT; не предполагает автоматически обычный PHP bool. |
MYSQLI_TYPE_TINY | TINYINT, включая числовое хранение некоторых булевых полей. |
MYSQLI_TYPE_SHORT | SMALLINT. |
MYSQLI_TYPE_LONG | INT; слово LONG здесь не гарантирует PHP int для любого диапазона. |
MYSQLI_TYPE_FLOAT | FLOAT. |
MYSQLI_TYPE_DOUBLE | DOUBLE. |
MYSQLI_TYPE_NULL | NULL-тип выражения/поля; проверка значения всё равно выполняется по полученным данным. |
MYSQLI_TYPE_TIMESTAMP | TIMESTAMP. |
MYSQLI_TYPE_LONGLONG | BIGINT; значения вне PHP_INT_MAX сохраняйте строками. |
MYSQLI_TYPE_INT24 | MEDIUMINT. |
MYSQLI_TYPE_DATE | DATE. |
MYSQLI_TYPE_TIME | TIME. |
MYSQLI_TYPE_DATETIME | DATETIME. |
MYSQLI_TYPE_YEAR | YEAR. |
MYSQLI_TYPE_NEWDATE | Исторический код DATE. |
MYSQLI_TYPE_INTERVAL | Бывший alias ENUM, удалён с PHP 8.4. |
MYSQLI_TYPE_ENUM | ENUM. |
MYSQLI_TYPE_SET | SET. |
MYSQLI_TYPE_TINY_BLOB | TINYBLOB/TINYTEXT по серверной кодировке. |
MYSQLI_TYPE_MEDIUM_BLOB | MEDIUMBLOB/MEDIUMTEXT. |
MYSQLI_TYPE_LONG_BLOB | LONGBLOB/LONGTEXT. |
MYSQLI_TYPE_BLOB | BLOB/TEXT; различие уточняют charset/flags. |
MYSQLI_TYPE_VAR_STRING | Переменная строка, например VARCHAR. |
MYSQLI_TYPE_STRING | CHAR/BINARY. |
MYSQLI_TYPE_CHAR | Историческое имя кода TINYINT; для SQL CHAR нужен MYSQLI_TYPE_STRING. |
MYSQLI_TYPE_GEOMETRY | Геометрия, не готовый PHP-объект точки. |
MYSQLI_TYPE_JSON | JSON, mysqlnd и MySQL 5.7.8+; текст при необходимости декодируют json_decode. |
MYSQLI_TYPE_VECTOR | VECTOR: 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_ENABLED | 1 при поддержке mysqli_debug сборкой; не признак уже созданного файла трассы. |
MYSQLI_IS_MARIADB | bool 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_ONLY | START TRANSACTION READ ONLY; MySQL 5.6+. |
MYSQLI_TRANS_START_READ_WRITE | START 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_REPLICA | Alias 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.4 | kill/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.3 | fetch_object с constructor_args без конструктора: ValueError вместо Exception; poll без read/error тоже ValueError. |
| 8.2 | execute_query; mysqlnd единственная клиентская библиотека mysqli. Удалены mysqli.reconnect и driver::$reconnect; get_charset state всегда 1. |
| 8.1.2 | mysqli_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.0 | fetch_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.2 | OPT_READ_TIMEOUT. Начиная с 7.2.16/7.3.3 local infile по умолчанию выключен. |
| 5.6 / 5.5 / 5.4 | get_links_stats / begin_transaction и savepoints / error_list и mysqlnd default. |
| 5.3 / 5.1 / 5.0 | mysqlnd, 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_connectmysqli_initmysqli_real_connectmysqli_optionsmysqli_set_optmysqli_ssl_setmysqli_set_charsetmysqli_character_set_namemysqli_get_charsetmysqli_select_dbmysqli_change_usermysqli_closemysqli_querymysqli_real_querymysqli_execute_querymysqli_preparemysqli_stmt_initmysqli_store_resultmysqli_use_resultmysqli_multi_querymysqli_more_resultsmysqli_next_resultmysqli_real_escape_stringmysqli_escape_stringmysqli_quote_stringmysqli_pollmysqli_reap_async_querymysqli_fetch_assocmysqli_fetch_rowmysqli_fetch_arraymysqli_fetch_allmysqli_fetch_columnmysqli_fetch_objectmysqli_data_seekmysqli_num_rowsmysqli_num_fieldsmysqli_fetch_lengthsmysqli_fetch_fieldmysqli_fetch_field_directmysqli_fetch_fieldsmysqli_field_tellmysqli_field_seekmysqli_free_resultmysqli_stmt_preparemysqli_stmt_bind_parammysqli_stmt_executemysqli_executemysqli_stmt_bind_resultmysqli_stmt_fetchmysqli_stmt_get_resultmysqli_stmt_store_resultmysqli_stmt_data_seekmysqli_stmt_free_resultmysqli_stmt_closemysqli_stmt_result_metadatamysqli_stmt_send_long_datamysqli_stmt_resetmysqli_stmt_attr_getmysqli_stmt_attr_setmysqli_stmt_param_countmysqli_stmt_field_countmysqli_stmt_num_rowsmysqli_stmt_affected_rowsmysqli_stmt_insert_idmysqli_stmt_errnomysqli_stmt_errormysqli_stmt_error_listmysqli_stmt_sqlstatemysqli_stmt_more_resultsmysqli_stmt_next_resultmysqli_stmt_get_warningsmysqli_begin_transactionmysqli_commitmysqli_rollbackmysqli_autocommitmysqli_savepointmysqli_release_savepointmysqli_reportmysqli_connect_errnomysqli_connect_errormysqli_errnomysqli_errormysqli_error_listmysqli_sqlstatemysqli_get_warningsmysqli_warning_countmysqli_affected_rowsmysqli_insert_idmysqli_field_countmysqli_infomysqli_get_client_infomysqli_get_client_versionmysqli_get_host_infomysqli_get_proto_infomysqli_get_server_infomysqli_get_server_versionmysqli_thread_idmysqli_thread_safemysqli_get_connection_statsmysqli_get_client_statsmysqli_get_links_statsmysqli_statmysqli_pingmysqli_killmysqli_refreshmysqli_debugmysqli_dump_debug_infomysqli_embedded_server_startmysqli_embedded_server_end
mysqli
mysqli::__constructmysqli::connectmysqli::initmysqli::real_connectmysqli::optionsmysqli::set_optmysqli::ssl_setmysqli::set_charsetmysqli::character_set_namemysqli::get_charsetmysqli::select_dbmysqli::change_usermysqli::closemysqli::querymysqli::real_querymysqli::execute_querymysqli::preparemysqli::stmt_initmysqli::store_resultmysqli::use_resultmysqli::multi_querymysqli::more_resultsmysqli::next_resultmysqli::real_escape_stringmysqli::escape_stringmysqli::quote_stringmysqli::pollmysqli::reap_async_querymysqli::begin_transactionmysqli::commitmysqli::rollbackmysqli::autocommitmysqli::savepointmysqli::release_savepointmysqli::$connect_errnomysqli::$connect_errormysqli::$errnomysqli::$errormysqli::$error_listmysqli::$sqlstatemysqli::get_warningsmysqli::$warning_countmysqli::$affected_rowsmysqli::$insert_idmysqli::$field_countmysqli::$infomysqli::$client_infomysqli::get_client_infomysqli::$client_versionmysqli::$host_infomysqli::$protocol_versionmysqli::$server_infomysqli::$server_versionmysqli::get_server_infomysqli::$thread_idmysqli::thread_safemysqli::get_connection_statsmysqli::statmysqli::pingmysqli::killmysqli::refreshmysqli::debugmysqli::dump_debug_info
mysqli_stmt
mysqli_stmt::__constructmysqli_stmt::preparemysqli_stmt::bind_parammysqli_stmt::executemysqli_stmt::bind_resultmysqli_stmt::fetchmysqli_stmt::get_resultmysqli_stmt::store_resultmysqli_stmt::data_seekmysqli_stmt::free_resultmysqli_stmt::closemysqli_stmt::result_metadatamysqli_stmt::send_long_datamysqli_stmt::resetmysqli_stmt::attr_getmysqli_stmt::attr_setmysqli_stmt::$param_countmysqli_stmt::$field_countmysqli_stmt::$num_rowsmysqli_stmt::num_rowsmysqli_stmt::$affected_rowsmysqli_stmt::$insert_idmysqli_stmt::$errnomysqli_stmt::$errormysqli_stmt::$error_listmysqli_stmt::$sqlstatemysqli_stmt::more_resultsmysqli_stmt::next_resultmysqli_stmt::get_warnings
mysqli_result
mysqli_result::__constructmysqli_result::fetch_assocmysqli_result::fetch_rowmysqli_result::fetch_arraymysqli_result::fetch_allmysqli_result::fetch_columnmysqli_result::fetch_objectmysqli_result::data_seekmysqli_result::$num_rowsmysqli_result::$field_countmysqli_result::$lengthsmysqli_result::fetch_fieldmysqli_result::fetch_field_directmysqli_result::fetch_fieldsmysqli_result::$current_fieldmysqli_result::field_seekmysqli_result::freemysqli_result::closemysqli_result::free_resultmysqli_result::getIteratormysqli_result::$type
mysqli_driver
mysqli_driver::$report_modemysqli_driver::$client_infomysqli_driver::$client_versionmysqli_driver::embedded_server_startmysqli_driver::embedded_server_endmysqli_driver::$driver_versionmysqli_driver::$embeddedmysqli_driver::$reconnect
mysqli_warning
mysqli_warning::nextmysqli_warning::__constructmysqli_warning::$messagemysqli_warning::$sqlstatemysqli_warning::$errno
mysqli_sql_exception
Частые практические затруднения и куда перейти
| Ситуация | Следующий шаг |
|---|---|
| Нужен товар по ID | mysqli_execute_query разделяет SQL и значения. |
| Нужно выполнить один шаблон много раз | mysqli_prepare → mysqli_stmt_bind_param → mysqli_stmt_execute. |
| Commands out of sync | mysqli_store_result / mysqli_use_result; у CALL обработать mysqli_stmt_next_result. |
| Ноль строк и NULL путаются | mysqli_fetch_assoc / mysqli_fetch_column показывают разные признаки конца. |
| Ноль affected_rows при успешном UPDATE | mysqli_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 даёт ту же возможность процедурно.
- $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 8 шт.
В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.
| Запись в этом примере | Как читать |
|---|---|
require __DIR__ . ... | Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные. |
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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. |
| $port | TCP-порт, 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 даёт ту же возможность процедурно.
- $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 8 шт.
В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.
| Запись в этом примере | Как читать |
|---|---|
require __DIR__ . ... | Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные. |
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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. |
| $port | TCP-порт, 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 даёт ту же возможность процедурно.
- $db = new mysqli($config['host'], $config['user'], $config['password'], $config['database'], $config['port']);
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 8 шт.
В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.
| Запись в этом примере | Как читать |
|---|---|
require __DIR__ . ... | Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные. |
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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. |
| $port | TCP-порт, 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 — исторический дополнительный вход, а не повторный ручной запуск конструктора.
<?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 ещё не даёт доступа к таблицам.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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 ещё не даёт доступа к таблицам.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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. |
| $port | TCP-порт, 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. Флаг выбирается осознанно, он не доказывает новое изменение.
<?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.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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. |
| $port | TCP-порт, 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. Флаг выбирается осознанно, он не доказывает новое изменение.
<?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; после успешного подключения читаем обычный товар.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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
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; после успешного подключения читаем обычный товар.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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
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; после успешного подключения читаем обычный товар.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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
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; после успешного подключения читаем обычный товар.
- $db = mysqli_init();
- Все параметры подключения лежат в config.php. seed.php создаёт временный каталог только после соединения; SELECT подтверждает не просто связь, а доступ к данным.
- После выполнения: Молоток — 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
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.
- $db->ssl_set(null, null, $ca, null, null)
- CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.
- После выполнения: После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.
В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.
| Запись в этом примере | Как читать |
|---|---|
require __DIR__ . ... | Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные. |
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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 не доказывает шифрование.
<?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.
- $db->ssl_set(null, null, $ca, null, null)
- CA не включён в архив: он должен соответствовать вашему серверу. До запроса каталога проверяем, что сессия использует шифр. Host должен совпадать с именем в сертификате.
- После выполнения: После установки собственного доверенного CA и настройки MySQL TLS: Молоток — 8 шт.
В этом самостоятельном примере подготовка указана непосредственно в коде и дополнительных файлах архива. Запуск: php example.php; требования и внешние зависимости отмечены перед кодом.
| Запись в этом примере | Как читать |
|---|---|
require __DIR__ . ... | Выполняет указанный PHP-файл из папки примера. Точка склеивает путь. Файл включён в архив; он создаёт соединение и исходные данные. |
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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 не доказывает шифрование.
<?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-страницы и не изменение старых повреждённых значений.
- $db->set_charset('utf8mb4')
- Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.
- После выполнения: Молоток — 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-страницы и не изменение старых повреждённых значений.
- $db->set_charset('utf8mb4')
- Соединение уже установлено; перед запросом явно выбираемutf8mb4. Временная таблица создана в учебной базе utf8mb4.
- После выполнения: Молоток — 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 — непосредственно строку имени.
- $db->character_set_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';
$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 — непосредственно строку имени.
- $db->character_set_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';
$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 — непосредственно строку имени.
- $db->get_charset()
- Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
- После выполнения: Молоток — 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 — непосредственно строку имени.
- $db->get_charset()
- Проверка привязана к этому соединению. После неё читаем русское название и числовой остаток.
- После выполнения: Молоток — 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 меняет базу по умолчанию у соединения; не создаёт её и не переносит туда таблицы. Имя базы приходит из доверенной конфигурации.
- $db->select_db($config['database'])
- Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.
- После выполнения: Молоток — 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-синтаксис, серверный запрос не выполнялся. Для разных арендаторов нельзя выбирать любую базу по пользовательскому имени. Пул и состояние соединения требуют явного владения; квалифицированные имена схем остаются доверенными.
<?php
mysqli_report(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 меняет базу по умолчанию у соединения; не создаёт её и не переносит туда таблицы. Имя базы приходит из доверенной конфигурации.
- $db->select_db($config['database'])
- Выбираем ту же существующую учебную базу, в соединении которой создан временный каталог. Далее обычный SELECT читает товар.
- После выполнения: Молоток — 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-синтаксис, серверный запрос не выполнялся. Для разных арендаторов нельзя выбирать любую базу по пользовательскому имени. Пул и состояние соединения требуют явного владения; квалифицированные имена схем остаются доверенными.
<?php
mysqli_report(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Сменить серверную сессию и заново подготовить её данные. Операция повторно аутентифицирует соединение и сбрасывает часть состояния: временные таблицы, транзакции и настройки нельзя считать сохранёнными.
- $db->change_user($user, $password, $database)
- Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.
- После выполнения: Молоток — 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Сменить серверную сессию и заново подготовить её данные. Операция повторно аутентифицирует соединение и сбрасывает часть состояния: временные таблицы, транзакции и настройки нельзя считать сохранёнными.
- $db->change_user($user, $password, $database)
- Пример снова входит тем же учебным пользователем. После сброса заново задаёт кодировку и создаёт исчезнувшую временную таблицу; это делает зависимость видимой.
- После выполнения: Молоток — 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-соединения действуют правила пула.
- $db->close()
- Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.
- После выполнения: Молоток — 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-соединения действуют правила пула.
- $db->close()
- Данные прочитаны до close, поэтому их можно оформить после освобождения соединения. Новый SQL через закрытый объект уже недопустим.
- После выполнения: Молоток — 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.
- $db->query('SELECT name, stock FROM products ORDER BY id')
- Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.
- После выполнения: Молоток — 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');
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_mode | MYSQLI_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.
- $db->query('SELECT name, stock FROM products ORDER BY id')
- Полученный объект хранит ответ. fetch_assoc переносит очередную строку в PHP, а ORDER BY id фиксирует последовательность товаров.
- После выполнения: Молоток — 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');
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_mode | MYSQLI_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.
- $db->real_query($sql)
- Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.
- После выполнения: Молоток — 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.
- $db->real_query($sql)
- Отправка и буферизация — два явных действия. Только после store_result можно читать поля товаров через fetch_assoc.
- После выполнения: Молоток — 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] передаёт номер товара.
- $db->execute_query('... WHERE id = ?', [2])
- Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.
- После выполнения: Перчатки — 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-шаблон с ? вместо полных значений. |
| $params | null при отсутствии параметров либо список с точным числом значений; значения передаются как строки, 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 и возвращает результат.
<?php
mysqli_report(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] передаёт номер товара.
- $db->execute_query('... WHERE id = ?', [2])
- Значение 2 не вклеивается в SQL-текст. После вызова читаем обычный mysqli_result, как после SELECT query.
- После выполнения: Перчатки — 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-шаблон с ? вместо полных значений. |
| $params | null при отсутствии параметров либо список с точным числом значений; значения передаются как строки, 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 и возвращает результат.
<?php
mysqli_report(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 — следующий.
- $stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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 — следующий.
- $stmt = $db->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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 — следующий.
- $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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. Это промежуточный шаг для обёртки, которая создаёт команду отдельно от шаблона.
<?php
mysqli_report(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 — следующий.
- $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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. Это промежуточный шаг для обёртки, которая создаёт команду отдельно от шаблона.
<?php
mysqli_report(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 хранит набор и позицию, а не одну запись.
- $result = $db->store_result();
- Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
- После выполнения: Молоток — 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, а результата нет, исследуйте ошибку, включая отказ выделения памяти.
<?php
mysqli_report(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 хранит набор и позицию, а не одну запись.
- $result = $db->store_result();
- Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
- После выполнения: Молоток — 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, а результата нет, исследуйте ошибку, включая отказ выделения памяти.
<?php
mysqli_report(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 оставляет ответ потоком на занятом соединении; строки читаются до конца перед новой командой.
- $result = $db->use_result();
- Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
- После выполнения: Молоток — 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 оставляет ответ потоком на занятом соединении; строки читаются до конца перед новой командой.
- $result = $db->use_result();
- Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
- После выполнения: Молоток — 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, который может дать несколько ответов.
- $db->multi_query($fixedSql)
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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, который может дать несколько ответов.
- $db->multi_query($fixedSql)
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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Получить каталог и итог из двух ответов. Проверяет, остаётся ли ещё ответ; само состояние не переносит соединение на него.
- $db->more_results()
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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Получить каталог и итог из двух ответов. Проверяет, остаётся ли ещё ответ; само состояние не переносит соединение на него.
- $db->more_results()
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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Получить каталог и итог из двух ответов. Переходит к следующему ответу и сообщает ошибку следующей команды, если она возникла.
- $db->next_result()
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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Получить каталог и итог из двух ответов. Переходит к следующему ответу и сообщает ошибку следующей команды, если она возникла.
- $db->next_result()
- Первый набор содержит три товара, второй — один итог. Все ответы разобраны до следующего использования соединения.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 добавляет вызывающий код. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->real_escape_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.
<?php
mysqli_report(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 добавляет вызывающий код. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->real_escape_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.
<?php
mysqli_report(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 добавляет вызывающий код. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->escape_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.
<?php
mysqli_report(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 добавляет вызывающий код. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->escape_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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. Для буквального поиска отдельно экранируем метасимволы выбранным !, а сам шаблон передаём параметром. Это два разных уровня синтаксиса.
<?php
mysqli_report(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-кавычками. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->quote_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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
mysqli_report(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
mysqli_report(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-кавычками. Это разные контракты, поэтому их нельзя механически поменять местами.
- $db->quote_string($name)
- Из базы читается исходное название с апострофом. Никакое HTML-экранирование на этом шаге ещё не выполнялось.
- После выполнения: Кисть O'Reilly — 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';
$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'Reilly | 2 шт. |
Если требование изменится. В новом коде используйте параметры. Проверяйте 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
mysqli_report(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
mysqli_report(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($read, $errors, $reject, 1)
- Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
- После выполнения: Молоток — 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, чтобы повторные ожидания не были бесконечны.
<?php
mysqli_report(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($read, $errors, $reject, 1)
- Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
- После выполнения: Молоток — 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, чтобы повторные ожидания не были бесконечны.
<?php
mysqli_report(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 получает именно готовый результат.
- $db->reap_async_query()
- Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
- После выполнения: Молоток — 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, чтобы повторные ожидания не были бесконечны.
<?php
mysqli_report(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 получает именно готовый результат.
- $db->reap_async_query()
- Для простого самостоятельного урока одно соединение. В приложении несколько отдельных соединений могут ожидать независимые ответы; один объект не обслуживает несколько незавершённых запросов одновременно.
- После выполнения: Молоток — 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, чтобы повторные ожидания не были бесконечны.
<?php
mysqli_report(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 хранит набор и позицию, а не одну запись.
- $result = new mysqli_result($db, MYSQLI_STORE_RESULT);
- Каждая строка сразу превращается в понятную запись вывода. Освобождение результата явно завершает работу с набором.
- После выполнения: Молоток — 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_mode | MYSQLI_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.
- $result->fetch_assoc()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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, не пустую строку.
<?php
mysqli_report(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.
- $result->fetch_assoc()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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, не пустую строку.
<?php
mysqli_report(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.
- $result->fetch_row()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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.
- $result->fetch_row()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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 даёт оба способа доступа к той же строке.
- $result->fetch_array(MYSQLI_ASSOC)
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $mode | MYSQLI_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 даёт оба способа доступа к той же строке.
- $result->fetch_array(MYSQLI_ASSOC)
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $mode | MYSQLI_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. Для трёх товаров это удобно: массив можно проверить и передать представлению.
- $result->fetch_all(MYSQLI_ASSOC)
- Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.
- После выполнения: Молоток — 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) | Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $mode | MYSQLI_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. Для трёх товаров это удобно: массив можно проверить и передать представлению.
- $result->fetch_all(MYSQLI_ASSOC)
- Внешний массив — список товаров, внутренний — поля. Сохранённые строки доступны после free результата.
- После выполнения: Молоток — 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) | Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $mode | MYSQLI_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(*) уже вычислен сервером и пришёл как одно значение.
- $result->fetch_column()
- Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.
- После выполнения: В наличии: 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) ради двух колонок той же строки.
<?php
mysqli_report(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(*) уже вычислен сервером и пришёл как одно значение.
- $result->fetch_column()
- Считаются Молоток и Перчатки. num_rows этого ответа равнялся бы 1, потому что ответ содержит одну строку с итогом 2.
- После выполнения: В наличии: 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) ради двух колонок той же строки.
<?php
mysqli_report(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: колонки становятся свойствами, читаемыми через стрелку.
- $result->fetch_object()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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: колонки становятся свойствами, читаемыми через стрелку.
- $result->fetch_object()
- query возвращает набор, а fetch выбирает очередную строку. В этом запросе есть ровно товар 1, поэтому поля имеют известные значения.
- После выполнения: Молоток — 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. Операция применима к буферизованному ответу.
- $result->data_seek(1)
- SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.
- После выполнения: Перчатки — 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. Операция применима к буферизованному ответу.
- $result->data_seek(1)
- SELECT ORDER BY id задаёт порядок. Вторая позиция соответствует id2 — Перчаткам.
- После выполнения: Перчатки — 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) возвращает то же.
- $result->num_rows
- Число 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) возвращает то же.
- $result->num_rows
- Число 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.
- $result->field_count
- Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.
- После выполнения: Молоток — 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.
- $result->field_count
- Проверяется ширина одной строки, затем выводятся её значения. Даже пустой ответ может иметь известные колонки.
- После выполнения: Молоток — 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 занимает больше байтов, чем символов.
- $result->lengths
- В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 занимает больше байтов, чем символов.
- $result->lengths
- В «Молоток»7 русских букв, каждая занимает 2 байта. Это помогает оценить размер выгрузки, но не ширину текста на экране.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается следующее описание колонки; курсор метаданных сдвигается.
- $result->fetch_field()
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается следующее описание колонки; курсор метаданных сдвигается.
- $result->fetch_field()
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается описание по номеру без продвижения курсора колонок.
- $result->fetch_field_direct(0)
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $index | 0..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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Читается описание по номеру без продвижения курсора колонок.
- $result->fetch_field_direct(0)
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $index | 0..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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Получаем массив описаний всех колонок; он полезен для заголовков экспорта даже при пустом наборе строк.
- $result->fetch_fields()
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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; здесь фиксированные безопасные имена нужны, чтобы показать движение схемы в заголовок.
<?php
mysqli_report(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Сопоставить описание колонки с её значением. Метаданные описывают имя, тип и происхождение колонки; значения товаров читаются отдельно. Получаем массив описаний всех колонок; он полезен для заголовков экспорта даже при пустом наборе строк.
- $result->fetch_fields()
- Имяname относится к первой колонке SELECT, а «Молоток» — значение этой колонки в первой строке.
- После выполнения: Первая колонка: 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; здесь фиксированные безопасные имена нужны, чтобы показать движение схемы в заголовок.
<?php
mysqli_report(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, а не второй товар.
- $result->current_field
- После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
- После выполнения: Колонка для количества: 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, а не второй товар.
- $result->current_field
- После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
- После выполнения: Колонка для количества: 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, а не второй товар.
- $result->field_seek(1)
- После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
- После выполнения: Колонка для количества: 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, а не второй товар.
- $result->field_seek(1)
- После работы с metadata чтение строки по-прежнему начинается с Молотка. Перемещение колонки не пропускает товар.
- После выполнения: Колонка для количества: 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 освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.
- $result->free()
- Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
- После выполнения: Молоток — 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 освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.
- $result->free()
- Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
- После выполнения: Молоток — 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 освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.
- $result->free()
- Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
- После выполнения: Молоток — 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 освобождают результат. Сохранённый массив строки остаётся, соединение продолжает работать.
- $result->free()
- Массив получен до освобождения. Это удобно, когда данные передаются дальше без удержания всего буфера ответа.
- После выполнения: Молоток — 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.
- $result->getIterator()
- Каждый проход получает именной массив товара. Представление может выводить строки таблицы без промежуточного fetch_all.
- После выполнения: Молоток — 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) | Берёт по одной строке из набора. Блок между { и } повторяется для каждой строки; при пустом наборе не выполняется. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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 обычно делает сам язык.
<?php
mysqli_report(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-колонки.
- $result->type
- query по умолчанию создал буфер, поэтому можно выбрать вторую строку. У потока вместо перемотки нужен последовательный алгоритм.
- После выполнения: Перчатки — 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 получает буфер.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Поток освободили до следующей работы с соединением.
<?php
mysqli_report(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 — следующий.
- $stmt = new mysqli_stmt($db); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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 | Открытое соединение. |
| $query | SQL-шаблон либо 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.
<?php
mysqli_report(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 — следующий.
- $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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.
<?php
mysqli_report(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 — следующий.
- $stmt = $db->stmt_init(); $stmt->prepare('SELECT name, stock FROM products WHERE id = ?');
- Сервер получает шаблон с одним ?. Значение 2 передаётся отдельно и затем читается найденная строка. get_result требует mysqlnd.
- После выполнения: Перчатки — 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.
<?php
mysqli_report(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.
- $id = 1; $stmt->bind_param('i', $id); $id = 2; $stmt->execute();
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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.
- $id = 1; $stmt->bind_param('i', $id); $id = 2; $stmt->execute();
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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.
- $stmt->execute([2]);
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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.
<?php
mysqli_report(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.
- $stmt->execute([2]);
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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.
<?php
mysqli_report(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.
- $stmt->execute([2]);
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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.
<?php
mysqli_report(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 переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.
- $stmt->bind_result($name, $stock)
- После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.
- $stmt->bind_result($name, $stock)
- После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.
- $stmt->fetch()
- После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 переносит очередные значения в эти переменные. Это выходной путь, не передача входных параметров.
- $stmt->fetch()
- После каждого успешного fetch переменные $name/$stock описывают текущий товар. Для новых значений не нужно объявлять новые переменные.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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.
- $stmt->execute([2]);
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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; это не нейтральный к памяти поток.
<?php
mysqli_report(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.
<?php
mysqli_report(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.
- $stmt->execute([2]);
- Номер 2 проходит отдельно от SQL; результат содержит название и остаток выбранного товара. Успех execute сам по себе не был бы строкой товара.
- После выполнения: Перчатки — 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; это не нейтральный к памяти поток.
<?php
mysqli_report(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.
<?php
mysqli_report(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 и переходить по позициям.
- $stmt->store_result()
- Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
- После выполнения: Молоток — 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 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 и переходить по позициям.
- $stmt->store_result()
- Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
- После выполнения: Молоток — 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 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 и переходить по позициям.
- $stmt->data_seek(1)
- Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
- После выполнения: Перчатки — 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 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 и переходить по позициям.
- $stmt->data_seek(1)
- Буферизация сохраняет результат statement. Индекс 1 у data_seek выбирает вторую строку, а не строку с id1.
- После выполнения: Перчатки — 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 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-шаблон остаётся и может выполниться с другим номером.
- $stmt->free_result()
- Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement с буфером 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-шаблон остаётся и может выполниться с другим номером.
- $stmt->free_result()
- Шаблон подготовлен один раз. Второй вызов меняет только параметр и выдаёт другой товар.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement с буфером 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-значения остаются пригодны для вывода.
- $stmt->close()
- Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.
- После выполнения: Молоток — 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 отменяет/освобождает ожидающие результаты этой команды, чтобы соединение могло работать дальше. Он не закрывает само соединение.
<?php
mysqli_report(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-значения остаются пригодны для вывода.
- $stmt->close()
- Данные получены до закрытия. Следующая независимая задача может подготовить другой statement через открытое $db.
- После выполнения: Молоток — 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 отменяет/освобождает ожидающие результаты этой команды, чтобы соединение могло работать дальше. Он не закрывает само соединение.
<?php
mysqli_report(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, а не сами строки.
- $stmt->result_metadata()
- Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.
- После выполнения: 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, а не сами строки.
- $stmt->result_metadata()
- Заголовки известны из SQL, а значения появляются после execute. Это помогает строить экспорт даже для пустого набора.
- После выполнения: 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.
- $stmt->send_long_data(0, $chunk)
- Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.
- После выполнения: Квитанция заказа #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.
<?php
mysqli_report(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.
- $stmt->send_long_data(0, $chunk)
- Две части образуют одно полеbody. SELECT возвращает сохранённые байты, поэтому виден фактический результат сборки.
- После выполнения: Квитанция заказа #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.
<?php
mysqli_report(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 изменений базы.
- $stmt->reset()
- Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 изменений базы.
- $stmt->reset()
- Вторая попытка использует тот же SQL и привязанную переменную с новым значением 2. Предыдущий ответ завершён заранее.
- После выполнения: Молоток — 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.
<?php
mysqli_report(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 курсора.
- $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE)
- Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
- После выполнения: Молоток — 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 курсора.
- $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE)
- Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
- После выполнения: Молоток — 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 курсора.
- $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)
- Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
- После выполнения: Молоток — 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 курсора.
- $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)
- Настройка применяется до execute. После проверки нужного режима получаем обычную строку каталога.
- После выполнения: Молоток — 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.
- $stmt->param_count
- У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
- После выполнения: Молоток — 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.
- $stmt->param_count
- У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
- После выполнения: Молоток — 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.
- $stmt->field_count
- У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
- После выполнения: Молоток — 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.
- $stmt->field_count
- У нашего поиска один входной номер и две выходные колонки. Эти размеры относятся к разным направлениям данных.
- После выполнения: Молоток — 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. Это число строк текущего ответа, не изменённых записей.
- $stmt->num_rows
- Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
- После выполнения: В списке: 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->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. Это число строк текущего ответа, не изменённых записей.
- $stmt->num_rows
- Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
- После выполнения: В списке: 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->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. Это число строк текущего ответа, не изменённых записей.
- $stmt->num_rows
- Число в заголовке относится к тому же буферу, из которого затем показаны три товара.
- После выполнения: В списке: 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->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 — условие не нашло подходящий товар.
- $stmt->affected_rows
- Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.
- После выполнения: Резерв принят · Молоток — 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';
$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 на число найденных строк.
<?php
mysqli_report(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 мог отсутствовать. Для бизнес-операции отдельно решите, допустим ли такой повтор.
<?php
mysqli_report(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 — условие не нашло подходящий товар.
- $stmt->affected_rows
- Выражение уменьшает остаток на 2 только при достаточном количестве. SELECT показывает итог 6.
- После выполнения: Резерв принят · Молоток — 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';
$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 на число найденных строк.
<?php
mysqli_report(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 мог отсутствовать. Для бизнес-операции отдельно решите, допустим ли такой повтор.
<?php
mysqli_report(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 до следующего исполнения.
- $stmt->insert_id
- ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.
- После выполнения: Товар #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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement сразу после успешного 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 до следующего исполнения.
- $stmt->insert_id
- ID4 связывает результат INSERT со следующим SELECT и будущей ссылкой на карточку товара.
- После выполнения: Товар #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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement сразу после успешного 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 подходит для выбора конкретной ветки обработки.
- $stmt->errno
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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 подходит для выбора конкретной ветки обработки.
- $stmt->errno
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.
- $stmt->error
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.
- $stmt->error
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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.
- $stmt->error_list
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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.
- $stmt->error_list
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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 в этом случае означает нарушение ограничения целостности.
- $stmt->sqlstate
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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 в этом случае означает нарушение ограничения целостности.
- $stmt->sqlstate
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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/сообщение.
<?php
mysqli_report(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 переключает текущий; каждый набор надо освободить.
- $stmt->more_results()
- Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
- После выполнения: Молоток — 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 / finally | try содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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.
<?php
mysqli_report(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 переключает текущий; каждый набор надо освободить.
- $stmt->more_results()
- Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
- После выполнения: Молоток — 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 / finally | try содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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.
<?php
mysqli_report(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 переключает текущий; каждый набор надо освободить.
- $stmt->next_result()
- Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
- После выполнения: Молоток — 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 / finally | try содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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 | Statement с несколькими результатами. |
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.
<?php
mysqli_report(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 переключает текущий; каждый набор надо освободить.
- $stmt->next_result()
- Первый набор содержит товары; второй — одну строку total3. Завершающий статус процедуры может не содержать таблицы. Имя процедуры зарезервировано для этого урока; существующую процедуру код не удаляет при ошибке CREATE.
- После выполнения: Молоток — 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 / finally | try содержит действие, catch обрабатывает отказ, finally выполняет освобождение ресурсов и при успехе, и при исключении. |
[...] | Квадратные скобки задают массив либо читают его элемент. Ключ имени колонки и номер позиции — разные способы адресации. |
<?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 | Statement с несколькими результатами. |
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.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $stmt->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement, результаты которого уже корректно получены/освобождены. |
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.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $stmt->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $statement | Statement, результаты которого уже корректно получены/освобождены. |
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.
<?php
mysqli_report(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 начинает транзакцию: дальнейшие совместимые операции соединения можно подтвердить вместе либо отменить.
- $db->begin_transaction(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 | 0; 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 начинает транзакцию: дальнейшие совместимые операции соединения можно подтвердить вместе либо отменить.
- $db->begin_transaction(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 | 0; 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 подтверждает накопленные изменения транзакции. Это отдельный шаг после успешных запросов, не замена их проверки.
- $db->commit(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 подтверждает накопленные изменения транзакции. Это отдельный шаг после успешных запросов, не замена их проверки.
- $db->commit(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 отменяет неподтверждённые изменения транзакционных таблиц. Здесь списанные две штуки возвращаются в остаток.
- $db->rollback(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 отменяет неподтверждённые изменения транзакционных таблиц. Здесь списанные две штуки возвращаются в остаток.
- $db->rollback(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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 и осознанное восстановление режима.
- $db->autocommit(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $enable | true включает, 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 или пуле.
<?php
mysqli_report(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 и осознанное восстановление режима.
- $db->autocommit(...)
- Исходный остаток 8 уменьшается на 2 внутри транзакции. SELECT выполняется после решения о подтверждении и показывает итог для этого решения.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $enable | true включает, 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 или пуле.
<?php
mysqli_report(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 удаляет отметку, но не подтверждает всю транзакцию.
- $db->savepoint('extra')
- После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
- После выполнения: Молоток — 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 удаляет отметку, но не подтверждает всю транзакцию.
- $db->savepoint('extra')
- После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
- После выполнения: Молоток — 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 удаляет отметку, но не подтверждает всю транзакцию.
- $db->release_savepoint('extra')
- После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
- После выполнения: Молоток — 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 удаляет отметку, но не подтверждает всю транзакцию.
- $db->release_savepoint('extra')
- После отметки обнуляли Перчатки. Возврат отменил только эту правку, ранее выполненный резерв Молотка сохранился при commit.
- После выполнения: Молоток — 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(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
- catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.
- После выполнения: Этот номер товара уже занят · Молоток — 8 шт.
В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.
| Запись в этом примере | Как читать |
|---|---|
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
try / catch / finally | try содержит действие, 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $flags | MYSQLI_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_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
- catalog.php включает строгий режим до подключения. Дублирующий PRIMARY KEY отклонён, исходная строка доступна для следующего SELECT.
- После выполнения: Этот номер товара уже занят · Молоток — 8 шт.
В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.
| Запись в этом примере | Как читать |
|---|---|
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
try / catch / finally | try содержит действие, 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|---|
| $flags | MYSQLI_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 относятся к последующим запросам и не заменяют эти сведения.
- $db->connect_errno
- На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
- После выполнения: При правильном 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, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.
<?php
mysqli_report(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 относятся к последующим запросам и не заменяют эти сведения.
- $db->connect_errno
- На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
- После выполнения: При правильном 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, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.
<?php
mysqli_report(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 относятся к последующим запросам и не заменяют эти сведения.
- $db->connect_error
- На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
- После выполнения: При правильном 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, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.
<?php
mysqli_report(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 относятся к последующим запросам и не заменяют эти сведения.
- $db->connect_error
- На успешном пути seed.php создаёт временную таблицу после соединения. На ошибочном пути программа заканчивается до SELECT; техническая причина остаётся в локальном файле.
- После выполнения: При правильном 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, даже при чтении через другой экземпляр. Снимайте сообщение сразу, до следующей попытки.
<?php
mysqli_report(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 подходит для выбора конкретной ветки обработки.
- $db->errno
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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 подходит для выбора конкретной ветки обработки.
- $db->errno
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.
- $db->error
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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Разобрать отказ вставки, сохранив исходный товар. Текст ошибки предназначен для диагностики; его язык и детали зависят от сервера.
- $db->error
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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.
- $db->error_list
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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.
- $db->error_list
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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 в этом случае означает нарушение ограничения целостности.
- $db->sqlstate
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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 в этом случае означает нарушение ограничения целостности.
- $db->sqlstate
- Режим без исключений выбран специально для чтения диагностических свойств сразу после ошибочного запроса. Затем режим восстановлен и выведена сохранившаяся строка. diagnostic.json рядом с example.php содержит фактическую диагностику сервера.
- После выполнения: Вставка отклонена; сведения в 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 события, а подробности держат в закрытом журнале.
<?php
mysqli_report(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-синтаксис, серверный запрос не выполнялся. Ошибка не является вечным свойством соединения. Следующая операция может заменить диагностическое состояние, поэтому сохраняйте необходимое сразу.
<?php
mysqli_report(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 в момент отказа; последующие запросы не заменят эти сведения в уже созданном объекте.
- $error->getSqlState()
- Проверены и категория, и код конкретного конфликта. Неизвестный отказ снова передаётся внешнему обработчику, а ожидаемый превращается в понятное сообщение.
- После выполнения: Номер занят: выберите другой · Молоток — 8 шт.
В архиве catalog.php открывает отдельную учебную базу и выполняет schema.sql: 1 — Молоток, 8 шт.; 2 — Перчатки, 15 шт.; 3 — Кисть, 0 шт. В MySQL это временная таблица текущего соединения. Сначала настройте config.php по README; отдельный сервер обязателен. Распакуйте все файлы вместе и запустите php example.php. Полная подготовка и схема.
| Запись в этом примере | Как читать |
|---|---|
$db->method(...) | Стрелка вызывает действие у конкретного соединения, команды или результата. Скобки содержат входные значения; результат можно сохранить через =. |
try / catch / finally | try содержит действие, 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 — пятисимвольная категория. Исключение хранит сведения даже после того, как состояние соединения изменится.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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 — две альтернативы, не два обязательных шага.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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 — две альтернативы, не два обязательных шага.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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 — две альтернативы, не два обязательных шага.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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 — две альтернативы, не два обязательных шага.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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.
<?php
try { new mysqli_warning(); } catch (Error $error) { echo 'Конструктор закрыт', "\n"; }
Ожидаемый результат
Конструктор закрыт
Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Класс описывает сведения уже выполненного SQL. Для своего сообщения приложения создавайте собственный объект/массив, а не внутренний mysqli_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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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.
<?php
mysqli_report(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 переводит к следующему, а свойства описывают именно текущий элемент.
- $db->get_warnings()
- Строка 12x не является корректным целым числом. Пример собирает реальные code/state/message в warnings.json рядом со скриптом; затем показывает, что каталог доступен. Точный текст сообщения зависит от MySQL и не подменён выдуманным постоянным текстом.
- После выполнения: Преобразование требует проверки; причины в 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.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Резерв принят · Молоток — 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.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Резерв принят · Молоток — 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.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Отвёртка — 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), который может увидеть чужую запись.
<?php
mysqli_report(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. Не выводите все остальные простой арифметикой без знания серверного режима и конфликтов.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Отвёртка — 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), который может увидеть чужую запись.
<?php
mysqli_report(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. Не выводите все остальные простой арифметикой без знания серверного режима и конфликтов.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Молоток — 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 решают, нужен ли объект результата, а не по числу товаров.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Молоток — 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 решают, нужен ли объект результата, а не по числу товаров.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Молоток — 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, но машинную бизнес-логику не стройте на парсинге английской фразы.
<?php
mysqli_report(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.
<?php
mysqli_report(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($db)
- Сначала выполнена известная команда, затем считано её служебное значение, после этого SELECT показывает полезные строки пользователю.
- После выполнения: Молоток — 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, но машинную бизнес-логику не стройте на парсинге английской фразы.
<?php
mysqli_report(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.
<?php
mysqli_report(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()
- Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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_get_client_info()
- Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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()
- Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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()
- Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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_get_client_version()
- Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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_get_client_info()
- Файл рядом со скриптом содержит конкретное значение client данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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_get_client_version()
- Файл рядом со скриптом содержит конкретное значение client_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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
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.
- $db->host_info
- Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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.
- $db->host_info
- Файл рядом со скриптом содержит конкретное значение host данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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, приложения либо сервера.
- $db->protocol_version
- Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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, приложения либо сервера.
- $db->protocol_version
- Файл рядом со скриптом содержит конкретное значение protocol данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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-возможностей.
- $db->server_info
- Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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-возможностей.
- $db->server_info
- Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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Приложить сведения окружения к отчёту о работе каталога. Числовая версия сервера удобна для грубой проверки версии; конкретная возможность может зависеть также от конфигурации и разновидности сервера.
- $db->server_version
- Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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Приложить сведения окружения к отчёту о работе каталога. Числовая версия сервера удобна для грубой проверки версии; конкретная возможность может зависеть также от конфигурации и разновидности сервера.
- $db->server_version
- Файл рядом со скриптом содержит конкретное значение server_version данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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-возможностей.
- $db->server_info
- Файл рядом со скриптом содержит конкретное значение server данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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-пользователя.
- $db->thread_id
- Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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 от посетителя нельзя передавать административной команде.
<?php
mysqli_report(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-пользователя.
- $db->thread_id
- Файл рядом со скриптом содержит конкретное значение connection_id данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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 от посетителя нельзя передавать административной команде.
<?php
mysqli_report(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()
- Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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 и серверных блокировок.
<?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()
- Файл рядом со скриптом содержит конкретное значение thread_safe данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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 и серверных блокировок.
<?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 предоставляет счётчики именно этого соединения: запросы, байты и способы чтения. Снимок не является сам по себе замером скорости.
- $db->get_connection_stats()
- Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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 предоставляет счётчики именно этого соединения: запросы, байты и способы чтения. Снимок не является сам по себе замером скорости.
- $db->get_connection_stats()
- Файл рядом со скриптом содержит конкретное значение connection_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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()
- Файл рядом со скриптом содержит конкретное значение client_stats данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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_get_links_statsПосмотреть, сколько соединений открыто и сколько осталось в persistent-пуле.
PHP 5.6+ · mysqli; mysqlnd для отмеченных операций
mysqli_get_links_stats(): arrayПриложить сведения окружения к отчёту о работе каталога. Числа активных и постоянных соединений помогают искать удержанные ресурсы процесса. Они не равны числу посетителей.
- mysqli_get_links_stats()
- Файл рядом со скриптом содержит конкретное значение links данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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_links_stats();
$report = ['links' => $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-синтаксис, запрос к этому серверу не выполнялся. Файл рядом со скриптом содержит конкретное значение links данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
Эти же строки в табличном виде. CLI-пример выше печатает текст; таблица помогает увидеть соответствие названия и остатка. Как получить такую таблицу настоящим HTML-обработчиком.
| Товар / строка | Наличие |
|---|---|
| Молоток | 8 шт. |
Если требование изменится. Этот отчёт предназначен для локальной диагностики. Не отдавайте его публичной странице; host/version и нагрузки могут быть служебными сведениями. Недоступность расширения или mysqlnd выявляют до запуска по требованиям в полном контракте.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Посмотреть, сколько соединений открыто и сколько осталось в persistent-пуле.
Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|
Ассоциативный массив: total — все открытые в любом состоянии, active_plinks — используемые persistent, cached_plinks — неактивные persistent. Все три значения int; это состояние процесса, не общая панель всех серверов.
Путь данных. Соединение открывается → total/active меняются → Persistent после освобождения может попасть в cached.
Как читать этот вариант. Проверено в отдельном CLI-процессе без соединений. В работающем worker значения зависят от пула.
<?php
$stats = mysqli_get_links_stats();
echo $stats['total'], ':', $stats['active_plinks'], ':', $stats['cached_plinks'], "\n";
Ожидаемый результат
0:0:0
Как читать этот вариант. Контекстный пример: нужен отдельный учебный MySQL, расширение mysqli, база course_demo и её пользователь course_user с разрешением временных таблиц. Учебные параметры подключения заменяют своими; рабочие базы не используют. Здесь проверен PHP-синтаксис, серверный запрос не выполнялся. Условие: отдельный процесс и единственное обычное соединение. Persistent после close может перейти в cached, а не исчезнуть физически.
<?php
mysqli_report(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_links_stats();
echo $stats['total'], ':', $stats['active_plinks'], ':', $stats['cached_plinks'], "\n";
$db->close();
echo mysqli_get_links_stats()['total'], "\n";
Ожидаемый результат
1:0:0
0
Связанные операции: mysqli_get_client_stats, mysqli_close.
mysqli_statПолучить краткий системный статус MySQL.
PHP 5+; изменения отмечены · mysqli; mysqlnd для отмеченных операций
mysqli_stat(mysqli $mysql): string|false; mysqli::stat(): string|falseПриложить сведения окружения к отчёту о работе каталога. Краткая строка статистики описывает серверное состояние. Для точных метрик используйте серверные средства мониторинга и права доступа.
- $db->stat()
- Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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Приложить сведения окружения к отчёту о работе каталога. Краткая строка статистики описывает серверное состояние. Для точных метрик используйте серверные средства мониторинга и права доступа.
- $db->stat()
- Файл рядом со скриптом содержит конкретное значение server_status данного окружения и фактическую строку товара. Версия, ID и счётчики меняются между установками, поэтому ожидаемый stdout фиксирован, а содержимое диагностического поля проверяют в созданном JSON.
- После выполнения: Сведения соединения сохранены в 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. Обрабатывайте отказ самой требуемой операции; автоматическое переподключение может потерять транзакцию.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Распознать историческую проверку доступности соединения.
Процедурная функция получает соединение $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. Обрабатывайте отказ самой требуемой операции; автоматическое переподключение может потерять транзакцию.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Распознать историческую проверку доступности соединения.
Процедурная функция получает соединение $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.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Понять и заменить старую административную отмену серверной сессии.
Процедурная функция получает соединение $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 закрывает. Пример не выполнялся при локальной проверке.
<?php
mysqli_report(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.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Понять и заменить старую административную отмену серверной сессии.
Процедурная функция получает соединение $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 закрывает. Пример не выполнялся при локальной проверке.
<?php
mysqli_report(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; конкретную серверную операцию обслуживания выбирают отдельно с администратором и нужными правами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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-синтаксис, серверный запрос не выполнялся. Нужны административные права и заранее заданная политика журналов отдельного тестового сервера. Команда влияет на журналы всего сервера, поэтому в работающем приложении её не вызывают по случайной кнопке.
<?php
mysqli_report(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; конкретную серверную операцию обслуживания выбирают отдельно с администратором и нужными правами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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-синтаксис, серверный запрос не выполнялся. Нужны административные права и заранее заданная политика журналов отдельного тестового сервера. Команда влияет на журналы всего сервера, поэтому в работающем приложении её не вызывают по случайной кнопке.
<?php
mysqli_report(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. Начните с сообщения исключения, времени и идентификатора операции в журнале приложения.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 и может содержать чувствительные сведения запросов. Используйте ограниченный интервал на учебной/диагностической среде, не включайте бесконтрольно для всех запросов.
<?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. Начните с сообщения исключения, времени и идентификатора операции в журнале приложения.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 и может содержать чувствительные сведения запросов. Используйте ограниченный интервал на учебной/диагностической среде, не включайте бесконтрольно для всех запросов.
<?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 пишет служебную информацию в серверный журнал и требует привилегий. Для отправки разработчику воспроизводимого случая удобнее отдельная учебная схема и локальный отчёт.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 пишет служебную информацию в серверный журнал и требует привилегий. Для отправки разработчику воспроизводимого случая удобнее отдельная учебная схема и локальный отчёт.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 — другая СУБД с собственными правилами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 запуска встроенного 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 — другая СУБД с собственными правилами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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 запуска встроенного 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 — другая СУБД с собственными правилами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|
Удалён в 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 — другая СУБД с собственными правилами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|
Удалён в 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 и сверяйте контракт версии ниже.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.
<?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 — другая СУБД с собственными правилами.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Полная историческая сигнатура, версия удаления/устаревания, права и ограничения сохранены ниже.
Полный контракт, ограничения и следующие варианты. Ниже сохранены параметры, возвращаемые значения, ошибки, версии и дополнительные задачи этой операции. Перед каждым более длинным примером сначала прочитайте его подготовку и ход действий.
Распознать удалённое свойство embedded.
Процедурная функция получает соединение $db, команду $statement или результат $result первым аргументом. В записи $object->method(...) тот же объект стоит перед стрелкой. Свойство читается без круглых скобок. Эти варианты используют один механизм: выбирать стиль стоит по понятности проекта. аргументы и возврат, объект и его состояние.
| Параметр / вход | Что передать |
|---|
Исторический bool поддержки embedded MySQL; сами embedded_server_start/end удалены раньше, в 7.4. Не создавайте динамическое одноимённое свойство в надежде вернуть удалённую функцию: оно не настраивает драйвер.
Путь данных. Старое свойство удалено → Приложение выбирает современное управление соединением → Незавершённая операция обрабатывается отдельно.
Как читать этот вариант. driver_version deprecated с 8.1. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.
<?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 не даёт современной гарантии восстановления. Повторное соединение создаёт новую сессию: временные таблицы, блокировки и транзакции прежней сессии потеряны.
- $db->query(...)
- Современный путь выполняет полезный SELECT, сохраняет строку в PHP, освобождает результат и закрывает свою сессию. Значения строки доступны и после close. Подключение и схема включены в архив.
- После выполнения: Молоток — 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. Пример не вызывает устаревшее свойство в современной версии; версии клиента, сервера и расширения — разные сведения.
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


