PHP 自动执行 SQL 文件并导入数据库
在 Web 开发中,经常需要编写脚本将预设的 SQL 数据批量导入 MySQL 数据库。本教程展示如何使用 PHP 结合 mysqli 扩展,安全地读取 .sql 文件并按顺序执行建表或插入数据的操作,同时支持自动创建目标数据库。
准备工作
确保你的 PHP 环境已启用 mysqli 扩展。你需要一个待执行的 SQL 文件(例如 test.sql)和数据库的连接信息(主机名、用户名和密码)。注意:若 SQL 文件中包含创建新库的语句,需手动删除以避免路径冲突;若需程序自动创建,见下文步骤。
第1步:建立数据库连接
首先实例化 mysqli 对象以连接到 MySQL 服务器。DB_HOST、DB_USER 和 DB_PASS 请替换为实际的环境变量或字符串配置。
$dbHost = 'localhost'; // 或 DB_HOST
$dbUser = 'root'; // 或 DB_USER
$dbPass = ''; // 或 DB_PASS
$_mysqli = new mysqli($dbHost, $dbUser, $dbPass);
if (mysqli_connect_errno()) {
exit('连接数据库出错: ' . mysqli_connect_error());
}第2步:读取并解析 SQL 文件内容
使用 file_get_contents 将 SQL 文件的全部内容读入内存,然后通过 explode 按分号 ; 拆分为单独的语句数组。这允许我们遍历每一条 SQL 命令。
// 读取文件内容
$sqlContent = file_get_contents('test.sql');
// 按分号拆分,注意 trim 去除空白符
$statements = array_filter(array_map('trim', explode(';', $sqlContent)));第3步:逐条执行 SQL 语句
遍历拆分后的语句数组,依次调用 query() 方法执行。建议在循环中添加简单的错误检查,以便在遇到语法错误或权限问题时能及时捕获。
foreach ($statements as $statement) {
if (empty($statement)) {
continue;
}
echo "执行: $statement\n";
if (!$_mysqli->query($statement)) {
echo "执行失败: " . $_mysqli->error . "\n";
break;
}
}第4步:自动创建并使用目标数据库(可选)
如果 .sql 文件中仅包含数据操作而缺少 USE database_name; 或库创建语句,你可能需要手动指定数据库。以下代码演示了在循环外先创建数据库(若不存在),然后切换到该数据库的流程。
// 定义目标数据库名称
$databaseName = 'my_target_db';
// 1. 创建数据库(如果不存在)并设置字符集
$_mysqli->query("CREATE DATABASE IF NOT EXISTS `{$databaseName}` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
// 2. 选择并使用该数据库
$_mysqli->select_db($databaseName);
// 现在后续的所有 query() 都会在这库中执行
// ... 在此处重新加载并执行 SQL 文件中的语句 ...完成判断与清理
当所有语句执行完毕且无报错时,表示导入成功。务必关闭数据库连接以释放资源。
$_mysqli->close();
$_mysqli = null;
echo "SQL 导入完成。";注意事项与排错
- 分隔符问题:如果你的 SQL 文件中使用了存储过程或触发器,其中可能包含非分号的自定义分隔符(如 $$),直接按分号拆分会导致语句截断。此类情况建议使用专门的分隔符解析逻辑或专用导入工具。
- 超时限制:大批量数据导入可能会超出 PHP 的执行时间限制(
max_execution_time)。请在命令行环境中运行此脚本,或适当调大 PHP 配置中的超时参数。 - 安全性:不要在生产环境中暴露数据库密码到脚本源码中,建议使用环境变量或配置文件管理敏感信息。
以上就是使用 PHP 执行 SQL 文件并将数据导入到数据库的详细内容,更多关于 PHP 数据库操作技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









