[英]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.