Формирование новой БД через PHP
Создание базы данных средствами PHP
Разработка начинается с формирования хранилища информации. Для этого используются расширения PDO или mysqli. Основной подход предполагает подключение к серверу MySQL и отправку SQL-запроса CREATE DATABASE. Рассмотрим наиболее стабильный и переносимый вариант на основе PDO.
Как создать новую базу данных MySQL с помощью PDO?
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = 'new_database';
try {
$pdo = new PDO("mysql:host=$host", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE `$dbname`";
$pdo->exec($sql);
echo "База данных успешно создана";
} catch (PDOException $e) {
echo "Ошибка: " . $e->getMessage();
}
?>
Подключение осуществляется без указания имени существующей базы. Запрос выполняется через exec(), который возвращает количество затронутых строк. Обработка исключений позволяет перехватить ошибки, например, недостаток привилегий или неверные параметры подключения.
Типичные ошибки:
- Access denied – пользователь не имеет права создавать базы. Решение: выдать грант CREATE или использовать учётную запись с полными правами.
- Database exists – попытка повторного создания. Решение: перед CREATE проверить существование запросом SHOW DATABASES LIKE '...' или использовать конструкцию CREATE DATABASE IF NOT EXISTS.
- Пустое имя базы – необходимо валидировать пользовательский ввод.
Как создать базу данных в PHP с использованием расширения mysqli в объектном стиле?
<?php
$mysqli = new mysqli('localhost', 'root', '');
if ($mysqli->connect_error) {
die("Ошибка подключения: " . $mysqli->connect_error);
}
$sql = "CREATE DATABASE IF NOT EXISTS example_db";
if ($mysqli->query($sql) === TRUE) {
echo "База данных создана или уже существует";
} else {
echo "Ошибка: " . $mysqli->error;
}
$mysqli->close();
?>
Метод query() подходит для запросов, не возвращающих набор строк. Конструкция IF NOT EXISTS предотвращает ошибку дублирования. Для работы с кодировками рекомендуется сразу после создания базы установить set_charset('utf8mb4').
Возможные сложности:
- При использовании старых версий PHP или MySQL могут не поддерживаться некоторые параметры.
- Если база уже существует, но операция CREATE DATABASE без IF NOT EXISTS возвращает ошибку – требуется корректная обработка.
Как выполнить создание базы данных процедурным способом с mysqli?
<?php
$link = mysqli_connect('localhost', 'root', '');
if (!$link) {
die('Ошибка соединения: ' . mysqli_connect_error());
}
$query = "CREATE DATABASE IF NOT EXISTS `test_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (mysqli_query($link, $query)) {
echo "База данных test_db готова к работе";
} else {
echo "Не удалось создать базу: " . mysqli_error($link);
}
mysqli_close($link);
?>
Процедурный интерфейс удобен для быстрых скриптов без ООП. Рекомендуется указывать набор символов и правила сравнения. Ошибки перехватываются через mysqli_error().
Если скрипт выполняется на сервере с ограниченным окружением, возможно отсутствие расширения mysqli. В таком случае следует применять PDO или убедиться в установке модуля.
Расширенные примеры создания баз данных
Пример 1: PDO с выбором кодировки и проверкой существования
<?php
$dsn = 'mysql:host=localhost';
$user = 'root';
$pass = '';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
// Проверка существования базы
$stmt = $pdo->query("SHOW DATABASES LIKE 'my_app_db'");
if ($stmt->rowCount() == 0) {
$pdo->exec("CREATE DATABASE `my_app_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
echo "База my_app_db создана с кодировкой utf8mb4";
} else {
echo "База my_app_db уже существует";
}
} catch (PDOException $e) {
echo "Ошибка: " . $e->getMessage();
}
?>
База my_app_db создана с кодировкой utf8mb4
Здесь используется запрос SHOW DATABASES для проверки наличия базы. В случае отсутствия выполняется создание с явным указанием кодировки, что важно для поддержки эмодзи и многобайтовых символов.
Пример 2: mysqli объектный стиль с детальным выводом ошибок
<?php
$mysqli = @new mysqli('localhost', 'root', '', null, 3306);
if ($mysqli->connect_errno) {
die("Код ошибки: {$mysqli->connect_errno} - {$mysqli->connect_error}");
}
$db_name = 'shop_' . date('Ymd');
$sql = "CREATE DATABASE `$db_name`";
if (!$mysqli->query($sql)) {
$error = $mysqli->errno . ': ' . $mysqli->error;
echo "Не удалось создать базу: $error";
} else {
echo "База $db_name успешно создана";
}
$mysqli->close();
?>
База shop_20250204 успешно создана
Имя базы формируется динамически с текущей датой, что удобно для тестовых стендов. Код ошибки и её описание выводятся для диагностики.
Пример 3: Создание временной базы данных SQLite
<?php
$db = new PDO('sqlite:/tmp/temp_project.db');
$db->exec("CREATE TABLE IF NOT EXISTS logs (id INTEGER PRIMARY KEY, message TEXT)");
echo "SQLite база создана в временной папке";
?>
SQLite база создана в временной папке
В отличие от MySQL, SQLite не требует отдельной команды создания базы: файл формируется при первом подключении. Этот подход подходит для прототипирования или оффлайн-решений.
Пример 4: Пакетное создание нескольких баз через PDO
<?php
$databases = ['dev_db', 'test_db', 'staging_db'];
$pdo = new PDO('mysql:host=localhost', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
foreach ($databases as $db) {
try {
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$db`");
echo "База $db обработана\n";
} catch (PDOException $e) {
echo "Ошибка для $db: " . $e->getMessage() . "\n";
}
}
?>
База dev_db обработана База test_db обработана База staging_db обработана
Цикл позволяет создать несколько баз за одно выполнение скрипта. Ошибки обрабатываются индивидуально, выполнение не прерывается.