我正在尝试使用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;
}