3

我有一个备份文件(.sql.gz),我想以编程方式将它导入到本地主机上的空数据库,就像 phpmyadmin 一样,在带有 php/mysql/javascript 的浏览器中,而不是通过命令行。由于它是我的本地主机,因此安全性并不是一个真正的问题,我只想自动化我在开发时必须定期执行的任务。

这里有很多问题,但它们都涉及命令行解决方案。

编辑:我已经安装了 xampp。但是整个过程很繁琐,我必须先删除数据库,然后重新创建它,然后再导入我的数据。我必须经常移动以前的数据库备份。所以我想自动化这个过程。我只是通过 html 表单输入提供备份的 .sql.gz 文件,它会自动完成上述所有操作。

4

3 回答 3

1

@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 的文件的名称在哪里。

另请参阅我过去的一些答案:


回复您的评论:

请参阅http://www.php.net/manual/en/features.file-upload.post-method.php
您可以使用$_FILES['userfile']['tmp_name'].

于 2013-04-16T15:56:10.200 回答
1

我会用它打开它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);
于 2013-04-16T15:32:09.107 回答
0

我相信Sypex Dumper可以做到。

于 2013-04-16T15:26:36.090 回答