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

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

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

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

Глава 109 · После явного подключения к учебной MySQL

Старый MySQL API: диагностика подключения и административные границы

Версии клиента и сервера, протокол, два соединения, собственные процессы, именованные счётчики и явное новое подключение. CREATE/DROP DATABASE разобраны отдельно как неисполненный административный план.

Что выясняем при переносе подключения

После переноса проекта нужно понять, куда подключился PHP, почему версии отличаются и какое соединение обслуживает запрос. Здесь диагностируем две собственные связи с локальным сервером и сохраняем понятный отчёт. Не начинаем с огромного дампа всех параметров: сначала отвечаем на конкретный вопрос.

ВопросНужные сведенияЧто они не доказывают
Какой код выполняет PHP?PHP_VERSION, client_infoВерсию отдельного MySQL-сервера
К какому серверу подключились?server_info / SELECT VERSION()Успешность всех запросов приложения
Какой разговор с сервером?thread_id / CONNECTION_ID()Постоянный ID пользователя/заказа
Что делает моё соединение?Своё совпадение ID в PROCESSLIST, SESSION STATUSОтсутствие чужих блокировок
Можно ли создать/удалить базу?Отдельные административные права и решениеРазрешение через успешный CREATE TABLE

Состояние SQL-сессии — соединения с MySQL включает выбранную базу, переменные, настройки и текущую транзакцию. Это другое понятие, чем PHP session/cookie для входа пользователя на сайт. Два объекта mysqli могут быть подключены к одному серверу и иметь разное состояние.

Граница диагностического вывода
  1. Свой PHP-процесс → собственный mysqli
  2. Запрос конкретного показателя у MySQL
  3. Сравнение по понятному правилу
  4. Отчёт без пароля, полного SHOW GRANTS и чужих SQL
  5. Следующее действие по причине, а не бесконечный повтор

Окружение, отчёты и границы проверки

Полные программы выполняются на PHP 8.2+ с mysqli/mysqlnd и отдельной локальной учебной базой MySQL 8.4/InnoDB. Контрольное окружение — PHP 8.5.11/MySQL 8.4.13. Устаревшее ext/mysql не устанавливается, PHP 5 не нужен. Начальную настройку см. в подключении PHP к MySQL.

Распакуйте архив, задайте PHPMAN_MYSQL_HOST, PHPMAN_MYSQL_PORT, PHPMAN_MYSQL_DATABASE, PHPMAN_MYSQL_USER, PHPMAN_MYSQL_PASSWORD в окружении своего терминала и выполните php example.php. На контрольном стенде используется localhost:33070; у вас порт может быть другим. Реквизиты в архив не входят. README и mysql108-metadata-helper.php включены в каждый архив.

Создаются только собственные mysql108_meta_* и mysql108_diag_* таблицы в выделенной базе. Занятое имя вызывает отказ CREATE и не попадает в список очистки. finally удаляет только успешно созданные этим запуском таблицы; после аварийного завершения процесса они могут остаться. Запускать это в базе рабочего сайта не следует. Права на базу ограничены; CREATE/DROP DATABASE ни один пример не выполняет.

Что вы получаете после запуска
  1. example.php выполняет современные запросы MySQLi
  2. result.json: точные таблицы результата
  3. observations.json: реальные версии, ID и счётчики
  4. result.html: те же таблицы и наблюдения, удобно читать в браузере
  5. metrics.json: локальные проверки и контрольные суммы

Версии, ID и показания счётчиков не придумываются: они поступают из текущего запуска и показаны в result.html. В тексте главы таблица «Что получится» содержит устойчивые свойства и учебные данные; переменные показания находятся в сохранённом фактическом результате. Это CLI-проверка PHP/MySQL, не отправка HTML-формы и не тест HTTP.

Составить понятный паспорт подключения

После миграции хостинга в отчёте одновременно видны PHP 8.5, mysqlnd 8.5 и MySQL 8.4. Это не противоречие: у приложения, клиентской библиотеки и сервера разные роли. Нужен паспорт подключения, который не смешивает эти числа.

Исходные данные

Источники сведений

ГраницаПример на стенде
PHP-процессPHP 8.5.11 / mysqlnd 8.5.11
MySQL-серверMySQL 8.4.13
ПротоколОтдельное целое число

Что получится

Что именно сравниваем

ПроверкаРезультат
VERSION() совпадает с server_infoда
Клиентская библиотека определенада
Номер протокола положительныйда
Описание транспорта полученода

Малый фрагмент: сначала смысл действия

echo mysqli_get_client_info(); // Библиотека в PHP.
echo $db->server_info;         // Сервер, к которому подключились.
echo $db->protocol_version;    // Версия протокола, не версия MySQL.

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

PHP выполняет программу. mysqli использует клиентскую библиотеку, а соединение ведёт к отдельному MySQL-серверу. mysqli_get_client_info работает на стороне PHP; server_info относится к выбранному подключению. SELECT VERSION() приходит от сервера, поэтому пример сверяет два способа узнать его версию. protocol_version — номер протокола обмена, а host_info описывает транспорт, например TCP/IP.

