gpt4 book ai didi

php - 有没有办法只使用 php 将单个 mysql 表转储到一个文件中?

转载 作者:行者123 更新时间:2023-11-29 06:21:17 25 4
gpt4 key购买 nike

我无法访问命令行以使用 mysqldump。但是我可以完全访问这些表,并且可以从每个表中读取所有数据。问题是我需要将这些数据保存到服务器上的文件中,但我唯一能做到的方法是通过 file_put_contents 或类似的 php 函数,并使用某种标准的 mysql 转储格式来保留表结构,即完全创建字符串和数据类型,特别是特定单元格是否为空字符串或 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');

关于php - 有没有办法只使用 php 将单个 mysql 表转储到一个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com