Подключение к MySQL и создание баз данных на PHP

Раздел: Базы данных -> Подключение и создание БД

Подключение и создание баз данных MySQL в PHP

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

Как настроить безопасное и гибкое подключение через PDO?

PHP Data Objects (PDO) предоставляет единый интерфейс для работы с различными СУБД, включая MySQL. Основное эффективное решение заключается в использовании PDO с включёнными исключениями и поддержкой подготовленных запросов.

<?
$dsn = 'mysql:host=localhost;dbname=my_database;charset=utf8mb4';
$user = 'root';
$password = '';
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
    $pdo = new PDO($dsn, $user, $password, $options);
    echo 'Подключение установлено';
} catch (PDOException $e) {
    echo 'Ошибка подключения: ' . $e->getMessage();
}
?>

Php базы данных mysql (базы данных mysql в php)

В примере строка DSN содержит имя хоста, имя базы данных (my_database) и кодировку. Массив $options задаёт режим ошибок, способ выборки и отключает эмуляцию подготовленных запросов (рекомендуется для работы с настоящими prepared statements). Блок try-catch перехватывает исключения.

Типичные проблемы: неверный хост или порт, отсутствие драйвера PDO для MySQL (pdo_mysql), неправильные учётные данные, запрет на удалённое подключение. Решение - проверить наличие расширения <? phpinfo(); ?>, уточнить параметры в файле конфигурации, использовать правильные права доступа.

Как выполнить подключение при помощи процедурного стиля mysqli?

Процедурные функции mysqli_connect и mysqli_connect_errno позволяют быстро установить соединение. Этот вариант подходит для небольших проектов или при миграции со старого кода.

<?
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'my_database';

$link = mysqli_connect($host, $user, $password, $database);
if (!$link) {
    die('Ошибка подключения: ' . mysqli_connect_error());
}
echo 'Успешное подключение (процедурный стиль)';
?>

После подключения обязательно устанавливается кодировка: mysqli_set_charset($link, 'utf8mb4'). Если соединение не удалось, функция возвращает false.

Ошибки: в случае указания несуществующей базы данных подключение всё равно может быть установлено, но выбор БД не произойдёт. Следует проверять результат mysqli_select_db($link, $database). Также частой проблемой является отсутствие расширения mysqli в php.ini.

Как создать объект mysqli для работы с базой данных?

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

<?
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'my_database';

$mysqli = new mysqli($host, $user, $password, $database);
if ($mysqli->connect_errno) {
    echo 'Ошибка подключения: ' . $mysqli->connect_error;
    exit();
}
$mysqli->set_charset('utf8mb4');
echo 'Подключение через mysqli (ООП) выполнено';
?>

Конструктор класса mysqli сразу пытается установить соединение. Свойство connect_errno содержит код ошибки, а connect_error - текст ошибки.

Проблемы: при ошибке подключения конструктор может выбросить исключение, если в php.ini включена опция mysqli.error_reporting = E_STRICT. Рекомендуется использовать проверку $mysqli->connect_errno перед работой.

Как вынести параметры подключения в конфигурационный файл?

Для безопасности и удобства параметры соединения (хост, пользователь, пароль, база) сохраняют в отдельном файле config.php, который подключается в нужных скриптах.

<? // config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'my_database');
define('DB_CHARSET', 'utf8mb4');
?>

<? // index.php
require_once 'config.php';
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
try {
    $pdo = new PDO($dsn, DB_USER, DB_PASS);
    echo 'Подключение через конфиг';
} catch (PDOException $e) {
    echo $e->getMessage();
}
?>

Разделение параметров упрощает смену настроек между окружениями (локальное, тестовое, продакшн). Для хранения паролей в продакшне рекомендуется использовать переменные окружения.

Типичные ошибки: неправильный путь к файлу config.php, опечатки в именах констант, случайное раскрытие данных через вывод файла (если сервер не настроен). Также не следует хранить конфигурационный файл в корне веб-сервера без защиты.

Как создать новую базу данных через PHP после подключения?

После установки соединения можно выполнить SQL-запрос CREATE DATABASE. Для этого подходит любой из рассмотренных способов подключения.

<?
// Предполагается, что $pdo уже создано (например, через PDO)
try {
    $sql = 'CREATE DATABASE IF NOT EXISTS `new_database` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci';
    $pdo->exec($sql);
    echo 'База данных создана или уже существует';
} catch (PDOException $e) {
    echo 'Ошибка при создании БД: ' . $e->getMessage();
}
?>

Для mysqli (ООП): $mysqli->query('CREATE DATABASE IF NOT EXISTS `new_database`');. Проверка успешности выполняется через $pdo->errorCode() или $mysqli->error.

