【问题标题】:Xml to Mysql Fatal errorXml 到 Mysql 致命错误
【发布时间】:2017-11-27 09:26:37
【问题描述】:

我试图让它工作,但我做错了,我现在尝试 2 天让它工作,但没有运气。也许有人可以帮我写代码

我在互联网上有一个 xml 文件(参见示例),我想用 php 将该 xml 文件放入我的 mysql 中。

这是我的 XML 文件的示例

<AssignmentItems xmlns="http://server.my.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://server.my.net/static/xsd/datafeed_assignments.xsd" total="29">
<Assignment>
<Id>253049101</Id>
<Status>Enroute</Status>
<Location>EBCI</Location>
<From>EBCI</From>
<Destination>EHGG</Destination>
<Assignment>1 PixCha Passer</Assignment>
<Amount>1</Amount>
<Units>passengers</Units>
<Pay>911.00</Pay>
<PilotFee>0.00</PilotFee>
<Expires>3 days</Expires>
<ExpireDateTime>2017-12-01 06:01:56</ExpireDateTime>
<Type>Trip-Only</Type>
<Express>False</Express>
<Locked>sharee</Locked>
<Comment/>
</Assignment> 
</AssignmentItems>

我使用这个 PHP 代码将它发送到我的 MYSQL

<?php
$db = new PDO('mysql:host=localhost;dbname=test','root','');

$xmldoc = new DOMDocument();
$xmldoc->load('**XML URL**');

$xmldata = $xmldoc->getElementsByTagName('Assignment');
$xmlcount = $xmldata->length;