Версии и транспорт сохраняются в observations.json и в нижней таблице result.html. Эти реальные значения не подменяются заранее написанной картинкой. Проверки требуют согласованности двух ответов сервера, наличия описания клиента и транспорта, а не совпадения номера PHP с номером MySQL. В основной таблице приведён устойчивый смысл проверки; на другой машине сами версии будут другими.

Ошибки и ограничения

Номер протокола не означает версию TLS. Строка host_info не доказывает шифрование. Паспорт окружения лучше отдавать администратору в закрытом отчёте: состав библиотек и адреса сервера не обязательны для посетителя сайта.

Полная самостоятельная программа PHP 8 и входные файлы
Составить понятный паспорт подключенияСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$server=legacy108Read($db,'SELECT VERSION()')[0][0];$protocol=$db->protocol_version;$client= mysqli_get_client_info();
$checks=['server_agrees'=>$server===$db->server_info,'client_available'=>$client!==''&&$client===$db->client_info,'protocol_positive'=>$protocol>0,'host_available'=>$db->host_info!==''];
$blocks=[legacy108Block('Что именно сравниваем',['Проверка','Результат'],[['VERSION() совпадает с server_info',legacy108Yes($checks['server_agrees'])],['Клиентская библиотека определена',legacy108Yes($checks['client_available'])],['Номер протокола положительный',legacy108Yes($checks['protocol_positive'])],['Описание транспорта получено',legacy108Yes($checks['host_available'])]])];
$observations=[['PHP',PHP_VERSION],['Клиентская библиотека',$client],['Сервер из SELECT VERSION()',$server],['Номер протокола',(string)$protocol],['Транспорт',$db->host_info]];
legacy108Report('mysql108-diag-versions',$blocks,$checks,$observations,$db,[]);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-versions: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-versions: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения

Попробуйте сами. В своём учебном окружении сравните вывод php --version с SELECT VERSION(). Подпишите отдельно клиента, сервер и транспорт; объясните, какой компонент меняется при обновлении только PHP.

Практический вопрос: What does the mysqli client version mean?. Версия клиентской библиотеки отличается от MySQL сервера. Паспорт подключения разделяет PHP, mysqlnd, сервер и протокол, а версии считываются при выполнении. Обсуждение задаёт ситуацию; семантика сверена с PHP/MySQL, программа и её учебные данные написаны отдельно.

Убедиться, что два объекта — два разговора с сервером

Фоновый импорт и страница отчёта подключены к одному серверу, но не делят переменные SQL-сессии. Чтобы связать запись журнала с нужным запросом, сопоставим mysqli thread_id и SQL CONNECTION_ID().

Исходные данные

Два подключения

Объект PHPСостояние
$dbНовое соединение A
$otherНовое соединение B

Что получится

Переменная SQL-сессии не общая

Соединение@legacy108_marker
Areport-A
BNULL

Идентификаторы

ПроверкаРезультат
thread_id A равен CONNECTION_ID Aда
thread_id B равен CONNECTION_ID Bда
A и B различаютсяда

Малый фрагмент: сначала смысл действия

SELECT CONNECTION_ID();
SET @legacy108_marker = 'report-A';
SELECT @legacy108_marker;

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

Два вызова подключения создают два настоящих соединения. Для каждого сервер возвращает свой идентификатор, и он совпадает с thread_id соответствующего объекта mysqli. SET @legacy108_marker задаёт пользовательскую переменную MySQL только в текущей SQL-сессии A. Отдельное чтение B возвращает NULL. Это не PHP-переменная и не общая строка таблицы.

Идентификаторы реальны и сохранены как наблюдения запуска. Они не зашиты в ожидаемый результат: проверяется различие A/B и совпадение SQL/API внутри одной SQL-сессии. После повторного подключения ID может измениться. Для бизнес-операции нужен собственный устойчивый ключ, а серверный connection ID полезен для текущей диагностики.

Ошибки и ограничения

thread_id — не номер потока операционной системы и не ID пользователя сайта. Не храните его как постоянную привязку клиента. Соединение, открытое позднее, не наследует произвольные переменные прежней SQL-сессии.

Полная самостоятельная программа PHP 8 и входные файлы
Убедиться, что два объекта — два разговора с серверомСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$other=legacy108Connect();$a=$db->thread_id;$b=$other->thread_id;
$sqlA=legacy108Read($db,'SELECT CONNECTION_ID()')[0][0];$sqlB=legacy108Read($other,'SELECT CONNECTION_ID()')[0][0];
$db->query("SET @legacy108_marker='report-A'");$valueA=legacy108Read($db,'SELECT @legacy108_marker')[0][0];$valueB=legacy108Read($other,'SELECT @legacy108_marker')[0][0];
$blocks=[legacy108Block('Переменная SQL-сессии не общая',['Соединение','@legacy108_marker'],[['A',$valueA],['B',$valueB]]),legacy108Block('Идентификаторы',['Проверка','Результат'],[['thread_id A равен CONNECTION_ID A',legacy108Yes((string)$a===$sqlA)],['thread_id B равен CONNECTION_ID B',legacy108Yes((string)$b===$sqlB)],['A и B различаются',legacy108Yes($a!==$b)]])];
$checks=['a_matches'=>(string)$a===$sqlA,'b_matches'=>(string)$b===$sqlB,'distinct'=>$a!==$b,'session_local'=>$valueA==='report-A'&&$valueB===null];
$observations=[['ID A',(string)$a],['ID B',(string)$b]];
legacy108Report('mysql108-diag-sessions',$blocks,$checks,$observations,$db,[]);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-sessions: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-sessions: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения

