Формирование новой БД через PHP

Раздел: PHP программирование -> Базы данных в 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 обработана

Цикл позволяет создать несколько баз за одно выполнение скрипта. Ошибки обрабатываются индивидуально, выполнение не прерывается.

Создание базы данных в PHP - comments

En
создание базы php (php)