应使用mysqli或PDO连接MySQL并创建表,因mysql_*函数在PHP 7.0+已移除;需显式检查连接与查询结果,字符集推荐utf8mb4;PDO建议启用异常模式并设置DSN charset;注意MySQL 8.0认证插件兼容性及权限、字符集一致性问题。

PHP 连接 MySQL 并创建表,现在应该用 mysqli 或 PDO,mysql_* 函数早已被移除(PHP 7.0+ 完全不可用),硬写会直接报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
用 mysqli_connect() 建连 + mysqli_query() 建表
这是最直白的面向过程写法,适合快速验证或小脚本。注意:必须显式检查连接和查询是否成功,否则失败时页面可能空白。
-
mysqli_connect()第四个参数(数据库名)可为空,建表前不指定库也行 - 建表 SQL 必须用
USE database_name或在表名前加database_name.table_name - 字符集建议显式设为
utf8mb4,避免 emoji 和生僻字乱码
用 PDO 连接并启用异常模式
PDO 更现代、支持预处理、跨数据库迁移成本低。关键点是开启 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则 PDO::exec() 失败只会返回 false,不抛异常,容易漏错。
- DSN 中的
charset=utf8mb4是必需参数,只靠SET NAMES不保险 -
PDO::ATTR_DEFAULT_FETCH_MODE可选,但设成PDO::FETCH_ASSOC能避免数字索引混淆 - 建表语句里不要用反引号包裹关键词(如
`order`),优先改字段名,比逃逸更可靠
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
$sql = "CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
price DECIMAL(10,2) DEFAULT 0.00
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$pdo->exec($sql);
echo "products 表已就绪";
} catch (PDOException $e) {
echo "操作失败: " . $e->getMessage();
}
?>
常见错误与绕不开的细节
不是语法对就能跑通。本地开发环境(如 XAMPP/MAMP)默认 root 无密码,但 Docker 或云服务器上往往有强密码策略;MySQL 8.0+ 默认认证插件是 caching_sha2_password,老版 PHP 可能连不上。
立即学习“PHP免费学习笔记(深入)”;
- 报错
Authentication plugin 'caching_sha2_password' cannot be loaded:进 MySQL 执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 报错
Access denied for user:确认用户有CREATE权限,不是只给了SELECT - 执行多次建表脚本却提示
Table 'xxx' already exists:SQL 里没加IF NOT EXISTS,或者用了DROP TABLE但没做存在性判断 - 插入中文变问号:连接层、表结构、客户端三处字符集必须都是
utf8mb4,缺一不可
真正卡住人的往往不是“怎么写”,而是“为什么连不上”“为什么建了却查不到数据”——先确认 mysqli_connect_error() 或 PDOException 报的具体内容,再查权限、字符集、认证方式,比盲目改代码快得多。