Попробуйте сами. Задайте marker=report-B во втором соединении и выведите обе строки. После закрытия B сохранённое значение A должно оставаться в A.

Найти только собственные соединения в списке процессов

В старом инструменте mysql_list_processes показывал текущие разговоры с сервером. Для диагностики своего кода достаточно найти два созданных им соединения, а не выгружать посетителю чужие запросы.

Исходные данные

Контролируемые соединения

AB
Выполняет запрос спискаОткрыто тем же учебным пользователем

Что получится

Фильтр по двум известным CONNECTION_ID

СоединениеСостояние наблюдения
Aнайдено
Bнайдено

Малый фрагмент: сначала смысл действия

$result = $db->query('SHOW FULL PROCESSLIST');
while ($row = $result->fetch_assoc()) {
    if ((string)$row['Id'] === (string)$db->thread_id) {
        echo $row['Command'];
    }
}

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

SHOW FULL PROCESSLIST возвращает результат со столбцами Id, User, Host, db, Command, Time, State, Info. Без права PROCESS аккаунт видит соединения своего SQL-аккаунта, а не только одну SQL-сессию текущего PHP-скрипта. В программе заранее известны ID A и B; после чтения списка сохраняются только эти две строки и ограниченный набор безопасных свойств. Поля User, Host и Info в публичный файл не копируются.

FULL относится к тексту Info: без него текст обычно ограничен первыми 100 символами. Это не команда «показать все права» и не расширение доступа. В наблюдениях видно, какую команду выполнял сервер в момент снимка; значения Time/State меняются и не объявлены стабильным договором. Наличие соединения ещё не доказывает отсутствие блокировок или корректность бизнес-операции.

Ошибки и ограничения

Не выдавайте право PROCESS обычному приложению ради красивого списка всех клиентов и не выполняйте KILL по номеру, полученному из пользовательского ввода. SHOW PROCESSLIST даёт моментальный снимок. Инструменты длительного наблюдения Performance Schema требуют отдельной настройки и прав.

Полная самостоятельная программа PHP 8 и входные файлы
Найти только собственные соединения в списке процессовСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$other=legacy108Connect();$a=(string)$db->thread_id;$b=(string)$other->thread_id;
$result=$db->query('SHOW FULL PROCESSLIST');$found=[];
while($row=$result->fetch_assoc()){$id=(string)$row['Id'];if($id===$a||$id===$b){$label=$id===$a?'A':'B';$found[$label]=$row;$observations[]=['ID '.$label,$id];$observations[]=['Command '.$label,(string)$row['Command']];}}
$result->free();ksort($found);$rows=[];foreach($found as $label=>$row){$rows[]=[$label,'найдено'];}
$blocks=[legacy108Block('Фильтр по двум известным CONNECTION_ID',['Соединение','Состояние наблюдения'],$rows)];
$checks=['a_visible'=>isset($found['A']),'b_visible'=>isset($found['B']),'exact_two'=>count($found)===2,'own_schema'=>isset($found['A'],$found['B'])&&$found['A']['db']===getenv('PHPMAN_MYSQL_DATABASE')&&$found['B']['db']===getenv('PHPMAN_MYSQL_DATABASE')];
legacy108Report('mysql108-diag-processes',$blocks,$checks,$observations,$db,[]);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-processes: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-processes: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения

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

Читать счётчики SQL-сессии по именам, а не разбирать строку stat

Старый мониторинг разбирает строку mysql_stat по пробелам и ломается при изменении формата. Для нужного показателя проще запросить именованную переменную с явно выбранной областью.

Исходные данные

Области наблюдения

SESSIONGLOBAL
Счётчик текущего соединенияСостояние всего сервера

Что получится

Действия в одной SQL-сессии

ДействиеРезультат
SELECT 11
SELECT 22
Com_select увеличился минимум на 2да

Малый фрагмент: сначала смысл действия

SHOW SESSION STATUS LIKE 'Com_select';
SELECT 1;
SELECT 2;
SHOW SESSION STATUS LIKE 'Com_select';

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

SESSION означает счётчик текущего соединения; GLOBAL — состояние сервера в целом. Программа читает SESSION Com_select, выполняет SELECT 1 и SELECT 2, затем снова читает счётчик. В ожидаемой таблице проверяются значения запросов и рост хотя бы на два. Абсолютные числа и разница отдельно записаны в наблюдениях. Дополнительно GLOBAL Uptime показывает время работы сервера в секундах, а не возраст PHP-процесса.

LIKE здесь фильтрует имя переменной состояния, а не строки каталога товаров. SHOW STATUS не измеряет время выполнения конкретного запроса. Сам сбор метрик тоже выполняет команды; набор и изменение счётчиков зависит от сервера и действий наблюдателя. Для своего монитора выбирайте несколько нужных имён и документируйте границы измерения.

Ошибки и ограничения

Не делайте вывод «сервер медленный» по одному uptime или числу соединений. Не вычитайте GLOBAL-счётчики и не приписывайте всю разницу одному запросу, пока на сервере работают другие клиенты. Строка stat полезна как текст для человека, но не заменяет договор полей мониторинга.

