mysql Laravel如何操作mysql_mysql PHP框架类库

5次阅读

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

mysql Laravel如何操作mysql_mysql PHP框架类库

直接用 Laravel 的 DB 门面或 Eloquent 就行,不需要手动引入原生 MySQL 扩展或写 mysql_connect() —— 那套函数早在 php 7.0 就被移除了,Laravel 5.5+ 更是只支持 mysqlipdo 底层驱动。

为什么不能用 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() 用于无结果集操作(如 INSERTUPDATEDROP),返回布尔值。

  • 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 默认使用预处理,但前提是:所有动态值必须通过参数绑定传入,不能拼接字符串

立即学习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 refusedaccess denied for user,90% 出在 .env 配置未生效或填错:

  • DB_HOST=127.0.0.1(不是 localhost,后者在某些 linux 环境下会走 socket 导致权限差异)
  • DB_PORT=3306docker 或 MAMP 用户常忽略端口是否被映射)
  • DB_DATABASE 必须是已创建的库名,Laravel 不会自动建库

改完 .env 记得运行 php artisan config:clear,否则缓存可能仍读旧配置。

text=ZqhQzanResources