разбор xml и вставка данных в таблицу mysql

#php #mysql #xml

#php #mysql #xml

Вопрос:

Я анализирую xml-файл с помощью php simplexml_load_file(), а затем вставляю нужные данные в таблицу ISAM mysql. Проблема в том, что код работает «в большинстве» случаев, с 500 внутренними ошибками сервера здесь и там. XML-файл, который я пытаюсь обработать, большой (около 50 МБ), и при работе он выдает около 25000 строк в таблице mysql. Когда я получаю сообщение об ошибке, скрипт вставляет что угодно — от нескольких строк до нескольких тысяч строк.

В любом случае, вот код, я был бы признателен, если у кого-нибудь есть какое-либо представление об этом или есть альтернативный способ, я не знаю, может быть, пакетная обработка или что-то в этом роде.

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

Заранее спасибо за вашу помощь!

Ответ №1:

Какую ошибку вы получаете?

Кроме того, он будет работать намного быстрее, если вы:

  1. Замените DELETE FROM table на TRUNCATE table (при условии, что вы можете повторно использовать идентификаторы)
  2. Вставьте несколько строк одновременно, вот так

    ВСТАВКА В таблицу (col1, col2) ЗНАЧЕНИЙ (val1, val2), (val1a, val1b), …

Комментарии:

1. Я изменил delete на truncate, похоже, это может быть немного быстрее. Как бы я построил предложенную вами вставку в моем цикле? Ошибка, которую я получаю, заключается в следующем: Внутренняя ошибка сервера Сервер столкнулся с внутренней ошибкой или неправильной конфигурацией и не смог выполнить ваш запрос. Не очень описательно

2. Шаг 2 был решающим. Спасибо!

Ответ №2:

Похоже, ваш php показывает не все ошибки. Попробуйте добавить это:

 error_reporting(E_ALL);
  

Это должно вывести все ошибки.
Xslt (@Greg) — хороший вариант.

Ответ №3:

я не уверен, что эффективнее установить xpath в переменную перед запуском цикла.

например

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

вы также можете использовать xslt для создания инструкции, подобной предложенной @Greg, и выполнить ее сразу.