Полная самостоятельная программа PHP 8 и входные файлы
Читать счётчики SQL-сессии по именам, а не разбирать строку statСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$before=(int)legacy108Read($db,"SHOW SESSION STATUS LIKE 'Com_select'")[0][1];
$one=legacy108Read($db,'SELECT 1')[0][0];$two=legacy108Read($db,'SELECT 2')[0][0];
$after=(int)legacy108Read($db,"SHOW SESSION STATUS LIKE 'Com_select'")[0][1];
$uptime=legacy108Read($db,"SHOW GLOBAL STATUS LIKE 'Uptime'")[0][1];
$blocks=[legacy108Block('Действия в одной SQL-сессии',['Действие','Результат'],[['SELECT 1',$one],['SELECT 2',$two],['Com_select увеличился минимум на 2',legacy108Yes($after-$before>=2)]] )];
$checks=['first_value'=>$one==='1','second_value'=>$two==='2','select_counter'=>$after-$before>=2,'uptime_nonnegative'=>ctype_digit($uptime)];
$observations=[['SESSION Com_select до',(string)$before],['SESSION Com_select после',(string)$after],['Разница',(string)($after-$before)],['GLOBAL Uptime, секунды',$uptime]];
legacy108Report('mysql108-diag-status',$blocks,$checks,$observations,$db,[]);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-status: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-status: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения

Попробуйте сами. Добавьте SELECT 3 и сравните новую разницу Com_select. Затем вынесите чтение счётчика во второе соединение и объясните, почему SESSION второго соединения не считает SELECT первого.

Новое соединение не восстанавливает старое состояние

Старый код рассчитывает, что mysql_ping незаметно восстановит прежнюю SQL-сессию. Даже успешно открытое новое соединение не возвращает её переменные, временные таблицы и незавершённую транзакцию. Сделаем потерю состояния видимой.

Исходные данные

Перед закрытием

ПеременнаяЗначение
@legacy108_markerbefore-close

Что получится

Явное закрытие и повторное подключение

Этап@legacy108_marker
До closebefore-close
В новом соединенииNULL

Проверка нового разговора

ВопросОтвет
SELECT 11
ID соединения изменилсяда

Малый фрагмент: сначала смысл действия

$other->close();
$other = legacy108Connect(); // Вновь применены кодировка и настройки.
$value = $other->query('SELECT @legacy108_marker')->fetch_row()[0];
// $value === null: предыдущая переменная не восстановлена.

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

Сначала B сохраняет marker=before-close. Код намеренно закрывает B, затем явно открывает другое соединение и повторно применяет кодировку из helper. В новом B маркер равен NULL, а SELECT 1 подтверждает лишь возможность выполнить текущий запрос. Проверяются изменение ID и отсутствие прежнего marker. Это контролируемое закрытие, не имитация обрыва сети или испытание таймаутов.

mysql_ping удалён вместе с расширением; mysqli_ping тоже не является современной конечной рекомендацией: он deprecated с PHP 8.4, функция reconnect удалена с PHP 8.2, а mysqlnd не поддерживал автоматический reconnect этим способом. В приложении решение о новой попытке должно учитывать операцию. После потерянного подтверждения COMMIT неизвестно, была ли запись зафиксирована; новое соединение и SELECT 1 не дают права повторить списание.

Ошибки и ограничения

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

Полная самостоятельная программа PHP 8 и входные файлы
Новое соединение не восстанавливает старое состояниеСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$other=legacy108Connect();$oldId=$other->thread_id;$other->query("SET @legacy108_marker='before-close'");
$before=legacy108Read($other,'SELECT @legacy108_marker')[0][0];$other->close();$other=null;
$other=legacy108Connect();$newId=$other->thread_id;$after=legacy108Read($other,'SELECT @legacy108_marker')[0][0];$health=legacy108Read($other,'SELECT 1')[0][0];
$blocks=[legacy108Block('Явное закрытие и повторное подключение',['Этап','@legacy108_marker'],[['До close',$before],['В новом соединении',$after]]),legacy108Block('Проверка нового разговора',['Вопрос','Ответ'],[['SELECT 1',$health],['ID соединения изменился',legacy108Yes($oldId!==$newId)]])];
$checks=['old_value'=>$before==='before-close','new_session_empty'=>$after===null,'responding'=>$health==='1','new_id'=>$oldId!==$newId];
$observations=[['Предыдущий ID',(string)$oldId],['Новый ID',(string)$newId]];
legacy108Report('mysql108-diag-reconnect',$blocks,$checks,$observations,$db,[]);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-reconnect: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-reconnect: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения

Попробуйте сами. Прочитайте пример ключа повторной заявки и объясните, какая запись в таблице позволяет восстановить исход после потери ответа. Не используйте connection ID как такой ключ.

Разделить права приложения и создание базы администратором

Установщик старого проекта создавал базу функцией mysql_create_db, а очистка вызывала mysql_drop_db. После переноса нужно сохранить смысл операции и отдельно определить, кто имеет право уничтожить всю схему.

Исходные данные

Области ответственности

