2017-03-10 101 views
2

我想用foreach语句将xml文件加载到我的MYSQL数据库中。它由于某种原因成功地在XML文件中循环,但似乎只有通过循环的第一次实际发送到数据库。MYSQL PHP Foreach语句只提交第一个插入语句

<?xml version="1.0" encoding="utf-8" ?> 

<chatcoderadmin> 
    <!-- Table Alarcos --> 
    <Alarcos> 
     <Alarcos_ID>12</Alarcos_ID> 
     <Device_ID>16cf10d0-5154-444e-96ad-46e913ac9761</Device_ID> 
     <Sender>4849941474</Sender> 
     <Receiver>2157389113</Receiver> 
     <Message>Hi Connor</Message> 
     <Service_Center></Service_Center> 
     <SMSStatus>0</SMSStatus> 
     <Timestamp>2015-09-10 14:09:45</Timestamp> 
     <Replace_Bit_Set>0</Replace_Bit_Set> 
     <Reply_Path_Exists>0</Reply_Path_Exists> 
     <Is_Status_Report>0</Is_Status_Report> 
    </Alarcos> 
    <Alarcos> 
     <Alarcos_ID>13</Alarcos_ID> 
     <Device_ID>f0bd524e-2289-47b3-b9c6-65c6af2dce64</Device_ID> 
     <Sender>4849941470</Sender> 
     <Receiver>266781</Receiver> 
     <Message>BstFreeMsg: Select privacy choices for new account or line(s). More info on how to opt in/out of Mobile Ads &amp; Reporting programs at boostmobile.com/privacy. </Message> 
     <Service_Center></Service_Center> 
     <SMSStatus>0</SMSStatus> 
     <Timestamp>2015-09-10 11:30:01</Timestamp> 
     <Replace_Bit_Set>0</Replace_Bit_Set> 
     <Reply_Path_Exists>0</Reply_Path_Exists> 
     <Is_Status_Report>0</Is_Status_Report> 
    </Alarcos> 
</chatcoderadmin> 

这是我用来处理XML

<?php 
    $xml = simplexml_load_file("test.xml") or die("Error: Cannot create object"); 

    $createAlarcos = $conn->prepare("INSERT INTO Alarcos_Data (alarcos_id, device_id, sender, receiver, message, alarcos_timestamp) VALUES (?,?,?,?,?,?)"); 

    $createAlarcos->bind_param("isssss",$alarcos_id, $device_id, $sender, $receiver, $message, $alarcos_timestamp); 

    foreach($xml->children() as $Alarcos) { 

     $alarcos_id = $Alarcos->Alarcos_ID; 
     $device_id = $Alarcos->Device_ID; 
     $sender = $Alarcos->Sender; 
     $receiver = $Alarcos->Receiver; 
     $message = $Alarcos->Message; 
     $alarcos_timestamp = $Alarcos->Timestamp; 

     $createAlarcos->execute(); 

    } 

    $createAlarcos->close(); 
    ?> 
+0

这看起来不错;我假设'$ conn'是mysqli而不是PDO?任何错误?你有没有添加调试,以确保你实际上处理XML中的多个孩子? – miken32

+1

$ conn是mysqli。我相信它正在处理不止一个孩子。当我在foreach中回显出alarcos_id时,它给出了它的两个实例。 – kirie

+0

我发现在某些情况下绑定到不存在的变量可能会造成麻烦。我通常在绑定它们之前将变量声明为空。 – miken32

回答

0

你必须在这两个XML元素相同ID的PHP代码。可能alarcos_id是数据库表中的主键,因此它不会被覆盖。这是检查错误结果的好理由;​​可能返回false。

... 
if (!$createAlarcos->execute()) { 
    foreach ($createAlarcos->error_list as $err) { 
     echo "Error $err[errno]: $err[error]<br/>\n"; 
    } 
} 
+0

执行查询的输出帮助我发现我的db表的主键不是auto_incrememted。所以它一直试图提交我的插入与ID为'0'。非常感谢。 – kirie