我正在尝试使用 MySQL 和 XML 编写导出/导入工具。数据通常由一个注册用户导出并由另一用户导入回数据库。
数据位于不同的表中,并与导出查询的 SQL“where”子句中指定的 id 相关联。
我可以通过运行带有连接的 SQL 查询将数据导出到单个文件中。
允许其他用户从导出的文件中导入数据的“最简洁”方式是什么?
我的问题是文件中的记录包含仅在某些表中使用的字段,当引用插入数据的表中未使用的字段时,会导致 SQL 查询失败。
我可以通过编写指定要插入的字段的查询来解决这个问题,但是如果在应用程序开发过程中忽略对导入查询的这些维护更新,这将导致大量维护开销和漏洞。
这是一个“最佳实践”问题。
更新
我最终为克服与链接表相关的问题以及自动递增主 ID 的提取和插入所做的工作是完整地导出行。换句话说,包括主 ID 在内的所有字段都已添加到导出文件中。然后在重新导入数据时,为了正确添加链接表中的行,我的代码保存了不同表中的所有旧 id,然后插入没有这些旧 id 的行。这涉及使用旧 ID 正确链接来自不同表的数据。新 id 由自动增量生成。这有点涉及,但至少没有处理非 id 字段。当在应用程序开发过程中添加新的数据字段时,这将使代码更加健壮和抗破坏。
我的代码如下所示。请注意 $file 将使用对话框创建。
if($option=='Export test'){
// ----
// Exports an xml file. This includes all primary ids
// ----
$file='export.xml';
$xml='<?xml version="1.0" encoding="ISO-8859-1" ?>'."\n";
$xml.="<".$database_connect.">\n";
file_put_contents($file,$xml);
$rows=returnTestQuestionsPlus($template_id);
$table='test_questions';
exportRowsToXMLFile($table,$rows,$file);
foreach($rows as $row){
$question_id=$row['question_id'];
$rows2=returnTestAnswersPlus($question_id);
$table='test_answers';
exportRowsToXMLFile($table,$rows2,$file);
}
$xml="</".$database_connect.">";
file_put_contents($file,$xml,FILE_APPEND);
header("Location: select_template.php?info_message=The $object6 has been exported to $file.");
exit;
}
if($option=='Import test'){
// ----
// Gets xml file content. This includes all primary ids.
// ----
$file='export.xml';
$xml=file_get_contents($file);
$xml=str_ireplace(chr(10),'',$xml);
$xml=str_ireplace(chr(13),'',$xml);
$xml=new SimpleXMLElement($xml);
$tables = json_decode(json_encode((array)$xml), TRUE);
// ----
// Removes primary ids and then inserts data into the database.
// ----
foreach($tables as $table=>$rows){
foreach($rows as $row){
if($table=='test_questions'){
$old_question_ids[]=$row['question_id'];
}
}
}
foreach($tables as $table=>$rows){
foreach($rows as $row){
if($table=='test_questions'){
$question_id=$row['question_id'];
unset($row['question_id']);
unset($row['sort_id']);
unset($row['template_id']);
$sql="select count(*) as number from test_questions";
$row2=returnRow(__LINE__,$sql);
extract($row2);
$sort_id=$number+1;
$row['sort_id']=$sort_id;
$row['template_id']=$template_id;
$results=insertRow2('test_questions',$row);
extract($results);
$new_question_ids[]=$id;
}
}
}
$test_answers_rows=array();
foreach($tables as $table=>$rows){
foreach($rows as $row){
if($table=='test_answers'){
$question_id=$row['question_id'];
foreach($old_question_ids as $key=>$old_question_id){
if($question_id==$old_question_id)$new_question_id=$new_question_ids[$key];
}
unset($row['question_id']);
unset($row['answer_id']);
$row['question_id']=$new_question_id;
$test_answers_rows[]=$row;
}
}
}
insertMultipleRowsPDP('test_answers',$test_answers_rows);
header("Location: select_template.php?info_message=The $object6 has been imported from $file.");
exit;
}