检验数据库是否存在应优先用 SHOW DATABASES LIKE 'dbname' 查询并检查结果行数,其次用 mysqli_select_db() 尝试选中;二者均需在连接成功后调用,并注意权限、特殊字符转义及错误处理。

用 mysqli_select_db() 检查数据库是否存在(连接后)
创建数据库本身不等于“已选中”,mysqli_connect() 只连上 MySQL 服务,不自动选库。真正检验库是否存在且可访问,得先连上再尝试选中它。mysqli_select_db() 返回 true 表示库存在且当前连接有权限访问;返回 false 则大概率是库不存在、拼写错误或权限不足。
- 必须在
mysqli_connect()成功之后调用,否则会报Warning: mysqli_select_db(): Couldn't fetch mysqli - 注意:该函数只检查“能否选中”,不校验库是否为空或结构是否符合预期
- 如果库名含特殊字符(如短横线),需用反引号包裹:
mysqli_select_db($conn, `my-db`)
用 SHOW DATABASES LIKE 'xxx' 主动查询库名匹配
这是更直接的检验方式——绕过“选中”动作,直接查系统库 information_schema.schemata 或用 SHOW DATABASES 命令过滤。适合在创建前做预判,也避免因权限限制导致 mysqli_select_db() 失败而误判。
- 推荐写法:
$result = mysqli_query($conn, "SHOW DATABASES LIKE 'mydb'");,然后用mysqli_num_rows($result) > 0判断 - 注意通配符:
LIKE中下划线_是单字符通配,如库名含字面意义的下划线,要用ESCAPE或改用=精确匹配 - 该语句对用户权限较敏感:普通用户可能看不到其他用户的库,但一定能查到自己有权限的库
创建时捕获 mysqli_error() 判断是否成功
CREATE DATABASE 本身是 DDL 语句,执行失败不会抛异常,但会留下错误信息。不能只靠 mysqli_query() 返回值为 true 就认定成功——比如库已存在时,部分 MySQL 配置下会静默忽略,或报错但未中断流程。
- 务必在
mysqli_query($conn, "CREATE DATABASE mydb")后立即检查:if (!mysqli_query($conn, $sql)) { echo mysqli_error($conn); } - 常见错误码:
1007(DB exists)、1044(权限拒绝)、1150(max db count reached) - 若想“存在则跳过”,可用
CREATE DATABASE IF NOT EXISTS mydb,但仍建议后续用前述任一方法二次确认
PDO 方式下用 getAvailableDrivers() 和异常模式验证
PDO 不提供直接查库存在的方法,但可通过开启异常模式让所有错误抛出 PDOException,再结合 SHOW DATABASES 查询实现可靠判断。这点容易被忽略:默认 PDO 是静默模式,query() 失败只返回 false,不提示原因。
立即学习“PHP免费学习笔记(深入)”;
- 创建 PDO 实例时必须设属性:
new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) - 查库存在性仍推荐:
$stmt = $pdo->query("SHOW DATABASES LIKE 'mydb'"); return $stmt->rowCount() > 0; - 不要依赖
PDO::exec("CREATE DATABASE...")的返回值——它返回影响行数(通常是 0),无法区分成功/失败
SHOW DATABASES 就看不到;又或者 PDO 没开异常模式,错误被吞掉还当成成功处理。这些细节不显眼,但线上环境一出问题就难定位。