Проблемы: недостаточно прав у пользователя MySQL (отсутствует привилегия CREATE). В таком случае запрос завершится ошибкой. Решение - предоставить пользователю соответствующие права через администратора MySQL. Также следует избегать создания уже существующей БД без проверки (использовать IF NOT EXISTS).

Как проверить, существует ли база данных, перед созданием?

Можно запросить список существующих баз через SHOW DATABASES и сравнить с нужным именем. Это позволяет избежать ошибки дублирования.

<?
$databaseName = 'my_new_db';
$stmt = $pdo->query('SHOW DATABASES LIKE :db');
$stmt->execute([':db' => $databaseName]);
if (!$stmt->fetch()) {
    $pdo->exec('CREATE DATABASE `'.$databaseName.'`');
    echo 'База данных создана';
} else {
    echo 'База данных уже существует';
}
?>

Альтернатива - использовать SHOW DATABASES без LIKE и фильтровать средствами PHP, но запрос с LIKE эффективнее.

Ошибки: неинформированный пользователь может не иметь прав на SHOW DATABASES. В таких случаях лучше использовать конструкцию CREATE DATABASE IF NOT EXISTS, которая не выдаст ошибку, если БД уже есть.

Расширенные примеры подключения и создания БД

Пример 1: PDO с настройками UTF-8 и постоянным соединением

Постоянное соединение (persistent connection) уменьшает время на повторные подключения, но требует аккуратного использования в долгих скриптах.

Пример
<?
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_PERSISTENT         => true,
];
try {
    $pdo = new PDO($dsn, 'root', '', $options);
    $pdo->exec('SET NAMES utf8mb4'); // дополнительная настройка кодировки
    echo 'Постоянное соединение установлено' . PHP_EOL;
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
Постоянное соединение установлено

Примечание: постоянное соединение может привести к исчерпанию лимита одновременных подключений, если не закрывать их явно.

Пример 2: Обработка ошибок mysqli через исключения

С помощью mysqli_report можно перевести ошибки mysqli в исключения, что упрощает отладку.

Пример
<?
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'root', '', 'test');
$mysqli->set_charset('utf8mb4');

try {
    $result = $mysqli->query('SELECT * FROM nonexistent_table');
} catch (Exception $e) {
    echo 'Исключение mysqli: ' . $e->getMessage();
}
?>
Исключение mysqli: Table 'test.nonexistent_table' doesn't exist

Пример 3: Создание БД с выбором кодировки и коллейшена

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

Пример
<?
$pdo = new PDO('mysql:host=localhost', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbname = 'example_utf8mb4';
$sql = "CREATE DATABASE `$dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
try {
    $pdo->exec($sql);
    echo "База данных '$dbname' создана с кодировкой utf8mb4";
} catch (PDOException $e) {
    echo "Ошибка: " . $e->getMessage();
}
?>
База данных 'example_utf8mb4' создана с кодировкой utf8mb4

Пример 4: Подключение через mysqli с проверкой наличия базы данных и её созданием

Комбинированный пример: сначала подключаемся к серверу без указания базы, проверяем существование, при необходимости создаём.

Пример
<?
$host = 'localhost';
$user = 'root';
$password = '';
$newDb = 'auto_created_db';

$mysqli = new mysqli($host, $user, $password);
if ($mysqli->connect_errno) {
    die('Connect Error: ' . $mysqli->connect_error);
}
$result = $mysqli->query("SHOW DATABASES LIKE '$newDb'");
if ($result->num_rows == 0) {
    $mysqli->query("CREATE DATABASE `$newDb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
    echo "Создана база данных '$newDb'". PHP_EOL;
} else {
    echo "База данных '$newDb' уже существует". PHP_EOL;
}
// Теперь подключаемся к созданной базе
$mysqli->select_db($newDb);
echo 'Подключение к БД выполнено';
?>
Создана база данных 'auto_created_db'
Подключение к БД выполнено

Пример 5: Использование переменных окружения для конфигурации

Вместо жёстко заданных параметров рекомендуется читать настройки из переменных окружения (например, для Docker или облачных сред).

Пример
<?
$host = getenv('DB_HOST') ?: 'localhost';
$port = getenv('DB_PORT') ?: '3306';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASS') ?: '';
$db   = getenv('DB_NAME') ?: 'default_db';
$dsn  = "mysql:host=$host;port=$port;dbname=$db;charset=utf8mb4";
try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Подключение через переменные окружения выполнено';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
Подключение через переменные окружения выполнено

Базы данных MySQL в PHP - comments

En
Php базы данных mysql (php)