0

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

0 回答 0