我有一个备份文件(.sql.gz),我想把它导入到我的空数据库在本地主机编程像phpmyadmin如何做,在浏览器内php/mysql/javascript,而不是通过命令行。因为它是我的本地主机,所以安全性不是真正的问题,我只是想在开发时自动执行我必须定期执行的任务。
这里有一堆问题,但它们都与命令行解决方案有关。
编辑:我已经有一个示例安装。但是整个过程很繁琐,我必须先删除数据库,然后重新创建它,然后导入我的数据。我必须经常移动b/w以前的数据库。所以我想让这个过程自动化。我只是通过html表单输入输入备份。sql.gz文件,它会自动完成以上所有工作。
@MarcB的评论是正确的。使用PHP调用一个shell进程来加载SQL脚本。
编写PHP脚本来执行备份脚本是浪费时间。你基本上必须在PHP中实现mysql客户端。
更好的解决方案是这样的:
shell_exec("gunzip -c $file_sql_gz | mysql --defaults-file=$my_cnf $database_name");
其中$my_cnf
是类似my.cnf的文件的名称,该文件包含要连接的主机、用户和密码。
参见我过去的一些回答:
- 从PHP中加载.sql文件
- 正在运行MySQL *。PHP中的sql文件
你的评论:
参考http://www.php.net/manual/en/features.file-upload.post-method.php
您可以使用$_FILES['userfile']['tmp_name']
访问文件上传的临时名称。
我会用gzfile
打开它,在查询分隔符上分隔它并将其放入mysqli::query
$file = implode('', gzfile($sqlFile)); // there doesn't exist a gz* function which reads it completely into a string?
$query = $substring_delimiter = "";
$last_was_backslash = false;
$outside_begin_end = true;
$delimiter = ';';
for ($i = 0; $i < strlen($file); $i++) {
if ($i > 3 && !strcasecmp(substr($file, $i - 4, 5), "BEGIN") && !$substring_delimiter)
$outside_begin_end = false;
if (!$outside_begin_end && !strcasecmp(substr($file, $i - 2, 3), "END") && !$substring_delimiter)
$outside_begin_end = true;
if ($i > 7 && !strcasecmp(substr($file, $i - 8, 9), "DELIMITER") && trim($query) == '') {
$delimiter = '';
do {
$delimiter .= $file[$i];
} while (++$i < strlen($file) && $file[$i] != PHP_EOL)
$delimiter = trim($delimiter);
}
if ($file[$i] == '''' || $file[$i] == '"')
if ($substring_delimiter) {
if ($substring_delimiter == $file[$i] && !$last_was_backslash)
$substring_delimiter = "";
} else {
$substring_delimiter = $file[$i];
}
if ($outside_begin_end && !$substring_delimiter && !strcasecmp($delimiter, substr($file, $i))) {
$sql->query($query); // where $sql is a mysqli instance
$query = "";
} else {
$query .= $file[$i];
}
if ($file[$i] == '''')
$last_was_backslash = !$last_was_backslash;
else
$last_was_backslash = false;
}
if (trim($query) != "")
$sql->query($query);
我相信Sypex Dumper能做到。