XML в базу данных - цикл foreach для MySQL - PullRequest
0 голосов
/ 10 декабря 2018

Я получаю XML-файл с simpleXML и хочу сохранить эти значения в моей базе данных с помощью цикла foreach.Вот мой код:

<?php
$xml = simplexml_load_string('XML-FILE');

foreach ($xml->METADATA->DATA as $item) {
    foreach ($item->children() as $child) {
        $sel_stmt = "INSERT INTO dwh_xml (".$child->getName().") VALUES ('".$child."') ";
        directSQL($sel_stmt);
    }
}
?>

Мой XML-файл выглядит следующим образом:

<xml version="1.0" encoding="utf-8">
    <METADATA>
        <DATA>
            <FIELD_1>001</FIELD_1>
            <FIELD_2>ENTRY_2</FIELD_2>
            <FIELD_3>ENTRY_3</FIELD_3>
            <FIELD_4>ENTRY_4</FIELD_4>
            <FIELD_5>ENTRY_5</FIELD_5>
            <FIELD_6>000003</FIELD_6>
            <FIELD_7>ENTRY_7</FIELD_7>
            <FIELD_8>ENTRY_8</FIELD_8>
            <FIELD_9>ENTRY_9</FIELD_9>
            <FIELD_10>ENTRY_10</FIELD_10>
            <FIELD_11>ENTRY_11</FIELD_11>
            <FIELD_12>ENTRY_12</FIELD_12>
            <FIELD_13>ENTRY_13</FIELD_13>
        </DATA>
    <METADATA>
</xml>

Импорт в мою базу данных работает, но для каждого значения генерируется новая запись, а я нетзнать, как мой вышеприведенный код должен быть изменен, чтобы он стал одной записью в моей базе данных с одним идентификатором.Вот скриншот моей тестовой записи:

enter image description here

И здесь вы можете увидеть, как это должно выглядеть: enter image description here

Я знаю, что я делаю что-то не так с моим циклом foreach, и я знаю, что это может быть легко для некоторых из вас, ребята, но сейчас я не могу исправить это самостоятельно.Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 10 декабря 2018

Вам нужно построить полный запрос вне самого внутреннего foreach.Примерно так будет хорошее начало.Этот поток должен помочь вам настроить привязку для работы с mysqli, параметрами привязки MySQLI с помощью call_user_func_array .С PDO вы просто передаете $params в функцию execute.

foreach ($xml->METADATA->DATA as $item) {
    foreach ($item->children() as $child) {
        $cols[] = $child->getName();
        $params[] = $child->nodeValue;
    }
    if(!empty($params)) {
         $columns = implode(',', $cols);
         $placeholders = rtrim(str_repeat('?, ', count($params)), ', ');
         $sql = 'INSERT INTO dwh_xml ( ' . $columns . ') VALUES(' . $placeholders . ')';
         $stmt = $db_con->prepare($sql);
         $stmt->execute();
         unset($params, $cols, $placeholders);
    }
}

https://3v4l.org/nhJi7

...