老PHP开发都记得,早期版本里有个mysql_create_db()函数,一行代码就能建库。但从PHP 4.3开始这个函数就被标记为弃用了,PHP 7之后更是彻底移除。为啥?因为这个函数设计上有局限性,它只能操作MySQL,而且跟MySQL改进扩展的整体架构不太搭。
现在主流方案就两个:MySQLi 和 PDO。这两个扩展都支持创建数据库的操作,写法上略有不同。
核心知识点:CREATE DATABASE语句
无论用MySQLi还是PDO,底层实际执行的都是SQL里的CREATE DATABASE语句。这条语句的基本语法:
CREATE DATABASE [IF NOT EXISTS] 数据库名
IF NOT EXISTS是个好习惯——如果数据库已经存在,加上这个就不会报错。
方案一:MySQLi面向过程方式
这是代码号比较推荐的入门写法,直观好理解:
<?php
$host = 'localhost:3306';
$user = 'root';
$pass = '123456';
// 连接MySQL服务器(不指定数据库)
$conn = mysqli_connect($host, $user, $pass);
if(!$conn) {
die('连接失败:' . mysqli_connect_error());
}
echo '连接成功<br/>';
// 创建数据库
$dbname = 'codexuexi_db'; // 数据库名建议小写+下划线
$sql = "CREATE DATABASE IF NOT EXISTS $dbname";
if(mysqli_query($conn, $sql)) {
echo "数据库 $dbname 创建成功";
} else {
echo "创建失败:" . mysqli_error($conn);
}
mysqli_close($conn);
?>
个人经验分享:用面向过程写法时,记得把数据库名单独存变量,后面维护起来方便。我曾经接手过一个项目,建库语句直接写死在SQL里,找了半天才找到改哪里。
方案二:MySQLi面向对象方式
<?php
$host = 'localhost:3306';
$user = 'root';
$pass = '123456';
$mysqli = new mysqli($host, $user, $pass);
if($mysqli->connect_error) {
die('连接失败:' . $mysqli->connect_error);
}
$dbname = 'codexuexi_db2';
$sql = "CREATE DATABASE IF NOT EXISTS $dbname";
if($mysqli->query($sql)) {
echo "数据库 $dbname 创建成功";
} else {
echo "创建失败:" . $mysqli->error;
}
$mysqli->close();
?>
为什么推荐用面向对象?代码结构更清晰,而且链式操作写起来舒服。不过初期学习两个都试试,看哪个顺手。
方案三:PDO方式
PDO的创建逻辑稍微不一样——它不支持在连接字符串里不指定数据库的情况下直接执行CREATE DATABASE。需要先连上mysql系统库,然后用exec()方法执行:
<?php
$host = 'localhost:3306';
$user = 'root';
$pass = '123456';
try {
// PDO连接必须指定一个默认数据库,这里用mysql系统库
$pdo = new PDO("mysql:host=$host;dbname=mysql", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbname = 'codexuexi_db3';
$sql = "CREATE DATABASE IF NOT EXISTS $dbname";
$pdo->exec($sql);
echo "数据库 $dbname 创建成功";
} catch(PDOException $e) {
echo "创建失败:" . $e->getMessage();
}
?>
注意点:PDO这里的dbname=mysql是指定连接到一个已存在的数据库(系统自带的mysql库),不是我们要创建的那个。这个细节很多新手会踩坑。
本节课程知识要点
| 要点 | 说明 |
|---|---|
| 执行建库需要什么权限 | 连接用户必须有CREATE DATABASE权限 |
| 数据库名命名规则 | 允许字母、数字、下划线,不能用数字开头 |
| 字符集设置 | 建库时可以指定:CREATE DATABASE dbname CHARACTER SET utf8mb4 |
| 异常处理 | 实际项目中建议用try-catch配合事务 |
补充建议
看到网上很多教程上来就推荐PDO,说得好像PDO什么都好。我个人的看法是:如果项目确定只用MySQL,MySQLi够用,代码执行效率还比PDO快一点点。PDO的优势在于数据库迁移——从MySQL换到PostgreSQL或SQLite时,改连接字符串和少数语法就行。
另外提醒一个容易忽略的问题:创建完数据库后,很好单独给这个库建一个用户并授权,别用root账号在业务代码里操作。这是安全底线。