簡體   English   中英

如何正確地使用XML將XML字符串中的值插入mysql?

[英]how to insert values from XML string into mysql with PHP, correctly?

我正在嘗試使用以下代碼讀取和解析XML文件,但是我正在運行幾個問題,第一個問題是狀態變量和其他已知的填充變量未導入MYSQL表中,不知道為什么。 我所有的表和列都是varchar(255)。

第二個問題是記錄總數停止在50條,沒有錯誤或任何錯誤。 不知道為什么僅CA狀態就有數百條記錄,並且該腳本應該遍歷所有狀態,然后遍歷XML字符串中的所有項目並將其插入MYSQL表中。

我有點困惑,任何幫助表示贊賞。

<?php

$arr = array("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "GU", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VI", "VT", "WA", "WI", "WV", "WY");
foreach ($arr as $value) {

    $url ='http://api.votesmart.org/Address.getOfficeByOfficeState?key=04c935d4337616f104e5fc905e9fef2d&officeId=9&stateId='.$value.'&officeTypeId=C';
        $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url); //getting url contents

    $data = curl_exec ($ch); //execule curl request
    curl_close($ch);

    // read XML data string
    $xml = simplexml_load_string($data) or die("ERROR: Cannot create SimpleXML object");
    // open MySQL connection
    $connection = mysqli_connect("localhost", "xxx", "xxx", "xxx") or die ("ERROR: Cannot connect");
    // process node data
    // create and execute INSERT queries

    foreach ($xml->office->candidate as $item) {
        foreach ($xml->office->address as $item2) {
            foreach ($xml->office->phone as $item3) {
                foreach ($xml->office->notes as $item4) {

                    $candidateId = $item->candidateId;
                    $title = mysqli_real_escape_string($connection, $item->title);
                    $firstName = mysqli_real_escape_string($connection, $item->firstName);
                    $middleName = mysqli_real_escape_string($connection, $item->middleName);
                    $nickName = mysqli_real_escape_string($connection, $item->nickName);
                    $lastName = mysqli_real_escape_string($connection, $item->lastName);
                    $suffix = mysqli_real_escape_string($connection, $item->suffix);

                    $type = $item2->type;
                    $typeId = $item2->typeId;
                    $street = $item2->street;
                    $city = $item2->city;
                    $state = $item->state;
                    $zip = $item2->zip;

                    $phone1 = $item3->phone1;
                    $phone2 = $item3->phone2;
                    $fax1 = $item3->fax1;
                    $fax2 = $item3->fax2;
                    $tollFree = $item3->tollFree;
                    $ttyd = $item3->ttyd;
                    $cellphone = $item3->cellphone;

                    $contactName = $item4->contactName;
                    $contactTitle = $item4->contactTitle;

                    $sql = "INSERT INTO address (candidateId, title, firstName, middleName, nickName, lastName, suffix, type, typeId, street, city, state, zip, phone1, phone2, fax1, fax2, tollFree, ttyd, cellphone, contactName, contactTitle) VALUES ('$candidateId', '$title', '$firstName', '$middleName', '$nickName', '$lastName', '$suffix', '$type', '$typeId', '$street', '$city', '$state', '$zip', '$phone1', '$phone2', '$fax1', '$fax2', '$tollFree', '$ttyd', '$cellphone', '$contactName', '$contactTitle') ON DUPLICATE KEY UPDATE title = '$title', firstName = '$firstName', middleName = '$middleName', nickName = '$nickName', lastName = '$lastName', suffix = '$suffix', type = '$type', typeId = '$typeId', street = '$street', city = '$city', state = '$state', zip = '$zip', phone1 = '$phone1', phone2 = '$phone2', fax1 = '$fax1', fax2 = '$fax2', tollFree = '$tollFree', ttyd = '$ttyd', cellphone = '$cellphone', contactName = '$contactName', contactTitle = '$contactTitle'";

                    mysqli_query($connection, $sql) or die ("ERROR: " .mysqli_error($connection) . " (query was $sql)");
                }
            }
        }
    }

    // close connection
    mysqli_close($connection);
}

?>

我不能一眼看出您的數據是否存在問題,但是對於foreach-iteration,確實存在問題:

foreach ($xml->office->candidate as $item) {
        foreach ($xml->office->address as $item2) {

$xml->office->candidate的外部迭代導致$item表示第一個 office元素的所有候選元素。 由於有54個州,所以這個數字很可能會停在50個州,而且也許並非所有州都設有辦事處。

快速檢查的確顯示,在這54個文件的第一個 Office元素中有50個候選條目。

因此,您更可能希望以不同的方式堆疊foreach-es。

foreach ($xml->office as $office) {
    foreach ($office->candidate as $candidate) {
        ...
    }
}

僅此級別就已經顯示了單獨的54個XML文檔中所有 office元素(不僅是第一個)中的3383個候選元素。

當您將這些foreach-es的多個級別相互堆疊時,這可能會變得非常復雜,因此您應該從外部到內部進行構建-這需要一些計划和逐步的工作。

如果您希望從內部到外部進行構建,我建議使用Xpath代替,首先讓感興趣的元素節點,然后通過其他相對的xpath查詢獲取父級的信息。 但這需要xpath的知識,我不知道您是否聽說過。

無論如何,要小心foreach-es並最有可能選擇更好的變量名,這應該已經將您帶到了目的地。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM