我使用php simplexml_load_file()解析xml文件,然后在mysql ISAM表中插入所需的数据。问题是代码“大多数时间”工作,在这里和那里有500个内部服务器错误。我正在尝试处理的XML文件很大(大约50 MB),并且当它运行时它在mysql表中产生大约25000行。当我收到错误时,脚本会插入从几行到几千行的任何内容。
无论如何,这是代码,如果有人对此有任何见解,或者有另一种方法,我不知道,可能是批处理或类似的东西,我将不胜感激。
<?php
include ("myconnection.php");
mysql_query("DELETE FROM mytable") or die(mysql_error());
echo "data deleted, now insert: <br /><br />";
//the url for the feed:
$feed = 'cachy/copy.xml';
echo "myfeed: ".$feed;
echo "<br />";
// Load the feed
$xml = simplexml_load_file($feed);
if ($xml != null)
{
echo "<br />Success! feed available!<br /><br />";
}
else
{
echo "<br />Couldn't fetch the content<br /><br />";
die;
}
//die;
//ini_set("memory_limit","256M");
//set_time_limit(120);
function clean($input)
{
$input = trim($input);
$input = htmlentities($input, ENT_QUOTES);
$input = mysql_escape_string($input);
$input = EscapeShellCmd($input);
return $input;
}
//insert data from feed
foreach($xml->xpath('//product') as $products)
{
$product_name = clean($products->product_name);
mysql_unbuffered_query("INSERT INTO mytable (onsaledate, onsaletime, eventdate, eventtime, buyat_short_deeplink_url, product_name, level1, level2, VenueName, VenueDMAID)VALUES (\"$products->OnsaleDate\",\"$products->OnsaleTime\",\"$products->EventDate\",\"$products->EventTime\",\"$products->buyat_short_deeplink_url\",\"$product_name\",\"$products->level1\",\"$products->level2\",\"$products->VenueName\",\"$products->VenueDMAID\")") or die(mysql_error());
}
mysql_close($myConnection);
echo "records inserted my man!";
die;
提前感谢您的帮助!
答案 0 :(得分:2)
你得到什么错误?
此外,如果您:
,它将更快地运行很多DELETE FROM table
替换为TRUNCATE table
(假设您可以重复使用ID)一次插入多行,如下
INSERT INTO表(col1,col2)VALUES (val1,val2), (val1a,val1b), ...
答案 1 :(得分:1)
看起来你的php没有显示所有错误。尝试添加:
error_reporting(E_ALL);
这应该打印所有错误。 Xslt(@Greg)是个不错的选择。
答案 2 :(得分:0)
我不确定在开始循环之前将xpath设置为变量是否更有效。
例如
$productsxml = $xml->xpath('//product')
foreach($productsxml as $products)
你也可以使用xslt创建一个像@Greg建议的语句并立即执行它。