2014-10-29 49 views
1

我想从XML文件中获取信息,但无法使其工作。 这里是我的代码:检索并解析与MySQL结果相关的XML记录

$xml = simplexml_load_file('http://www.website.de/file.xml'); 

$query = "SELECT * FROM table WHERE shop='name' and datum='' LIMIT 5";   
$result = mysql_query($query) or die("Error: " . mysql_error()); 
$db_erg = mysql_query($query); 
while ($inhalt = mysql_fetch_array($db_erg, MYSQL_ASSOC)) 
{ 
    $i = $inhalt['name']; 
    $name = $xml->record[$i]->PRODUCT_NAME; 
    $link = $xml->record[$i]->PRODUCT_LINK; 
    $preis = $xml->record[$i]->PRICE; 
    $versand = $xml->record[$i]->SHIPPING_COST; 
    $ean = $xml->record[$i]->PRODUCT_CODE; 
    $bild = $xml->record[$i]->PRODUCT_IMAGE_URL; 
    $datum = time(); 
    $id = $inhalt['id']; 
    echo "<p>".$id." geaendert.</p>"; 
} 

我每次运行它给我的错误的脚本...

Trying to get property of non-object in...

...在线路从$name$bild 。所以我想这与$i有关,但我不明白为什么这不起作用。 我将不胜感激。

P.S:我知道这不是使用MySQL的安全方式。完成的网站上的脚本将只使用mysqli预准备语句。

这里是我操纵XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<csv_data_records source="/var/www/network/domains/webservice/public_html/partner/functions/../../../../../tmp/productdata_cf45f01cb623aa26d26b25d362e11b56.tmp" datetime="2014-10-29T19:31:38+01:00" > 
    <record> 
     <PRODUCT_ID>9868.1</PRODUCT_ID> 
     <PRODUCT_CODE>4032314007020</PRODUCT_CODE> 
     <PRODUCT_CODE_TYPE>EAN</PRODUCT_CODE_TYPE> 
     <PRODUCT_NAME>Luposan Kräuterkraft 30 Pulver - 1000 g</PRODUCT_NAME> 
     <BRAND>Luposan</BRAND> 
     <PRICE>22.99</PRICE> 
     <PRICE_OLD>26.99</PRICE_OLD> 
     <PRICE_CURRENCY>EUR</PRICE_CURRENCY> 
     <CATEGORY>Hund &gt; Spezialfutter &amp; Nahrungsergänzungen &gt; Haut &amp; Fell &gt; Luposan</CATEGORY> 
     <PRODUCT_IMAGE_URL>http://marketing.net.zooplus.de/ts/i3101179/tsv?tst=!!!TIME_STAMP!!!&amp;amc=aff.zooplus.20478.24084.8290&amp;rmd=1&amp;trg=http%3A%2F%2Fmedia.zooplus.com%2Fbilder%2F1%2F400%2F9868_luposan_kraeuterkraftb_1.jpg</PRODUCT_IMAGE_URL> 
     <PRODUCT_LINK>http://marketing.net.zooplus.de/ts/i3101179/tsc?tst=!!!TIME_STAMP!!!&amp;amc=aff.zooplus.20478.24084.8290&amp;rmd=1&amp;trg=http%3A%2F%2Fwww.zooplus.de%2F-306243%2Fshop%2F%252B10PRFDEAFF%2Fhunde%2Fhundefutter_ergaenzung%2Fhaut_haare%2Fluposan%2F9868</PRODUCT_LINK> 
     <AVAILABILITY>in stock</AVAILABILITY> 
     <SHIPPING_COST>0.00</SHIPPING_COST> 
     <PRODUCT_UNIT_PRICE>22.99</PRODUCT_UNIT_PRICE> 
     <PRODUCT_UNIT_MEASURE>1</PRODUCT_UNIT_MEASURE> 
     <PRODUCT_UNIT_BASE_VALUE>kg</PRODUCT_UNIT_BASE_VALUE> 
</record> 
+0

'$ xml'没有在你的代码的任何地方定义。所以,正如PHP所说的那样。你试图访问一个非对象的属性(例如一个未定义的变量没有属性)。 – 2014-10-29 20:46:29

