dbname参数必须显式写在dsn中或配置数组里,不可省略或依赖运行时补全;thinkphp 8中每个connection必须含'database'键,mysqli构造函数第四个参数即dbname,漏写会导致“no database selected”错误。

dbname 参数必须显式写在 DSN 字符串里,不能靠运行时 mysqli_select_db() 或框架配置层“补上”。
DSN 中必须包含 dbname,否则连接成功但不指向任何库
用 PDO 连 MySQL 时,dbname 是 DSN 的强制组成部分。只传 host、user、pass,不写 dbname=xxx,PDO 会连上 MySQL 服务,但当前数据库上下文为空——后续执行 SELECT * FROM users 会直接报错 SQLSTATE[HY000]: General error: 1046 No database selected。
正确写法示例:
mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4
错误写法(看似简洁,实则埋雷):
mysql:host=127.0.0.1;port=3306;charset=utf8mb4
ThinkPHP 8 配置中 database 键名不能省略
TP8 的 config/database.php 里,每个 connection 的数组必须带 'database' => 'test' 字段。它不会从 dbname 自动推导,也不会 fallback 到 default 库。
- 如果漏掉该键,Db::table('users')->select() 会抛出
Database not selected类似提示(实际错误信息取决于底层驱动) -
.env文件里对应字段是DB_DATABASE=test,但 TP8 不支持嵌套键(如DB_ORACLE_DATABASE),多库场景下必须硬编码在config/database.php中 - 键名大小写敏感:
'database'有效,'Database'或'DB_NAME'全无效
MySQLi 连接时 dbname 是构造函数第四个参数
MySQLi 面向对象方式中,dbname 是 new mysqli() 的第四个实参,不可省略:
$conn = new mysqli('127.0.0.1', 'root', 'pass', 'test', 3306);
若传 null 或空字符串,连接虽建立,但后续所有查询都需手动指定库名(如 SELECT * FROM test.users),极易遗漏或写错。
常见误操作:
- 只写前三个参数:
new mysqli($host, $user, $pass)→ 连接后必须立刻调用$conn->select_db('test') - 调用
select_db()失败却不检查返回值 → 看似没报错,实际仍在 default schema,查不到表 - 在长连接复用场景下,中间某次
select_db()失败,后续请求全跑错库
Oracle/PostgreSQL 等其他库的等价字段名不同
不是所有驱动都叫 dbname:
- Oracle OCI:DSN 中用
service_name或sid,例如oci:dbname=//127.0.0.1:1521/ORCL,这里的ORCL就是 service name,等效于 MySQL 的dbname - PostgreSQL:DSN 中用
dbname,但常配合options='--cluster=mycluster'等额外参数,单纯写dbname=xxx足够 - SQLite:DSN 是文件路径,
sqlite:/path/to/db.sqlite,路径本身即“库名”
跨数据库切换时,别想当然沿用 MySQL 的键名逻辑——PDO DSN 解析器只认各自驱动约定的字段。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











