[英]Retrieve and parse XML records related to MySQL result
我试图从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
但是我不太明白为什么这行不通。 我将不胜感激。
PS:我知道这不是使用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 > Spezialfutter & Nahrungsergänzungen > Haut & Fell > Luposan</CATEGORY>
<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</PRODUCT_IMAGE_URL>
<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</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>
您发布的代码对我来说是正确的,因此我可以想象问题是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的XPath实现 ,通过将PRODUCT_ID
与存储在数据库中的ID匹配来在XML文件中查找相关record
。 这是一个例子:
$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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.