簡體   English   中英

如何通過MYSQL / PHP將.sql.gz文件導入我的數據庫? (不是命令行)

[英]How to import .sql.gz file into my database via MYSQL/PHP? (not command line)

我有一個備份文件(.sql.gz),我想以編程方式將其導入我在localhost上的空數據庫,就像phpmyadmin一樣,在瀏覽器中使用php / mysql / javascript,而不是通過命令行。 由於它是我的本地主機,安全性並不是真正的問題,我只想自動執行我必須在開發時定期執行的任務。

這里有很多問題,但它們都涉及命令行解決方案。

編輯:我已經安裝了xampp。 但整個過程很繁瑣,我必須首先刪除數據庫,然后重新創建它,然后導入我的數據。 我必須經常移動b / w以前的數據庫backus。 所以我想自動化這個過程。 我只是通過html表單輸入提供備份.sql.gz文件,它會自動執行以上所有操作。

我用gzfile打開它,在query-delimiter 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);

來自@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']訪問文件上載的臨時名稱。

我相信Sypex Dumper可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM