yii2数据库配置必须写在config/db.php或config/web.php/config/main.php的components数组内,如'db' => ['class' => 'yii\db\connection', 'dsn' => 'mysql:host=localhost;dbname=test;charset=utf8mb4', 'username' => 'root', 'password' => getenv('db_password') ?: 'root'],否则yii::$app->db报错“unknown component id: db”。

数据库配置写在哪儿
Yii2 的数据库连接信息必须写在 config/db.php(或合并进 config/web.php / config/main.php 中的 components 部分),不能只丢在控制器里临时 new 一个 Connection —— 那样既无法被 ActiveRecord 复用,也绕过了 Yii 的连接池和日志追踪机制。
常见错误是把 'dsn' => 'mysql:host=localhost;dbname=test' 直接塞进 web.php 顶层,结果 Yii::$app->db 报错:Unknown Component ID: db。原因:没放进 components 数组里。
-
db必须是components下的一个键,值为数组,且含class、dsn、username、password - 开发环境建议用
charset显式指定utf8mb4,否则中文存入可能截断或报错Incorrect string value - 如果用 Docker 或远程 DB,
host别写localhost(它会走 socket),改用服务名如mysql或真实 IP
DSN 字符串怎么拼才不翻车
dsn 是最常出问题的地方:少个分号、空格多一个、编码参数位置错,都会导致 CDbException 或 PDOException 报错 could not find driver(其实是 DSN 解析失败,不是没装 pdo_mysql)。
正确格式严格按顺序:驱动名 + 冒号 + 连接参数,中间不能换行、不能有注释、不能用变量拼接(配置文件里不执行 PHP 表达式)。
- MySQL 正确示例:
'dsn' => 'mysql:host=localhost;dbname=myapp;charset=utf8mb4' - PostgreSQL 示例:
'dsn' => 'pgsql:host=localhost;dbname=myapp;user=postgres;password=123'(注意 pgsql 不支持在 DSN 里写charset,得靠initSQLs) - 别在 DSN 里写
port=3306—— 除非真换了端口;默认端口冗余还易引发解析歧义 - SQLite 只需:
'dsn' => 'sqlite:@app/data/db.sqlite',路径用@app别名,别写相对路径
密码和敏感信息别硬编码
把数据库密码直接写在 db.php 里,上线后容易泄露,CI/CD 流水线也会报安全警告。Yii2 原生支持从环境变量读取,但得配合 getenv() + 默认回退逻辑。
错误做法:'password' => 'root123';正确做法是用三元判断兜底,避免本地开发时还要手动改环境变量。
- 推荐写法:
'password' => getenv('DB_PASSWORD') ?: 'root' - Linux/macOS 下用
export DB_PASSWORD=xxx;Windows CMD 用set DB_PASSWORD=xxx;Docker 则在environment:里配 - 别依赖
.env文件自动加载 —— Yii2 默认不读它,要额外装vlucas/phpdotenv并手动初始化,增加启动开销 - 如果用了
yii migrate,确保 CLI 环境变量和 Web 环境一致,否则迁移成功但网页打不开
连接不上时先查这三件事
报 SQLSTATE[HY000] [2002] Connection refused 或 SQLSTATE[HY000] [1045] Access denied 时,别急着重启 Apache 或重装扩展 —— 90% 是配置层问题。
- 用
php -r "var_dump(PDO::getAvailableDrivers());"确认mysql或pgsql在列表里(不是mysqli) - 进容器或服务器终端,执行
mysql -h localhost -u youruser -p,验证账号密码和网络连通性(注意:CLI 的localhost和 PHP 的localhost解析行为可能不同) - 打开
config/web.php,确认'db' => [...]确实在'components'键下,且没有被条件判断意外跳过(比如YII_ENV_DEV ? [...] : []写反了)
复杂点在于:Yii2 的 db 组件初始化是懒加载的,错误可能直到第一次查库才暴露 —— 所以光跑 php yii 看不出配置是否生效。










