Leaf ORM 连不上 MySQL 是因 PHP 8.0+ 移除了 mysql 扩展,需改用 mysqli 驱动并设 'driver' => 'mysqli',host 用 127.0.0.1 而非 localhost,密码含特殊字符须 URL 编码。

Leaf ORM 连不上 MySQL 怎么办
Leaf ORM 默认用 mysql 扩展,但 PHP 8.0+ 已彻底移除该扩展,直接报错 Call to undefined function mysql_connect()。必须切到 mysqli 或 PDO 驱动。
- 确认 PHP 版本:运行
php -v,若 ≥ 8.0,跳过所有mysql_*相关配置 - Leaf 2.x 默认只支持
mysqli,需显式指定:'driver' => 'mysqli' -
host别写localhost——它会触发 Unix socket 连接,失败时无明确提示;改用127.0.0.1 - 密码含特殊字符(如
@、/)要 URL 编码,否则parse_url()解析失败
定义 Model 时字段名和数据库不一致怎么映射
Leaf 不自动处理下划线转驼峰,也不读取表字段注释。字段名严格按数据库列名来,否则 save() 会静默忽略未匹配字段。
- 表字段是
user_name,Model 属性就得写$user_name,不能写$userName - 想用驼峰命名?只能靠
protected $fillable = ['user_name']+ 手动赋值:$user->user_name = $input['userName'] -
protected $table = 'users'必须显式声明,Leaf 不会自动复数化类名
执行原生 SQL 查询返回空数组
DB::query() 返回的是结果集资源(mysqli_result),不是数组。直接 print_r() 看不到数据,容易误判为“没查到”。
- 查单条用
DB::fetch(),返回关联数组;查多条用DB::fetchAll() - 增删改用
DB::execute(),它返回影响行数,不是结果集 - 参数绑定只支持问号占位符:
DB::fetch("SELECT * FROM users WHERE id = ?", [$id]),不支持命名参数:id - 事务中出错不会自动回滚,必须手动调
DB::rollback()
批量插入性能差还报错 “Packet too large”
Leaf 的 insertAll() 是循环调用单条 INSERT,100 条就发 100 次请求。MySQL 默认 max_allowed_packet=4M,拼大 SQL 很容易超限。
立即学习“PHP免费学习笔记(深入)”;
- 避免
insertAll()处理超过 50 行的数据 - 真要批量插,改用原生语句:
DB::execute("INSERT INTO users (name, email) VALUES (?, ?), (?, ?)", [$a, $b, $c, $d]) - 注意:Leaf 不校验数组长度是否匹配占位符个数,参数少一个就全错,且错误信息是
mysqli_stmt::execute(): Number of variables doesn't match number of parameters in prepared statement
Leaf 的轻量级代价是细节全得自己兜底——连接方式、字段映射、结果解析、批量边界,没一处有“默认聪明”。用之前先跑通一条带参数的 SELECT 和一条 INSERT,比看文档快得多。











