ThinkPHP 5.1.3 不支持直接执行 SQL 文件,需手动读取并解析;查看用户应使用 Db::query("SELECT User, Host FROM mysql.user"),前提是账号有 mysql 库权限。

在 ThinkPHP 5.1.3 中,“执行 SQL 文件”本身不是框架原生支持的操作,也没有 executeSqlFile() 这类方法。所谓“执行 SQL 文件”,实际是指读取一个包含 SQL 语句的文本文件(如 users.sql),然后逐条或整体交给数据库执行。而“查看用户”,通常指查询 MySQL 系统库中的用户信息,例如 SELECT User, Host FROM mysql.user;。
直接查 MySQL 用户(推荐)
这是最常用、最可靠的方式,不依赖 SQL 文件:
- 使用
Db::query()执行系统查询(仅限 SELECT):
注意:必须确保当前数据库账号有访问 mysql 库的权限(如 SELECT ON mysql.user),否则会报错或无结果。
Db::query("SELECT User, Host, authentication_string FROM mysql.user WHERE User != ''");- 返回二维数组,可直接
dump()查看或遍历输出
若真需从 SQL 文件加载并执行(如初始化脚本)
TP5.1.3 不提供内置 SQL 文件执行器,需手动实现。关键点如下:
立即学习“PHP免费学习笔记(深入)”;
- 先用 PHP 读取文件:
$sqlContent = file_get_contents(ROOT_PATH . 'public/sql/init_users.sql'); - 按分号分割语句(需谨慎处理注释、引号内分号等,简单场景可用
preg_split("/;\s*\n/", trim($sqlContent))) - 对每条非空、非注释语句,判断类型后调用对应方法:
✅ SELECT 类 → 用 Db::query($stmt)
✅ INSERT/UPDATE/DELETE 类 → 用 Db::execute($stmt)
❌ CREATE USER、GRANT 等 DDL/DCL 语句 → Db::execute() 会静默失败,必须用原生 PDO:
$pdo = Db::connect()->getPdo(); $pdo->exec("CREATE USER 'test'@'%' IDENTIFIED BY '123';");
调试时确认是否真的执行了用户相关语句
执行后想验证效果,别只看返回值,应主动查:
- 执行完
CREATE USER后,立即Db::query("SELECT User, Host FROM mysql.user WHERE User = 'test'"); - 用
Db::getLastSql()确认最后执行的确实是查询语句(注意:必须在query()之后立刻调用) - 开启调试日志(
app_debug=true且log.level = ['sql'])可全程追踪所有发往数据库的指令
安全提醒
操作 mysql.user 属于高危行为:
- 禁止在生产环境直接执行含
DROP USER或GRANT ALL的 SQL 文件 - SQL 文件中的用户名、主机名不能来自用户输入,必须白名单校验(如
in_array($host, ['localhost', '127.0.0.1'])) - 避免使用
root账号连接应用,应创建专用低权限账号用于日常操作



















