有没有办法只使用php将单个mysql表转储到文件中?
我无法访问命令行以使用有没有办法只使用php将单个mysql表转储到文件中?,php,mysql,Php,Mysql,我无法访问命令行以使用mysqldump。但我可以完全访问这些表,并且可以读取每个表中的所有数据。 问题是我需要将这些数据保存到服务器上的一个文件中,但唯一的方法是通过file\u put\u contents或类似的php函数,并使用某种标准的mysql转储格式来保存表结构,即完全创建字符串和数据类型,尤其是特定单元格是空字符串还是空字符串。我是这样发现的: 但使用此查询: "SELECT * INTO OUTFILE 'file.txt' FROM $tbl_name" 给出了以下错误:
mysqldump
。但我可以完全访问这些表,并且可以读取每个表中的所有数据。
问题是我需要将这些数据保存到服务器上的一个文件中,但唯一的方法是通过file\u put\u contents
或类似的php函数,并使用某种标准的mysql转储格式来保存表结构,即完全创建字符串和数据类型,尤其是特定单元格是空字符串还是空字符串。我是这样发现的:
但使用此查询:
"SELECT * INTO OUTFILE 'file.txt' FROM $tbl_name"
给出了以下错误:
Access denied for user '***'@'***' (using password: YES) [1045]
好的,但我可以访问该表中的所有数据,所以是否可以使用PHP函数迭代所有行并创建输出文件,在我的例子中,PHP函数具有写入服务器磁盘的权限?
但是,我必须重新设计轮子并重新创建*.sql转储格式,还是有办法将上面sql命令的输出重定向到php中的一个变量,然后逐行创建文件?您可以执行一个
SHOW create TABLE
来获取结构,然后执行一个SELECT*from
来获取数据。从那里,您应该能够将正确的输出写入文件或HTTP响应 也可以在远程机器上进行转储。因此,您可以在远程计算机上启动mysqldump,并直接将文件存储在那里。然后也不需要复制它们。下面是我能够为PHP“转储”脚本创建的内容
现在修改和测试。这将导出以下语法:
- 删除表(如果存在)
- 创建表
- ALTERTABLE添加外键
- 插入表格
<?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);
没有直接的方法,但是伪转储并不是那么难做到。你看到了吗?它是您上载的单个PHP文件,然后它的行为类似于phpMyAdmin或其他数据库前端。它可以进行某些类型的转储—不确定是否可以保存到服务器磁盘,但值得一看。或者某人可能有一个插件提供帮助。该错误意味着用户没有文件权限。谁控制用户权限?这是托管服务器还是您自己的?@DavidSoussan:hosted,我无法访问db引擎或仅限shell的php。首先要做的是让您的主机授予文件权限。我确实想知道这是否是一个托管服务器,您将在其中保存文件。根据我的经验,他们是不会允许的。您是说要将文件保存到托管的web服务器文件系统中吗?在mosr情况下,数据库和web将位于不同的服务器上。不要忘记外键。这需要找到这些和存储过程、触发器等的模式信息。。。不过,大多数人都不使用这些功能。Title说的是单表,所以我保持了简单。显然,这不会像
mysqldump
那样强大,但在大多数情况下它会起作用。使用file\u put\u contents($file,$out,APPEND\u file)可能更好如果您试图转储一个大表,则在每次迭代结束时(或缓冲几行,然后写出)在循环内部,而不是在循环外部。在循环外部执行此操作会将其存储在内存中,内存可能会受到限制,从而导致较大的转储失败并出现oom错误。另外,对于大转储,当尝试使用php重新导入时,会出现真正的问题。@SanuelJackson-当然,这将是一个很好的性能增强。
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');