如何将xml数据复制到2个不同的表中的mysql

时间:2018-03-29 09:53:00

标签: php mysql xml pdo

我有xml值类别和子类别,我想将其插入数据库中。这个代码每天都会在服务器检查xml文件上工作,如果有一些更改,如果它有更新mysql数据库。

是可能的我想让2个表相互连接,例如我有几个子类别和一个类别,我想制作一个带有类别的表,第二个表带有子类别和第一个表的id数

enter image description here

<?php

// URL is not real this is for example

$url = 'http://xml.com/category'; 
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);

$data = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($data);
$con = new PDO("mysql:host=localhost;dbname=main_data;charset=utf8", 'root', '');
foreach ($xml -> m as $row){
    $cat = $row->category;
    $subCat = $row->sub_category;
    $sql = $con->prepare("INSERT INTO cat (category, sub_category) VALUES (:cat, :subCat)");
    $sql->bindValue('cat', $cat);
    $sql->bindValue('subCat', $subCat);
    $sql->execute();
}

xml示例:

<?xml version="1.0" encoding="utf-8"?>
<category>
    <m>
        <category>Cat 1</category>
        <sub_category>SubCat 1</sub_category>
    </m>

    <m>
        <category>Cat 1</category>
        <sub_category>SubCat 2</sub_category>
    </m>
    <m>
        <category>Cat 2</category>
        <sub_category>SubCat 3</sub_category>
    </m>
</category>

2 个答案:

答案 0 :(得分:1)

所以首先在子类别表中插入子类别值。只是查询:

INSERT INTO subcat (sub_category) VALUES (:subCat)

这假设subcat表是使用idsubcat定义的,它是一个自动增量整数,以确保每个sub_category的唯一ID号。

如果INSERT完成正常,则插入类别表。再次只是查询:

INSERT INTO cat (category, sub_category) 
VALUES (:cat, 
        (SELECT idsubcat FROM subcat WHERE sub_category = :subCat)
       )
  • 因此,第二个插入链接您刚刚创建的子类别。
  • 此处的首选解决方案是设置交易。两个查询都运行,要么都失败(并且是回滚)。这可以防止完整性问题
  • 您的cat表还应将sub_category定义为subcat表的外键,以确保只插入有效值。

答案 1 :(得分:1)

考虑使用PDO&#39; lastInsertId,假设第一个表中的ID是自动增量字段。

foreach ($xml -> m as $row){
    $cat = $row->category;
    $subCat = $row->sub_category;

    // TABLE 1 INSERT
    $sql = $con->prepare("INSERT INTO table1 (category) VALUES (:cat)");
    $sql->bindValue('cat', $cat);
    $sql->execute();

    $catID = $con->lastInsertId();

    // TABLE 2 INSERT
    $sql = $con->prepare("INSERT INTO table2 (category, sub_category) VALUES (:cat_id, :subCat)");
    $sql->bindValue('cat_id', $catID);
    $sql->bindValue('subCat', $subCat);
    $sql->execute();

}