Рассмотрим небольшой PHP код, который пытается подключиться к СУБД MySQL или MariaDB и выполнить запрос с выражением SELECT:
<?php $db_user = "root"; $db_password = ""; $mysqli = new mysqli("localhost", $db_user, $db_password); if ($mysqli->connect_errno) { printf("Somehow we failed: %s\n", $mysqli->connect_error); exit(); } $query = "SELECT * FROM TestTABLE;"; $result = $mysqli->query($query); while ($row = $result->fetch_assoc()) { echo $row["id"] . ': ' . $row["test_column"] . PHP_EOL; }
Данный скрипт вылетает с ошибкой:
PHP Fatal error: Uncaught mysqli_sql_exception: No database selected in /home/mial/test/php/no_db_selected.php:13 Stack trace: #0 /home/mial/test/php/no_db_selected.php(13): mysqli->query('SELECT * FROM T...') #1 {main} thrown in /home/mial/test/php/no_db_selected.php on line 13 Fatal error: Uncaught mysqli_sql_exception: No database selected in /home/mial/test/php/no_db_selected.php:13 Stack trace: #0 /home/mial/test/php/no_db_selected.php(13): mysqli->query('SELECT * FROM T...') #1 {main} thrown in /home/mial/test/php/no_db_selected.php on line 13
Причина проблемы указана в тексте ошибки: «No database selected», то есть не выбрана база данных. Поскольку база данных не указана, то MySQL или MariaDB просто не понимают, для какой из них предназначен запрос.
Очень похожая проблема рассмотрена в статье «Ошибка «ERROR 1046 (3D000): No database selected» в MySQL и MariaDB (РЕШЕНО)». Но там эта ошибка возникает при подключении к серверу баз данных с помощью клиента с интерфейсом командной строки. Показанные в той заметке решения этой проблемы также ориентированы на ситуации когда вы делаете запросы к серверу MySQL или MariaDB в клиенте командной строки.
В этой же заметке я покажу как исправить эту ошибку в PHP скрипте. Хотя я запускаю PHP скрипты в командной строке, всё сказанное в этой статье также применимо при работе PHP скриптов на веб-сервере и выводе результатов в веб-браузер.
1. Укажите базу данных с помощью предварительного запроса с выражением «USE»
Прежде чем выполнить основной запрос, выполните запрос с использованием выражения «USE». Как и в случае с консольным клиентом, это выражение позволяет указать базу данных, для которой будут предназначены последующие запросы.
$query = "USE TestDB;"; $mysqli->query($query);
Полный код PHP скрипта:
<?php $db_user = "root"; $db_password = ""; $mysqli = new mysqli("localhost", $db_user, $db_password); if ($mysqli->connect_errno) { printf("Somehow we failed: %s\n", $mysqli->connect_error); exit(); } $query = "USE TestDB;"; $mysqli->query($query); $query = "SELECT * FROM TestTABLE;"; $result = $mysqli->query($query); while ($row = $result->fetch_assoc()) { echo $row["id"] . ': ' . $row["test_column"] . PHP_EOL; }
Как можно убедиться, теперь скрипт завершил работу без ошибок и вывел незатейливое содержимое таблицы.
Что нужно помнить при использовании выражения «USE» в PHP скрипте:
1) Выбранная база данных с помощью «USE» сохраняется в рамках текущего сеанса подключения к серверу MySQL (MariadDB). То есть для созданного экземпляра mysqli выбранная база данных запоминается, показ соединение не будет закрыто или пока PHP скрипт не завершит работу. Это немного контринтуитивно. Проще говоря, НЕ нужно комбинировать запрос с выбором базы данных и запросом к таблице, например так:
$query = "USE TestDB; SELECT * FROM TestTABLE;";
Эти два запроса можно выполнить по отдельности.
Кстати, именно поэтому сохраняется эффект от выбора набора символа для соединения:
$mysqli->query("SET NAMES utf8mb4");
2) Вы можете в любое время вновь использовать выражение «USE» для выбора другой базы данных. Это автоматически отменит предыдущий выбор — в точности как при работе через клиент MySQL (MariaDB) с интерфейсом командной строки.
3) Кстати, если в одном скрипте вы намереваетесь работать с несколькими базами данных, то вместо жонглирования выражениями «USE» продуктивнее открыть два или больше отдельных подключений к серверу MySQL. Для каждого из этих подключений вы можете выбрать собственную базу данных.
2. Укажите базу данных при подключении к серверу MySQL и MariaDB
При открытии нового подключения к MySQL серверу вы можете указать в качестве четвёртого опционального аргумента базу данных, например:
$mysqli = new mysqli("localhost", $db_user, $db_password, "TestDB");
Полный код PHP скрипта (теперь без выражения «USE»):
<?php $db_user = "root"; $db_password = ""; $mysqli = new mysqli("localhost", $db_user, $db_password, "TestDB"); if ($mysqli->connect_errno) { printf("Somehow we failed: %s\n", $mysqli->connect_error); exit(); } $query = "SELECT * FROM TestTABLE;"; $result = $mysqli->query($query); while ($row = $result->fetch_assoc()) { echo $row["id"] . ': ' . $row["test_column"] . PHP_EOL; }
Скрипт вновь завершил работу без ошибки.
Этот синтаксис очень удобен и, пожалуй, такой вариант выбора базы данных наиболее распространён.
Вы можете в любое время выбрать другую базу данных с помощью выражения «USE». Но я бы рекомендовал вместо использования выражения «USE» открыть ещё одно подключение к серверу MySQL и использовать разные подключения для работы с разными базами данных.
3. Укажите базу данных в запросе
В запросах SELECT и других выражениях в которых используется имя таблицы можно указать «путь» до таблицы в формате «БАЗА ДАННЫХ.ТАБЛИЦА». То есть в начале следует указать имя базы данных, затем точку и затем название таблицы.
Обратите особое внимание на следующую строку:
$query = "SELECT * FROM TestDB.TestTABLE;";
Полный код скрипта:
<?php $db_user = "root"; $db_password = ""; $mysqli = new mysqli("localhost", $db_user, $db_password); if ($mysqli->connect_errno) { printf("Somehow we failed: %s\n", $mysqli->connect_error); exit(); } $query = "SELECT * FROM TestDB.TestTABLE;"; $result = $mysqli->query($query); while ($row = $result->fetch_assoc()) { echo $row["id"] . ': ' . $row["test_column"] . PHP_EOL; }
Результат выполнения без ошибки:
Этот синтаксис нужно знать, поскольку без него невозможно обойтись в запросах к нескольким таблицам из разных баз данных.
Используя этот синтаксис вы можете выполнить запрос к любой базе данных не меняя текущую базу данных с помощью выражения «USE».
В выражении «SHOW TABLES» также можно указать базу данных и поэтому необязательно предварительно использовать выражение «USE»:
$query = "SHOW TABLES FROM TestDB;"; $result = $mysqli->query($query);
Связанные статьи:
- Ошибка при использовании выражений USE в MySQL (MariaDB): «ERROR 1044 (42000): Access denied for user» (РЕШЕНО) (66.4%)
- Ошибка «ERROR 1046 (3D000): No database selected» в MySQL и MariaDB (РЕШЕНО) (66.4%)
- PHP не отображает эмодзи из базы данных MySQL / MariaDB (РЕШЕНО) (65%)
- Как разрешить пользователю доступ только к определённым базам данных в MySQL (MariaDB) (64.9%)
- Как разрешить доступ пользователю только к определённым таблицам в MySQL (MariaDB) (64.9%)
- Решение проблемы 'cannot import name opentype' (RANDOM - 1.5%)