php - 如何使用 PHP 将 XML 字符串中的值正确插入到 mysql 中?

标签 php mysql arrays xml import

我正在尝试使用以下代码读取和解析 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 迭代,存在问题:

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

$xml->office->candidate 的外部迭代导致 $item 表示 first 的所有 candidate 元素 office 元素。这个数字很可能会停留在 50 个,因为有 54 个州,而且可能并非所有州都设有办事处。

快速检查确实显示,这 54 个文件的 第一 办公室元素中有 50 个候选条目。

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

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

仅此级别就已经显示了这 54 个 XML 中所有 office 元素(不仅是第一个)中的 3383 个候选元素仅文档。

当您将这些 foreach-es 的多个级别相互堆叠时,这可能会变得非常复杂,因此您应该从外到内构建它 - 这需要一些规划和一些分步工作。

如果您更喜欢从内到外构建,我建议使用 Xpath 首先获取感兴趣的元素节点,然后使用其他相对的 xpath 查询获取父节点的信息。但这需要xpath方面的知识,不知道你有没有听说过。

无论如何,小心使用 foreach-es 并且很可能选择更好的变量名称应该已经可以帮助您到达目的地了。

关于php - 如何使用 PHP 将 XML 字符串中的值正确插入到 mysql 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30113465/

相关文章:

php - Codeigniter 加载不同的数据库配置

javascript - 如何使用 Ajax 响应中的日期对数组数据进行分组?

php4: mysql_query 的参数计数错误?

php - 如何在评论时获取帖子的当前 ID

php - Doctrine2 实体管理器在命名空间中找不到自定义存储库类

php - 在没有 Apache 的情况下在 NetBeans 6.8 上调试 PHP

c# - 在 javascript 片段中使用 C# 列表

javascript - 如何根据数字属性对对象数组进行排序

php - php 是否故意认为在 ob_end_flush() 调用后有一些输出?

php - Register.php不插入sql查询