laravel 使用 db 门面或 eloquent 即可,无需且不可用已废弃的 mysql_* 函数;db::select() 用于 select 等返回结果集的查询,db::statement() 用于 insert/update 等无结果集操作;参数必须绑定防注入,表名等需白名单校验;连接失败优先检查 .env 中 db_host、db_port、db_database 配置及缓存清理。

直接用 Laravel 的 DB 门面或 Eloquent 就行,不需要手动引入原生 MySQL 扩展或写 mysql_connect() —— 那套函数早在 PHP 7.0 就被移除了,Laravel 5.5+ 更是只支持 mysqli 和 PDO 底层驱动。
为什么不能用 mysql_* 函数
Laravel 底层完全不兼容已废弃的 mysql_connect()、mysql_query() 等函数。它们在 PHP 7.0+ 中已被彻底删除,强行调用会报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
- PHP 官方自 2013 年起标记为 deprecated,2017 年正式移除
- Laravel 的
DB门面默认走PDO,配置在config/database.php的'driver' => 'mysql'实际对应PDO_mysql - 即使你本地 PHP 还是 5.6,Laravel 6+ 也已放弃对旧 mysql 扩展的支持
DB::select() 和 DB::statement() 的区别
DB::select() 用于带结果集的查询(如 SELECT),返回数组;DB::statement() 用于无结果集操作(如 INSERT、UPDATE、DROP),返回布尔值。
-
DB::select('SELECT * FROM users WHERE id = ?', [1])→ 返回Collection或数组 -
DB::statement('UPDATE users SET name = ? WHERE id = ?', ['John', 1])→ 成功返回true,失败抛异常 - 别用
DB::select()执行INSERT,它会报SQLSTATE[HY000]: General error,因为没结果集可 fetch
如何安全传参避免 SQL 注入
Laravel 的 DB 和 Eloquent 默认使用预处理,但前提是:所有动态值必须通过参数绑定传入,不能拼接字符串。
JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
立即学习“PHP免费学习笔记(深入)”;
DB::select("SELECT * FROM users WHERE name = ?", [$name]); // ✅ 安全
DB::select("SELECT * FROM users WHERE name = '$name'"); // ❌ 危险,直接拼接- 占位符统一用
?(位置绑定)或:key(命名绑定),不要混用 - 表名、字段名、排序方向(
ASC/DESC)不能参数化,需白名单校验后拼接 - 批量插入用
DB::table()->insert(),它内部自动展开为单条预处理语句,比手写INSERT ... VALUES (?,?), (?,?)更可靠
连接不上 MySQL 时先查这三个配置项
常见报错 SQLSTATE[HY000] [2002] Connection refused 或 Access denied for user,90% 出在 .env 配置未生效或填错:
-
DB_HOST=127.0.0.1(不是localhost,后者在某些 Linux 环境下会走 socket 导致权限差异) -
DB_PORT=3306(Docker 或 MAMP 用户常忽略端口是否被映射) -
DB_DATABASE必须是已创建的库名,Laravel 不会自动建库
改完 .env 记得运行 php artisan config:clear,否则缓存可能仍读旧配置。









