解析xml并在mysql表中插入数据

时间:2009-08-12 07:52:56

标签: php mysql xml

我使用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;

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

你得到什么错误?

此外,如果您:

,它将更快地运行很多
  1. DELETE FROM table替换为TRUNCATE table(假设您可以重复使用ID)
  2. 一次插入多行,如下

    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建议的语句并立即执行它。