mysql tabloda xml ve insert veri ayrıştırma

3 Cevap php

Ben php simplexml_load_file kullanarak bir xml dosyası ayrıştırma () ve ardından bir mysql İSAM tablodaki istenen veri ekleme duyuyorum. Sorun kodu burada ve orada 500 iç sunucu hataları ile, kez "en" çalışır. Ben sürecine çalışıyorum XML dosyası (50 MB civarında) büyük, ve çalışır zaman mysql tabloda etrafında 25000 satırları verir. Ben hatası alıyorum, komut birkaç bin satır birkaç satır bir şey ekler.

Birisi alternatif bir yol bu herhangi bir fikir vardır, ya da varsa neyse, burada kod, ben bunu takdir ediyorum, bilmiyorum, belki toplu işlem veya böyle bir şey.

<?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;

Yardımlarınız için şimdiden teşekkürler!

3 Cevap

Hangi hata alabilirim?

Ayrıca, much daha hızlı çalışacak eğer olacaktır:

  1. DELETE FROM table TRUNCATE table (bunu yeniden kullanım kimlikleri varsayarak) ile değiştirin
  2. Bunun gibi, aynı anda birden fazla satır eklemek

    INSERT INTO table (col1, col2) VALUES (val1, val2), (val1a, val1b), ...

Php tüm hataları gösteren değil gibi görünüyor. Bu eklemeyi deneyin:

error_reporting(E_ALL);

This should print all errors. Xslt (@Greg) is a good option.

Size döngü başlamadan önce bir değişkene XPath ayarlamak için daha verimli olup olmadığından emin değilim.

örneğin

$productsxml = $xml->xpath('//product')
foreach($productsxml as $products)

you could also use xslt to create a statement like @Grörneğin has suggested and execute it at once.