PHP创建数据库表代码如何正确写且避免常见错误?
- 虚拟主机
- 2025-12-16
- 5
在PHP中创建数据库表是Web开发中的常见任务,通常通过MySQLi或PDO扩展来实现,以下是详细的代码示例和步骤说明,涵盖环境准备、连接数据库、创建表结构以及错误处理等内容。
环境准备
在开始之前,确保你的开发环境满足以下条件:
- 已安装PHP(建议版本7.0或更高)。
- 已安装MySQL或MariaDB数据库服务器。
- 启用了PHP的MySQLi或PDO扩展(默认情况下大多数PHP环境已启用)。
连接数据库
创建表前需要先连接到MySQL数据库,以下是使用MySQLi和PDO的连接代码示例:
MySQLi连接
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test_db"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn>connect_error) { die("连接失败: " . $conn>connect_error); } echo "连接成功"; ?>
PDO连接
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test_db"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "连接成功"; } catch(PDOException $e) { echo "连接失败: " . $e>getMessage(); } ?>
创建数据库表
连接成功后,可以使用CREATE TABLE语句创建表,以下是一个完整的示例,包含字段定义、数据类型和约束:

MySQLi创建表
<?php $sql = "CREATE TABLE users ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL, email VARCHAR(50) NOT NULL, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; if ($conn>query($sql) === TRUE) { echo "表 users 创建成功"; } else { echo "创建表错误: " . $conn>error; } $conn>close(); ?>
PDO创建表
<?php try { $sql = "CREATE TABLE users ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL, email VARCHAR(50) NOT NULL, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; $conn>exec($sql); echo "表 users 创建成功"; } catch(PDOException $e) { echo "创建表错误: " . $e>getMessage(); } $conn = null; ?>
表结构说明
以下是users表的结构详细说明:

| 字段名 | 数据类型 | 约束说明 |
|---|---|---|
| id | INT(6) UNSIGNED | 自增主键,非空 |
| username | VARCHAR(30) | 非空,最大长度30字符 |
| VARCHAR(50) | 非空,最大长度50字符 | |
| reg_date | TIMESTAMP | 默认值为当前时间 |
高级表创建选项
在实际开发中,可能需要添加更多约束和选项,例如外键、索引或唯一约束,以下是扩展示例:
$sql = "CREATE TABLE orders ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id INT(6) UNSIGNED, product_name VARCHAR(100) NOT NULL, quantity INT(3) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), INDEX (product_name) )";
错误处理和最佳实践
- 错误处理:始终检查数据库操作是否成功,并捕获可能的异常。
- SQL载入防护:使用预处理语句(PDO或MySQLi)来防止SQL载入。
- 表命名规范:使用有意义的表名,例如复数形式(如users)。
- 字段选择:根据需求选择合适的数据类型和长度,避免过度使用VARCHAR(255)。
完整示例代码
以下是一个结合连接和创建表的完整示例(使用PDO):
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "test_db"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "CREATE TABLE IF NOT EXISTS users ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL, email VARCHAR(50) NOT NULL, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; $conn>exec($sql); echo "表 users 创建成功或已存在"; } catch(PDOException $e) { echo "错误: " . $e>getMessage(); } $conn = null; ?>
相关问答FAQs
问题1:如何检查表是否已存在?
解答:在CREATE TABLE语句中使用IF NOT EXISTS子句,CREATE TABLE IF NOT EXISTS users (...),这样可以避免重复创建表时引发的错误。
问题2:如何修改已存在的表结构?
解答:使用ALTER TABLE语句修改表结构,例如添加新字段:ALTER TABLE users ADD COLUMN phone VARCHAR(20),也可以使用DROP COLUMN删除字段或MODIFY COLUMN修改字段类型。
