簡體   English   中英

有沒有一種方法可以僅使用php將單個mysql表轉儲到文件中?

[英]is there a way to dump single mysql table into a file using only php?

我無權使用mysqldump的命令行。 但是我可以完全訪問這些表,並且可以讀取每個表中的所有數據。 問題是我需要將這些數據保存到服務器上的文件中,但我只能通過file_put_contents或類似的php函數來做到這一點,並使用某種標准的mysql dump格式來保留表結構,即完整的創建字符串和數據類型,尤其是特定單元格是空字符串還是NULL。 我發現這種方式: https : //dev.mysql.com/doc/refman/5.1/en/select-into.html

但是使用此查詢:

"SELECT * INTO OUTFILE 'file.txt' FROM $tbl_name"

給出此錯誤:

Access denied for user '***'@'***' (using password: YES) [1045]

好的,但是我可以訪問該表中的所有數據,因此是否可以使用所有我有權寫入服務器磁盤的PHP函數來迭代所有行並創建輸出文件? 但是,然后我是否必須重新發明輪子並重新創建* .sql轉儲格式,或者是否有辦法將上述sql命令的輸出重定向到php中的變量,然后逐行創建文件?

這就是我能夠為PHP“轉儲”腳本創建的內容。

現在經過修訂和測試。 這將導出以下語法:

  • 如果存在則刪除表
  • 創建表
  • 更改表添加外鍵
  • 插入表

這是腳本:

<?php
$host = "localhost";
$username = "usr";
$password = "pwd";
$dbname = "my_db";
$table_name = ""; // If set, dumps only the specified table, otherwise dumps all
$file = "dump.sql";


$mysqli = new mysqli($host, $username, $password, $dbname);

// Get a list of tables
$sql = "SELECT TABLE_NAME AS `name` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{$dbname}'";
if ($table_name) {
    $sql .= " AND TABLE_NAME = '{$table_name}'";
}
$db_result = $mysqli->query($sql);

$out = "";

// For each table
while ($table = $db_result->fetch_assoc()) {
    // Build the table
    $sql = "SHOW CREATE TABLE `{$dbname}`.`{$table['name']}`";
    $table_result = $mysqli->query($sql);
    if ($create_table = $table_result->fetch_assoc()) {
        // Build the DROP TABLE DDL
        $out .= "DROP TABLE IF EXISTS `{$dbname}`.`{$table['name']}`;\n\n";

        // Build the CREATE TABLE DDL
        $out .= $create_table['Create Table'] . ";\n\n";

        // Build the FOREIGN KEY DDL for the table
        $sql = "SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '{$table['name']}' AND CONSTRAINT_SCHEMA = '{$dbname}' AND CONSTRAINT_NAME != 'PRIMARY'";
        $fk_result = $mysqli->query($sql);
        while ($fk = $fk_result->fetch_assoc()) {
            if ($fk['REFERENCED_COLUMN_NAME']) {
                $out .= "ALTER TABLE `{$dbname}`.`{$fk['TABLE_NAME']}` ADD CONSTRAINT `{$fk['CONSTRAINT_NAME']}` FOREIGN KEY (`{$fk['COLUMN_NAME']}`) REFERENCES `{$fk['REFERENCED_TABLE_NAME']}` (`{$fk['REFERENCED_COLUMN_NAME']}`);\n";
            }
        }
        $fk_result->close();
        $out .= "\n";

        // Build the INSERT DML for the table
        $sql = "SELECT * FROM `{$table['name']}`";
        $data_result = $mysqli->query($sql);
        while ($row = $data_result->fetch_assoc()) {
            $keys = array_keys($row);
            array_walk($keys, function(&$key) {
                $key = "`{$key}`";
            });
            $keys = implode(", ", $keys);
            $values = array_values($row);
            array_walk($values, function(&$val) {
                $val = "'{$val}'";
            });
            $values = implode(", ", $values);
            $out .= "INSERT INTO `{$dbname}`.`{$table['name']}` ({$keys}) VALUES ({$values});\n";
        }
        $data_result->close();
        $out .= "\n";
    }
    $table_result->close();

}

$db_result->close();
file_put_contents($file, $out);

這是我測試過的數據庫中單表轉儲的示例輸出:

DROP TABLE IF EXISTS `user_group`;

CREATE TABLE `user_group` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

ALTER TABLE `user_group` ADD CONSTRAINT `user_group_ibfk_1` FOREIGN KEY (`type_id`) REFERENCES `user_group_type` (`id`);

INSERT INTO `user_group` (`id`, `type_id`, `name`, `created`) VALUES ('1', '1', 'Administrator', '2011-10-01 22:58:29');
INSERT INTO `user_group` (`id`, `type_id`, `name`, `created`) VALUES ('2', '1', 'Moderator', '2011-10-01 22:58:29');
INSERT INTO `user_group` (`id`, `type_id`, `name`, `created`) VALUES ('3', '1', 'Registered User', '2011-10-01 22:58:29');

您可以執行SHOW CREATE TABLE來獲取結構,然后執行SELECT * FROM來獲取數據。 從那里,您應該能夠將正確的輸出寫入文件或HTTP響應。

也可以在遠程計算機上執行轉儲。 因此,您可以在遠程計算機上啟動mysqldump並將其直接存儲在該文件中。 然后也不必復制它們。

暫無
暫無

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

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