PHP MySQL 创建数据库

在 PHP 中通过 mysqliPDO 连接 MySQL 并创建数据库是一项常见任务。以下是使用 PHP 连接 MySQL 并创建数据库的中文讲解,包含 mysqliPDO 的实现方式、代码示例和注意事项,简洁明了。


1. 前提条件

  • MySQL 服务器:确保 MySQL 服务正在运行。
  • PHP 扩展:确认启用了 mysqlipdo_mysql 扩展(PHP 默认包含)。
  • 权限:连接的 MySQL 用户需要有 CREATE 权限以创建数据库。

2. 使用 mysqli 创建数据库

mysqli 提供面向对象和面向过程两种方式来执行 SQL 的 CREATE DATABASE 语句。

2.1 面向对象方式

<?php
$host = 'localhost';
$user = 'root';
$password = ''; // 根据实际情况设置密码

// 创建连接(未指定数据库)
$mysqli = new mysqli($host, $user, $password);

// 检查连接
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

// 创建数据库
$sql = "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if ($mysqli->query($sql) === TRUE) {
    echo "数据库 mydb 创建成功!";
} else {
    echo "创建数据库失败: " . $mysqli->error;
}

// 关闭连接
$mysqli->close();
?>

2.2 面向过程方式

<?php
$host = 'localhost';
$user = 'root';
$password = '';

// 创建连接
$conn = mysqli_connect($host, $user, $password);

// 检查连接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}

// 创建数据库
$sql = "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (mysqli_query($conn, $sql)) {
    echo "数据库 mydb 创建成功!";
} else {
    echo "创建数据库失败: " . mysqli_error($conn);
}

// 关闭连接
mysqli_close($conn);
?>

3. 使用 PDO 创建数据库

PDO 通过执行 SQL 语句创建数据库,支持异常处理,适合现代化开发。

示例代码

<?php
$host = 'localhost';
$user = 'root';
$password = '';

try {
    // 创建 PDO 连接(未指定数据库)
    $pdo = new PDO("mysql:host=$host;charset=utf8mb4", $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 创建数据库
    $sql = "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
    $pdo->exec($sql);
    echo "数据库 mydb 创建成功!";
} catch (PDOException $e) {
    die("创建数据库失败: " . $e->getMessage());
}

// 关闭连接
$pdo = null;
?>

4. 关键点解析

  1. CREATE DATABASE 语句
  • 语法:CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集] [COLLATE 排序规则];
  • IF NOT EXISTS:防止数据库已存在时抛出错误。
  • CHARACTER SET utf8mb4:支持完整 Unicode 字符(如中文、表情符号)。
  • COLLATE utf8mb4_unicode_ci:不区分大小写的排序规则,适合多语言环境。
  1. 连接时不指定数据库
  • 创建数据库时,连接 MySQL 不需要指定具体数据库($databasedbname 参数留空)。
  • 创建成功后,可重新连接到新数据库进行后续操作。
  1. 权限要求
  • 确保 MySQL 用户(如 root)有 CREATE 权限。可通过以下 SQL 检查:
    sql SHOW GRANTS FOR 'user'@'host';

5. 创建数据库后创建表(示例)

创建数据库后,通常需要创建表。以下是连接到新数据库并创建表的示例。

mysqli 示例

<?php
$mysqli = new mysqli('localhost', 'root', '', 'mydb');
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

// 创建表
$sql = "CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
)";
if ($mysqli->query($sql) === TRUE) {
    echo "表 users 创建成功!";
} else {
    echo "创建表失败: " . $mysqli->error;
}

$mysqli->close();
?>

PDO 示例

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 创建表
    $sql = "CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        email VARCHAR(100) NOT NULL
    )";
    $pdo->exec($sql);
    echo "表 users 创建成功!";
} catch (PDOException $e) {
    die("创建表失败: " . $e->getMessage());
}
$pdo = null;
?>

6. 安全性和最佳实践

  1. 防止 SQL 注入
  • 创建数据库通常不涉及用户输入,但后续操作(如插入数据)应使用预处理语句。
  1. 字符集设置
  • 使用 utf8mb4 确保支持中文等 Unicode 字符,避免乱码。
  1. 错误处理
  • mysqli: 检查 $mysqli->errormysqli_error()
  • PDO: 使用 try-catch 捕获 PDOException
  1. 权限管理
  • 使用最小权限用户(如非 root),仅授予 CREATE 和必要操作权限。
  • 示例 SQL:
    sql GRANT CREATE, SELECT, INSERT ON mydb.* TO 'user'@'localhost' IDENTIFIED BY 'password';
  1. 连接关闭
  • 操作完成后关闭连接(mysqli::close()$pdo = null),释放资源。

7. 注意事项

  1. 数据库名唯一性
  • 数据库名不能重复,建议使用 IF NOT EXISTS 避免错误。
  1. MySQL 版本
  • 确保 MySQL 支持 utf8mb4(MySQL 5.5.3+)。
  1. 环境配置
  • 确认 PHP 启用了 mysqlipdo_mysql 扩展。
  • 检查 MySQL 服务运行,主机、用户名、密码正确。
  1. 调试
  • 如果连接失败,检查 MySQL 日志或使用工具(如 phpMyAdmin)验证。
  • 常见错误:权限不足、主机名错误、端口未开放(默认 3306)。

8. 总结

PHP 通过 mysqliPDO 连接 MySQL 并创建数据库非常简单,只需执行 CREATE DATABASE 语句即可。mysqli 适合专注于 MySQL 的项目,PDO 更适合跨数据库或现代化开发。设置 utf8mb4 字符集、正确处理错误和关闭连接是关键。创建数据库后,可进一步创建表并执行 CRUD 操作。

如果需要更详细的示例(如创建复杂表结构)、调试帮助,或有其他问题,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注