+0

@marc我知道,我忘了在网站上显示这个。但它在我的脚本中。我现在把它添加到上面的代码中。抱歉。 – Dennis 2014-10-29 20:47:23

+0

@Dennis如果我们不知道文件中的XML结构,或者$ inhalt ['name']'是什么,我们就不能提供任何帮助。打印'$ inhalt ['name']'的值来检查它是什么你认为它是什么,并将XML文件的片段添加到你的问题。 – 2014-10-29 20:48:52

回答

2

你已经发布的代码工作正常的我,所以我会想象的问题是,XML文件没有加载或者您$i超出了XML文件中值的范围。既可以防范的与添加到您的代码检查:

$xml = simpleXML_load_file($url, "SimpleXMLElement"); 
if ($xml === false) 
{ 
    die("Could not load the XML file!"); 
} 

$i = $inhalt['name']; 
if (isset ($xml->record[$i])) { 
    // do your processing 
} 
else { 
    // trigger an error/warning 
} 

如果要为大量的产品收集数据,你会发现它更有效地存储在一个阵列,通过元素名称索引。它至少可以让你不必编写大量相似的语句。

您还可以使用simpleXML's XPath implementation在您的XML文件中找到相关record,方法是将PRODUCT_ID与存储在数据库中的ID进行匹配。这里有一个例子:

$data = array(); 
$prod_id = $inhalt['artikelnummer']; 

# this finds the record nodes where the value of PRODUCT_ID is $prod_id 
# [.='$prod_id'] means the node's text content should match $prod_id 
# the /.. at the end of the query returns the parent node, i.e. the record 
foreach ($xml->xpath("record/PRODUCT_ID[.='$prod_id']/..") as $e) { 
    foreach(array('PRODUCT_NAME', 'PRODUCT_LINK', 'PRICE', 'SHIPPING_COST', 
     'PRODUCT_CODE', 'PRODUCT_IMAGE_URL') as $x) { 
     # make sure that the relevant value element is there! 
     if (isset($e->$x)) { 
      $data[$x] = (string)$e->$x; 
     } 
    } 
    print_r($data); 
    // do whatever you want with $data 
} 

输出:

Array 
(
    [PRODUCT_NAME] => Luposan Kräuterkraft 30 Pulver - 1000 g 
    [PRODUCT_LINK] => http://marketing.net.zooplus.de/ts/i3101179/tsc?tst=!!!TIME_STAMP!!!&amc=aff.zooplus.20478.24084.8290&rmd=1&trg=http%3A%2F%2Fwww.zooplus.de%2F-306243%2Fshop%2F%252B10PRFDEAFF%2Fhunde%2Fhundefutter_ergaenzung%2Fhaut_haare%2Fluposan%2F9868 
    [PRICE] => 22.99 
    [SHIPPING_COST] => 0.00 
    [PRODUCT_CODE] => 4032314007020 
    [PRODUCT_IMAGE_URL] => http://marketing.net.zooplus.de/ts/i3101179/tsv?tst=!!!TIME_STAMP!!!&amc=aff.zooplus.20478.24084.8290&rmd=1&trg=http%3A%2F%2Fmedia.zooplus.com%2Fbilder%2F1%2F400%2F9868_luposan_kraeuterkraftb_1.jpg 
) 
+0

这里是print_r($ inhalt); Array([id] => 303131 [name] => 12829 [artikelnummer] => 305152.4 [shop] => Zooplus [snummer] => 2 [link] => [preis] => 0 [versand] => 0 [artid] => [ean] => [bild] => [kategorie] => [cha] => [neu] => [datum] => [aktiviert] =>) – Dennis 2014-10-29 21:24:08

+0

我仍然不知道为什么不工作。因为12829号记录肯定可用于xml文件。 – Dennis 2014-10-29 21:25:11

+0

您可以根据不同的标准进行匹配吗? 'artikelnummer'匹配' 9868.1'?用XPath抽出匹配很容易。 – 2014-10-29 21:30:03