for  ($i=0; $i < $xmlcount; $i++) {
$Id = $xmldata->item($i)->getElementsByTagName('Id')->item(0)->childNodes->item(0)->nodeValue;
$Status = $xmldata->item($i)->getElementsByTagName('Status')->item(0)->childNodes->item(0)->nodeValue;
$Location = $xmldata->item($i)->getElementsByTagName('Location')->item(0)->childNodes->item(0)->nodeValue;
$Fram = $xmldata->item($i)->getElementsByTagName('From')->item(0)->childNodes->item(0)->nodeValue;
$Destination = $xmldata->item($i)->getElementsByTagName('Destination')->item(0)->childNodes->item(0)->nodeValue;
$Assignment = $xmldata->item($i)->getElementsByTagName('Assignment')->item(0)->childNodes->item(0)->nodeValue;
$Amount = $xmldata->item($i)->getElementsByTagName('Amount')->item(0)->childNodes->item(0)->nodeValue;
$Units = $xmldata->item($i)->getElementsByTagName('Units')->item(0)->childNodes->item(0)->nodeValue;
$Pay = $xmldata->item($i)->getElementsByTagName('Pay')->item(0)->childNodes->item(0)->nodeValue;
$PilotFee = $xmldata->item($i)->getElementsByTagName('PilotFee')->item(0)->childNodes->item(0)->nodeValue;
$Expires = $xmldata->item($i)->getElementsByTagName('Expires')->item(0)->childNodes->item(0)->nodeValue;
$ExpireDateTime = $xmldata->item($i)->getElementsByTagName('ExpireDateTime')->item(0)->childNodes->item(0)->nodeValue;
$Type = $xmldata->item($i)->getElementsByTagName('Type')->item(0)->childNodes->item(0)->nodeValue;
$Express = $xmldata->item($i)->getElementsByTagName('Express')->item(0)->childNodes->item(0)->nodeValue;
$Locked = $xmldata->item($i)->getElementsByTagName('Locked')->item(0)->childNodes->item(0)->nodeValue;
$stmt = $db->prepare("insert into jobs values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$stmt->bindParam(1, $Id);
$stmt->bindParam(2, $Status);
$stmt->bindParam(3, $Location);
$stmt->bindParam(4, $Fram);
$stmt->bindParam(5, $Destination);
$stmt->bindParam(6, $Assignment);
$stmt->bindParam(7, $Amount);
$stmt->bindParam(8, $Units);
$stmt->bindParam(9, $Pay);
$stmt->bindParam(10, $PilotFee);
$stmt->bindParam(11, $Expires);
$stmt->bindParam(12, $ExpireDateTime);
$stmt->bindParam(13, $Type);
$stmt->bindParam(14, $Express);
$stmt->bindParam(15, $Locked);
$stmt->execute();
printf($Id.'<br/>');
printf($Status.'<br/>');
printf($Location.'<br/>');
printf($Fram.'<br/>');
printf($Destination.'<br/>');
printf($Assignment.'<br/>');
printf($Amount.'<br/>');
printf($Units.'<br/>');
printf($Pay.'<br/>');
printf($PilotFee.'<br/>');
printf($Expires.'<br/>');
printf($ExpireDateTime.'<br/>');
printf($Type.'<br/>');
printf($Express.'<br/>');
printf($Locked.'<br/>');


}

 ?>

比我在我的 php 页面上得到这个错误:

注意:试图获取非对象的属性 C:\xampp\htdocs\xml\xml.php 在第 11 行

致命错误:未捕获的错误:在 null 上调用成员函数 item() 在 C:\xampp\htdocs\xml\xml.php:11 堆栈跟踪:#0 {main} 抛出 C:\xampp\htdocs\xml\xml.php 在第 11 行

我希望有人可以帮助解决这个错误代码 迈克尔

【问题讨论】:

  • 从您的问题中删除访问密钥并添加足以重现问题的示例 xml。
  • 您可以先在 PHP 中使用 simplexml_load_file 函数获取整个 xml 数据,然后可以将所有数据循环添加到 MySql

标签: php mysql xml


【解决方案1】:

您可以使用simplexml_load_file 函数在PHP 中简单地获取整个XML 数据,然后可以使用for loopMySqli Prepared Statements 将所有XML 数据添加到数据库,如下所示:

$xml=simplexml_load_file("http://www.example.com/sample.xml") or die("Error: 
Cannot create object");
$count = count($xml->Assignment);
for($i=0;$i<$count;$i++)
{
$Id = $xml->Assignment[$i]->Id;
$Status = $xml->Assignment[$i]->Status;
$Location = $xml->Assignment[$i]->Location;
$Fram = $xml->Assignment[$i]->Fram;
$Destination = $xml->Assignment[$i]->Destination;
$Assignment = $xml->Assignment[$i]->Assignment;
$Amount = $xml->Assignment[$i]->Amount;
$Units = $xml->Assignment[$i]->Units;
$Pay = $xml->Assignment[$i]->Pay;
$PilotFee = $xml->Assignment[$i]->PilotFee;
$Expires = $xml->Assignment[$i]->Expires;
$ExpireDateTime = $xml->Assignment[$i]->ExpireDateTime;
$Type = $xml->Assignment[$i]->Type;
$Express = $xml->Assignment[$i]->Express;
$Locked = $xml->Assignment[$i]->Locked;
$stmt = $db->prepare("insert into jobs values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$stmt->bindParam(1, $Id);
$stmt->bindParam(2, $Status);
$stmt->bindParam(3, $Location);
$stmt->bindParam(4, $Fram);
$stmt->bindParam(5, $Destination);
$stmt->bindParam(6, $Assignment);
$stmt->bindParam(7, $Amount);
$stmt->bindParam(8, $Units);
$stmt->bindParam(9, $Pay);
$stmt->bindParam(10, $PilotFee);
$stmt->bindParam(11, $Expires);
$stmt->bindParam(12, $ExpireDateTime);
$stmt->bindParam(13, $Type);
$stmt->bindParam(14, $Express);
$stmt->bindParam(15, $Locked);
$stmt->execute();
printf($Id.'<br/>');
printf($Status.'<br/>');
printf($Location.'<br/>');
printf($Fram.'<br/>');
printf($Destination.'<br/>');
printf($Assignment.'<br/>');
printf($Amount.'<br/>');
printf($Units.'<br/>');
printf($Pay.'<br/>');
printf($PilotFee.'<br/>');
printf($Expires.'<br/>');
printf($ExpireDateTime.'<br/>');
printf($Type.'<br/>');
printf($Express.'<br/>');
printf($Locked.'<br/>');
// Get all data in Variables and Execute MYSQLi Prepared Statements
// ----  //
}

【讨论】:

  • 谢谢你的回答我今天晚些时候测试它:)
  • 不客气,迈克尔!如果您遇到任何问题,请告诉我:)
  • 我现在有这个:i.imgur.com/zKvQIPR.png 但我认为我做错了什么,如果你愿意,你可以帮助我吗? :)
  • 当然!我会检查并尽快通知您。
  • 请将前面的 for 循环替换为 for($i=0;$i
【解决方案2】:

我发现你的错误。当您尝试访问位置 1 中的项目并且该位置没有项目时,会注意到该错误: 当您调用此函数时,$xmlcount = $xmldata-&gt;length; $xmlcount 的值为 2,因此您的 for 循环使用空数据创建一个空循环。为了避免这种快速而没有太多控制的情况,请这样做:

$xmlcount = $xmldata->length - 1;

[编辑]

您的 XML 格式不正确。你错过了&lt;AssignmentItems&gt;的封闭标签

【讨论】:

  • 谢谢你的回答,我现在有了这个:$xmldata = $xmldoc->getElementsByTagName('Assignment'); $xmlcount = $xmldata->长度 - 1;但故障码相同
  • 没问题:)。 “我现在有这个”是什么意思
  • 我的意思是我输入你的代码行 my php file = $xmlcount = $xmldata->length - 1;但这对我来说不是固定的,还是我忘记了什么?
  • 对不起,我的错误,忘记复制过去我现在在第一篇文章中添加的 。
  • 没有不工作 :( 我和第一篇文章有​​同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2016-07-05
  • 1970-01-01
  • 2014-10-13
  • 2012-01-24
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多