ПриложениеАдминистратор
Работает в выделенной схемеРешает о создании и удалении схем

Что получится

Что выполнено на самом деле

ОперацияРезультат
SELECT DATABASE()Учебная схема определена
SHOW GRANTS FOR CURRENT_USERСписок прав прочитан локально
CREATE/INSERT/SELECT собственной таблицыПрочитана 1 запись
CREATE DATABASEНе выполнялась
DROP DATABASEНе выполнялась

Собственная учебная таблица

idtitle
1Учебная запись

Малый фрагмент: сначала смысл действия

SELECT DATABASE();
SHOW GRANTS FOR CURRENT_USER;
-- Отдельный административный план, не исполняется примером:
-- CREATE DATABASE `mysql108_review_only` CHARACTER SET utf8mb4;
-- DROP DATABASE `mysql108_review_only`;

Это фрагмент внутри показанного сценария: $db — уже установленное соединение; $result — результат соответствующего SELECT. Полный запуск ниже самостоятельно создаёт нужные входные таблицы. Если показан SQL, его выполняет query/execute_query из полной программы.

Современные административные команды — CREATE DATABASE и DROP DATABASE. Они требуют соответствующих прав на целевую схему и не равны CREATE TABLE/DROP TABLE внутри выделенной базы. Пример читает текущую схему и SHOW GRANTS локально, создаёт только собственную учебную таблицу, сохраняет её строку в отчёт и удаляет таблицу в finally. Полный текст выданных прав в публичный файл не попадает.

Файл administrative-plan.sql содержит показанные команды только для чтения и согласования. PHP не отправляет их серверу. Поэтому успешный запуск не называется проверкой создания/удаления DATABASE. Имя mysql108_review_only фиксировано и отделено от текущей схемы. В настоящем установщике имя схемы выбирается из контролируемого договора; placeholder ? не может подставить SQL-идентификатор. CREATE DATABASE не выбирает схему автоматически: выбор выполняется отдельно.

Ошибки и ограничения

Наличие строки SHOW GRANTS не является универсальным парсером эффективных прав: роли, активные роли и область выдачи имеют значение. Успешный CREATE TABLE не доказывает CREATE DATABASE. Не переносите в приложение административные реквизиты ради прохождения учебного примера.

Полная самостоятельная программа PHP 8 и входные файлы
Разделить права приложения и создание базы администраторомСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/mysql108-metadata-helper.php';
$db=legacy108Connect();$other=null;$created=[];$blocks=[];$checks=[];$observations=[];
try {
$schema=legacy108Read($db,'SELECT DATABASE()')[0][0];$grants=legacy108Read($db,'SHOW GRANTS FOR CURRENT_USER');
legacy108Create($db,$created,'mysql108_diag_admin_plan','id INT PRIMARY KEY, title VARCHAR(30) NOT NULL');
$db->query("INSERT INTO mysql108_diag_admin_plan VALUES(1,'Учебная запись')");$data=legacy108Read($db,'SELECT id,title FROM mysql108_diag_admin_plan');
$plan="-- REVIEW ONLY: not executed by this PHP program.\n-- Requires a separate administrative decision and an appropriate account.\nCREATE DATABASE `mysql108_review_only` CHARACTER SET utf8mb4;\n-- Destructive command below removes the whole schema. Do not run automatically.\nDROP DATABASE `mysql108_review_only`;\n";
file_put_contents(__DIR__.'/administrative-plan.sql',$plan);
$blocks=[legacy108Block('Что выполнено на самом деле',['Операция','Результат'],[['SELECT DATABASE()','Учебная схема определена'],['SHOW GRANTS FOR CURRENT_USER','Список прав прочитан локально'],['CREATE/INSERT/SELECT собственной таблицы','Прочитана 1 запись'],['CREATE DATABASE','Не выполнялась'],['DROP DATABASE','Не выполнялась']]),legacy108Block('Собственная учебная таблица',['id','title'],$data)];
$checks=['schema_matches'=>$schema===getenv('PHPMAN_MYSQL_DATABASE'),'grants_returned'=>count($grants)>0,'own_data'=>$data===[['1','Учебная запись']],'plan_saved'=>is_file(__DIR__.'/administrative-plan.sql')];
$observations=[['Выбранная учебная схема',$schema],['Строк в локальном SHOW GRANTS',(string)count($grants)]];
legacy108Report('mysql108-diag-admin-plan',$blocks,$checks,$observations,$db,['administrative-plan.sql']);
} finally {legacy108Cleanup($db,$other,$created);}
echo "mysql108-diag-admin-plan: saved result.html and result.json\n";
Ожидаемый результат
mysql108-diag-admin-plan: saved result.html and result.json

Код использует mysqli, создаёт показанные учебные данные и сохраняет реальные result.html/result.json/observations.json. Уведомление консоли сообщает только о сохранении; полезный результат — таблицы выше и фактический HTML-файл. Helper и README включены в архив.

Скачать таблицы JSON · Открыть фактический результат · Скачать реальные наблюдения · Скачать неисполненный административный план

Попробуйте сами. Объясните отдельно три результата: выбранная схема уже существует; собственная таблица создана и прочитана; административный SQL только сохранён. Для развёртывания проекта составьте список минимальных прав и передайте создание схемы отдельному шагу администратора.

