




能,但不推荐——PHP 无内置建库函数,需通过 mysqli 或 PDO 执行 CREATE DATABASE SQL 语句;存在权限、SQL 注入、重复创建、错误处理等风险,生产环境应由 DBA 或 CI/CD 初始化。
CREATE DATABASE 吗?能,但不推荐直接在函数里写——不是语法限制,而是权限、上下文和错误处理的现实问题。PHP 本身没有“建库函数”,所有数据库操作都依赖扩展(如 mysqli 或 PDO),而 CREATE DATABASE 是 SQL 语句,必须通过连接对象执行。
mysqli 函数内建库的典型写法与坑点常见错误是把连接逻辑和建库逻辑混在同一个函数里,导致每次调用都新建连接、重复鉴权、忽略失败原因:
mysqli_connect() 返回 false 时没检查,后续 mysqli_query() 直接报错errno=1007 错误正确做法是分离连接与操作,且加基础防护:
function createDatabaseIfNotExists($host, $user, $pass, $dbname) {
$conn = mysqli_connect($host, $user, $pass);
if (!$conn) {
throw new Exception('连接失败: ' . mysqli_connect_error());
}
// 转义库名(仅允许字母数字下划线)
$safeName = preg_replace('/[^a-zA-Z0-9_]/', '', $dbname);
if (empty($safeName)) {
throw new Exception('非法数据库名');
}
$sql = "CREATE DATABASE IF NOT EXISTS `$safeName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (!mysqli_query($conn, $sql)) {
throw new Exception('建库失败: ' . mysqli_error($conn));
}
mysqli_close($conn);
}
PDO 方式更安全但要注意 DSN 特性PDO 不支持在 DSN 中指定数据库名来建库(dbname=xxx 是用于连接已有库),所以仍需先连空库(MySQL 默认用 mysql:host=localhost)

CREATE DATABASE。关键差异在于异常控制和字符集显式声明:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则 exec() 失败静默返回PDO 对库名不自动转义,仍需手动清洗,不能依赖 quote()(它只对字符串值有效,不适用于标识符)new PDO() 并指定 dbname,不能复用原连接真正上线的系统极少在运行时建库——部署由 DBA 或 CI/CD 流水线统一初始化,应用层只负责连和用。函数内建库通常只出现在以下场景:
phpunit 或 behat)entrypoint.sh 而非 PHP)最容易被忽略的是权限粒度:MySQL 用户必须有 CREATE 权限,但不应有 DROP 或 GRANT;很多开发者图省事给 ALL PRIVILEGES,埋下横向越权隐患。