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

Дерево руководства
Глава 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 могут быть подключены к одному серверу и иметь разное состояние.
- Свой PHP-процесс → собственный mysqli
- Запрос конкретного показателя у MySQL
- Сравнение по понятному правилу
- Отчёт без пароля, полного SHOW GRANTS и чужих SQL
- Следующее действие по причине, а не бесконечный повтор
Окружение, отчёты и границы проверки
Полные программы выполняются на 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 ни один пример не выполняет.
- example.php выполняет современные запросы MySQLi
- result.json: точные таблицы результата
- observations.json: реальные версии, ID и счётчики
- result.html: те же таблицы и наблюдения, удобно читать в браузере
- 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 |
|---|---|
| A | report-A |
| B | NULL |
Идентификаторы
| Проверка | Результат |
|---|---|
| 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 показывал текущие разговоры с сервером. Для диагностики своего кода достаточно найти два созданных им соединения, а не выгружать посетителю чужие запросы.
Исходные данные
Контролируемые соединения
| A | B |
|---|---|
| Выполняет запрос списка | Открыто тем же учебным пользователем |
Что получится
Фильтр по двум известным 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 по пробелам и ломается при изменении формата. Для нужного показателя проще запросить именованную переменную с явно выбранной областью.
Исходные данные
Области наблюдения
| SESSION | GLOBAL |
|---|---|
| Счётчик текущего соединения | Состояние всего сервера |
Что получится
Действия в одной SQL-сессии
| Действие | Результат |
|---|---|
| SELECT 1 | 1 |
| SELECT 2 | 2 |
| 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 и входные файлы
<?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_marker | before-close |
Что получится
Явное закрытие и повторное подключение
| Этап | @legacy108_marker |
|---|---|
| До close | before-close |
| В новом соединении | NULL |
Проверка нового разговора
| Вопрос | Ответ |
|---|---|
| SELECT 1 | 1 |
| 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 | Не выполнялась |
Собственная учебная таблица
| id | title |
|---|---|
| 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 | Узнать библиотеку клиента, которой пользовался PHP | PHP5.5.0 → удаление7.0 |
mysql_get_host_info | Понять, каким транспортом установлено конкретное соединение | PHP5.5.0 → удаление7.0 |
mysql_get_proto_info | Узнать номер протокола обмена PHP с MySQL | PHP5.5.0 → удаление7.0 |
mysql_get_server_info | Прочитать версию сервера, к которому действительно подключились | PHP5.5.0 → удаление7.0 |
mysql_stat | Получить старую краткую строку состояния MySQL | PHP5.5.0 → удаление7.0 |
mysql_thread_id | Связать старый журнал PHP с серверной SQL-сессией | PHP5.5.0 → удаление7.0 |
mysql_ping | Понять старую проверку связи и опасное ожидание автоматического reconnect | PHP5.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 на удалённой стороне.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. Строка с описанием типа соединения, включая серверный хост, или false при отказе. Доступна с PHP 4.0.5.
Границы и исторические примечания. Описание транспорта не является названием выбранной базы. localhost/socket и явный TCP могут вести по разным маршрутам. Строка сама по себе не доказывает TLS и не должна без необходимости раскрывать внутренний адрес посетителю.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. Целый номер протокола при успехе, false при отказе; функция появилась в PHP 4.0.5.
Границы и исторические примечания. Протокол обмена, версия сервера и TLS — три разных понятия. Например, число10 не означает сервер MySQL 10 и не гарантирует шифрование соединения.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. Строка версии MySQL-сервера при успехе, false при отказе; доступна с PHP 4.0.5.
Границы и исторические примечания. Требуется установленное соединение. Версия mysql-клиента в терминале или библиотеки PHP не определяет версию сервера. Суффиксы сборки и иной сервер семейства MySQL требуют осмысленной интерпретации, а не простого сравнения строк.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. Строка со сведениями об uptime, threads, queries, open tables, flush tables и запросах в секунду. Историческая документация отдельно указывает NULL при недействительном link_identifier. Для остальных переменных состояния предлагался SHOW STATUS. Доступна с PHP 4.3.0.
Границы и исторические примечания. Это текстовый диагностический ответ, не стабильная JSON-схема и не статистика одной бизнес-операции. Нельзя обещать неизменное расположение всех полей и точную атрибуцию глобального счётчика одному запросу.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. Текущий идентификатор соединения/серверного потока либо false при отказе. С PHP 4.3.0. В старом описании подчёркнуто: после переподключения через mysql_ping ID меняется, поэтому узнавать его следует тогда, когда он нужен.
Границы и исторические примечания. Это не постоянный ID пользователя, операции заказа или потока ОС. В новом соединении другое состояние; сохранённый давно ID не даёт права управлять произвольной серверной SQL-сессией.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. true, если связь работает, иначе false. Историческое описание говорит о попытке автоматического переподключения после потери связи, но оговаривает, что с MySQL 5.0.3 automatic reconnect выключен по умолчанию. Функция появилась в PHP 4.3.0.
Границы и исторические примечания. После восстановления соединение — новая SQL-сессия: старый thread_id и состояние не сохраняются. Проверка связи перед запросом не гарантирует, что связь не исчезнет непосредственно после неё.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение 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-сессии в снимке не объясняет все причины её завершения.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. true при успешном создании, false при отказе. Имя уже занято, нет нужных прав или сервер отклоняет команду — это не успешное развёртывание.
Границы и исторические примечания. Deprecated с PHP 4.3.0, alias mysql_createdb. Исторический manual отдельно предупреждал, что функция отсутствует при сборке ext/mysql с клиентской библиотекой MySQL 4.x. Создание базы не выбирает её автоматически.
<?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 = NULL | Resource старого подключения. При пропуске выбиралось последнее соединение mysql_connect; если его не было, делалась попытка mysql_connect без аргументов. Неудача установить соединение давала E_WARNING. В новом коде передавайте конкретный объект mysqli. |
Возврат и отказ. true при удалении, false при отказе. Успех означает удаление целой базы, а не отменяемую пометку или очистку одной тестовой записи.
Границы и исторические примечания. Deprecated с PHP 4.3.0, alias mysql_dropdb. Историческое предупреждение: недоступна при сборке с клиентской библиотекой MySQL 4.x. Нельзя вызывать её как общий cleanup приложения или рассчитывать на rollback для возврата схемы.
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