Исторические функции: отдельные контракты и путь переноса

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

ФункцияЗадачаВерсия устаревания
mysql_get_client_infoУзнать библиотеку клиента, которой пользовался PHPPHP5.5.0 → удаление7.0
mysql_get_host_infoПонять, каким транспортом установлено конкретное соединениеPHP5.5.0 → удаление7.0
mysql_get_proto_infoУзнать номер протокола обмена PHP с MySQLPHP5.5.0 → удаление7.0
mysql_get_server_infoПрочитать версию сервера, к которому действительно подключилисьPHP5.5.0 → удаление7.0
mysql_statПолучить старую краткую строку состояния MySQLPHP5.5.0 → удаление7.0
mysql_thread_idСвязать старый журнал PHP с серверной SQL-сессиейPHP5.5.0 → удаление7.0
mysql_pingПонять старую проверку связи и опасное ожидание автоматического reconnectPHP5.5.0 → удаление7.0
mysql_list_processesПеренести старую страницу наблюдения за соединениямиPHP5.5.0 → удаление7.0
mysql_create_dbПеренести создание схемы из старого установщикаPHP4.3.0 → удаление7.0
mysql_drop_dbУвидеть область действия удаления базы перед переносом очисткиPHP4.3.0 → удаление7.0

Следующий шаг: полезный закрытый отчёт

Составьте минимальный закрытый диагностический отчёт: выбранная учебная схема, сервер/клиент, ID текущего соединения и код нужной ошибки. Отделите его от публичного ответа посетителю. Для обработки ошибок и повторов продолжайте в SQLSTATE и восстановлении импорта; для ограниченного чтения большого результата — в жизненном цикле результата.

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

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

mysql_get_client_infoУзнать библиотеку клиента, которой пользовался PHP

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_get_client_info(): string

Узнать библиотеку клиента, которой пользовался PHP.

ПараметрИсторическое значение и смысл
Нет аргументовСведения относятся к клиентской библиотеке расширения, а не к серверному resource.

Возврат и отказ. Строка версии клиентской библиотеки MySQL. Функция появилась в PHP 4.0.5; отдельный отказ соединения не является её результатом, поскольку сервер здесь не опрашивается.

Границы и исторические примечания. Номер клиента не обязан совпадать с версией сервера. Это не версия HTTP-сервера и не доказательство поддерживаемости всех возможностей SQL на удалённой стороне.

Исторический фрагмент mysql_get_client_info — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$clientVersion = mysql_get_client_info();

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli_get_client_info() или client_info объекта mysqli; затем отдельно server_info/SELECT VERSION(). Современный mysqli использует mysqlnd, связанный с PHP, но сервер остаётся отдельным компонентом.

Два случая переноса и видимый результат

Отчёт после смены хостинга. В одном паспорте подписаны PHP, mysqlnd и MySQL, а не один неопределённый номер. Открыть исходные данные, результат и полную современную программу.

Два соединения одним драйвером. У двух реальных SQL-сессий разные ID, но они не становятся двумя версиями клиентской библиотеки. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_get_host_infoПонять, каким транспортом установлено конкретное соединение

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_get_host_info(resource $link_identifier = NULL): string|false

Понять, каким транспортом установлено конкретное соединение.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Строка с описанием типа соединения, включая серверный хост, или false при отказе. Доступна с PHP 4.0.5.

Границы и исторические примечания. Описание транспорта не является названием выбранной базы. localhost/socket и явный TCP могут вести по разным маршрутам. Строка сама по себе не доказывает TLS и не должна без необходимости раскрывать внутренний адрес посетителю.

Исторический фрагмент mysql_get_host_info — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$transport = mysql_get_host_info($link);

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli_get_host_info($db) или $db->host_info. Нужен явный правильный объект соединения. Имя схемы проверяется отдельным SELECT DATABASE(), шифрование — отдельными параметрами/состоянием TLS.

Два случая переноса и видимый результат

Разобрать отличие транспорта от версии сервера. Паспорт показывает host_info рядом с server_info, но подписывает их разный смысл. Открыть исходные данные, результат и полную современную программу.

Заново применить параметры подключения. Новая SQL-сессия открывается с явным локальным host/port и кодировкой, без предположения о наследовании старой. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_get_proto_infoУзнать номер протокола обмена PHP с MySQL

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_get_proto_info(resource $link_identifier = NULL): int|false

Узнать номер протокола обмена PHP с MySQL.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Целый номер протокола при успехе, false при отказе; функция появилась в PHP 4.0.5.

Границы и исторические примечания. Протокол обмена, версия сервера и TLS — три разных понятия. Например, число10 не означает сервер MySQL 10 и не гарантирует шифрование соединения.

Исторический фрагмент mysql_get_proto_info — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$protocol = mysql_get_proto_info($link);

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli_get_proto_info($db) или protocol_version объекта. Для возможностей SQL смотрите server_info и поддерживаемую сервером функциональность, для версии клиента — client_info.

Два случая переноса и видимый результат

Правильно подписать технический отчёт. Положительный protocol_version выводится отдельно от PHP/MySQL. Открыть исходные данные, результат и полную современную программу.

Привязать сведения к нужной SQL-сессии. Проверка thread_id/CONNECTION_ID напоминает, что сведения соединения читаются из выбранного объекта, а не последнего неявного link. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_get_server_infoПрочитать версию сервера, к которому действительно подключились

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_get_server_info(resource $link_identifier = NULL): string|false

Прочитать версию сервера, к которому действительно подключились.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Строка версии MySQL-сервера при успехе, false при отказе; доступна с PHP 4.0.5.

Границы и исторические примечания. Требуется установленное соединение. Версия mysql-клиента в терминале или библиотеки PHP не определяет версию сервера. Суффиксы сборки и иной сервер семейства MySQL требуют осмысленной интерпретации, а не простого сравнения строк.

Исторический фрагмент mysql_get_server_info — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$serverVersion = mysql_get_server_info($link);

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli_get_server_info($db)/server_info либо SELECT VERSION() через mysqli или PDO. Для паспорта полезно сверить два пути чтения в одной SQL-сессии, не утверждая универсальную эквивалентность всех MySQL-совместимых продуктов.

Два случая переноса и видимый результат

Проверить результат обновления сервера. Фактический SELECT VERSION() совпадает с API того же подключения. Открыть исходные данные, результат и полную современную программу.

Отделить версию от текущего состояния. Версия стабильна в запуске, а Uptime и счётчики изменяются; для мониторинга нужны обе подписанные категории. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_statПолучить старую краткую строку состояния MySQL

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_stat(resource $link_identifier = NULL): string

Получить старую краткую строку состояния MySQL.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Строка со сведениями об uptime, threads, queries, open tables, flush tables и запросах в секунду. Историческая документация отдельно указывает NULL при недействительном link_identifier. Для остальных переменных состояния предлагался SHOW STATUS. Доступна с PHP 4.3.0.

Границы и исторические примечания. Это текстовый диагностический ответ, не стабильная JSON-схема и не статистика одной бизнес-операции. Нельзя обещать неизменное расположение всех полей и точную атрибуцию глобального счётчика одному запросу.

Исторический фрагмент mysql_stat — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$statusLine = mysql_stat($link);
// Текст для диагностики; не массив счётчиков.

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli::stat существует как строковая диагностика. Для программного мониторинга предпочтительны именованные SHOW SESSION STATUS или SHOW GLOBAL STATUS с явно выбранной областью и ограниченным набором имён.

Два случая переноса и видимый результат

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

Понять, какие свои SQL-сессии живы. Список текущих ID дополняет счётчик, но не доказывает здоровье всех запросов. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_thread_idСвязать старый журнал PHP с серверной SQL-сессией

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_thread_id(resource $link_identifier = NULL): int|false

Связать старый журнал PHP с серверной SQL-сессией.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Текущий идентификатор соединения/серверного потока либо false при отказе. С PHP 4.3.0. В старом описании подчёркнуто: после переподключения через mysql_ping ID меняется, поэтому узнавать его следует тогда, когда он нужен.

Границы и исторические примечания. Это не постоянный ID пользователя, операции заказа или потока ОС. В новом соединении другое состояние; сохранённый давно ID не даёт права управлять произвольной серверной SQL-сессией.

Исторический фрагмент mysql_thread_id — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$connectionId = mysql_thread_id($link);

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. mysqli_thread_id($db)/thread_id и SQL CONNECTION_ID(). Для поиска собственной строки SHOW PROCESSLIST сопоставляйте эти ID, для безопасного повтора заявки используйте отдельный бизнес-ключ.

Два случая переноса и видимый результат

Показать границы двух подключений. API и SQL согласованы для A/B, а сессионная переменная не общая. Открыть исходные данные, результат и полную современную программу.

Увидеть смену SQL-сессии после закрытия. Новый ID и потерянный marker показывают, почему reconnect не восстанавливает транзакцию. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_pingПонять старую проверку связи и опасное ожидание автоматического reconnect

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_ping(resource $link_identifier = NULL): bool

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

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. true, если связь работает, иначе false. Историческое описание говорит о попытке автоматического переподключения после потери связи, но оговаривает, что с MySQL 5.0.3 automatic reconnect выключен по умолчанию. Функция появилась в PHP 4.3.0.

Границы и исторические примечания. После восстановления соединение — новая SQL-сессия: старый thread_id и состояние не сохраняются. Проверка связи перед запросом не гарантирует, что связь не исчезнет непосредственно после неё.

Исторический фрагмент mysql_ping — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$alive = mysql_ping($link);
// Старое поведение зависит от клиента и настроек reconnect.

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. Не заменяйте конечным советом на mysqli_ping: он deprecated с PHP 8.4, reconnect удалён с PHP 8.2, mysqlnd игнорировал такую автоматическую настройку. Приложение обрабатывает ошибку нужного запроса и принимает ограниченное решение о новом подключении/повторе с учётом идемпотентности. SELECT1 проверяет текущую возможность обмена, не восстанавливает незавершённую операцию.

Два случая переноса и видимый результат

Проверить явное новое подключение. SELECT1 успешен, но прежняя сессионная переменная отсутствует. Открыть исходные данные, результат и полную современную программу.

Не смешивать ID и бизнес-операцию. Два работающих соединения имеют разные контексты, хотя используют тот же сервер. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_list_processesПеренести старую страницу наблюдения за соединениями

PHP 4/5; deprecated 5.5.0; removed PHP 7.0 · mysql (removed)

mysql_list_processes(resource $link_identifier = NULL): resource|false

Перенести старую страницу наблюдения за соединениями.

ПараметрИсторическое значение и смысл
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. Resource списка текущих серверных потоков при успехе, false при отказе. Исторический пример читает Id, Host, db, Command и Time через mysql_fetch_assoc. Доступна с PHP 4.3.0.

Границы и исторические примечания. Это список, а не один thread_id. Видимость зависит от PROCESS и аккаунта; текст чужого запроса и адрес клиента могут быть чувствительными. Отсутствие SQL-сессии в снимке не объясняет все причины её завершения.

Исторический фрагмент mysql_list_processes — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$processes = mysql_list_processes($link);
// Дальше читались строки списка через mysql_fetch_assoc.

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. SHOW [FULL] PROCESSLIST через mysqli/PDO. Без PROCESS видны потоки того же SQL-аккаунта; FULL снимает обычное ограничение100 символов Info, а не расширяет права. Для одной собственной SQL-сессии хватит CONNECTION_ID, но это не эквивалент всего списка.

Два случая переноса и видимый результат

Найти два соединения своего теста. Из реального списка берём только заранее известные A/B и не публикуем чужой Info. Открыть исходные данные, результат и полную современную программу.

Дополнить снимок счётчиком своей SQL-сессии. Структурированный Com_select отвечает на другой вопрос, чем текущая Command. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_create_dbПеренести создание схемы из старого установщика

PHP 4/5; deprecated 4.3.0; removed PHP 7.0 · mysql (removed)

mysql_create_db(string $database_name, resource $link_identifier = NULL): bool

Перенести создание схемы из старого установщика.

ПараметрИсторическое значение и смысл
database_nameИмя новой базы на сервере выбранного соединения; не путь локального файла.
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

Возврат и отказ. true при успешном создании, false при отказе. Имя уже занято, нет нужных прав или сервер отклоняет команду — это не успешное развёртывание.

Границы и исторические примечания. Deprecated с PHP 4.3.0, alias mysql_createdb. Исторический manual отдельно предупреждал, что функция отсутствует при сборке ext/mysql с клиентской библиотекой MySQL 4.x. Создание базы не выбирает её автоматически.

Исторический фрагмент mysql_create_db — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$created = mysql_create_db("shop", $link);
// Историческая административная операция, не запускать в PHP 8.

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. CREATE DATABASE с явно выбранной кодировкой через административное соединение; нужны права CREATE на целевой объект. Команда DDL вызывает неявную фиксацию и не заменяется транзакционным INSERT. Имя — SQL-идентификатор, placeholder? не подставляет его. Учебный admin-plan сохраняет SQL, но не исполняет создание базы.

Два случая переноса и видимый результат

Разобрать установщик без прав администратора. Отдельно показаны выполненный lifecycle собственной таблицы и невыполненный CREATE DATABASE. Открыть исходные данные, результат и полную современную программу.

Проверить уже подготовленный контекст приложения. DATABASE() и видимость схемы проверяются без попытки создавать её при каждом HTTP-запросе. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

mysql_drop_dbУвидеть область действия удаления базы перед переносом очистки

PHP 4/5; deprecated 4.3.0; removed PHP 7.0 · mysql (removed)

mysql_drop_db(string $database_name, resource $link_identifier = NULL): bool

Увидеть область действия удаления базы перед переносом очистки.

ПараметрИсторическое значение и смысл
database_nameИмя всей удаляемой базы, а не имя одной таблицы или фильтр строк.
link_identifier = NULLResource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli.

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

Границы и исторические примечания. Deprecated с PHP 4.3.0, alias mysql_dropdb. Историческое предупреждение: недоступна при сборке с клиентской библиотекой MySQL 4.x. Нельзя вызывать её как общий cleanup приложения или рассчитывать на rollback для возврата схемы.

Исторический фрагмент mysql_drop_db — удалён в PHP 7, не запускаетсяФрагмент или команда
<?php
// Исторический контекст PHP 4/5. НЕ выполнять в PHP 7/8.
$removed = mysql_drop_db("shop", $link);
// Удалялась вся база. Это исторический контекст, не выполняемый код.

Это фрагмент для узнавания старого кода, не самостоятельная программа и не проверка выполнения mysql_*. Переменные $link/$result/$list обозначают прежние ресурсы, созданные окружающим кодом. Современные запускаемые программы указаны в двух случаях переноса ниже.

Современный путь. DROP DATABASE с соответствующим правом DROP и отдельным административным решением. IF EXISTS меняет поведение при отсутствии объекта, но не уменьшает масштаб удаления. DDL фиксируется неявно. В программе этой главы SQL только записан в plan-файл; реально удаляются исключительно собственные успешно созданные таблицы.

Два случая переноса и видимый результат

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

Различить список объектов и разрешение удалить. Видимость имени в каталоге не является подтверждением права или необходимости его удаления. Открыть исходные данные, результат и полную современную программу.

Общий маршрут переноса: подключение, кодировка и выбор API; запросы, ошибки и строки результата. Современные операции mysqli имеют отдельные карточки справочника.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.