PHP массовая вставка foreach

У меня есть скрипт curl, который читает данные из удаленного источника. Ниже приведен текущий код:

function download_page($path){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$path);
    curl_setopt($ch, CURLOPT_FAILONERROR,1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $retValue = curl_exec($ch);                      
    curl_close($ch);
    return $retValue;
}
$sXML = download_page('http://remotepage.php&function=getItems&count=100&page=1');
$oXML = new SimpleXMLElement($sXML);
foreach($oXML->results->item->item as $oEntry){
    $insert_query = mysql_query("INSERT INTO tbl_item (first_name, last_name, date_added) VALUES ('" . $oEntry->firstname . "', '" . $oEntry->lastname . "', '" . date("Y-m-d H:i:s") . "')");
}

Однако скрипт работает очень медленно, так как я представляю его, потому что он записывает каждую отдельную запись. Переменная count - это количество записей, возвращаемых для каждой страницы, а переменная page - простой счетчик страниц.

Мне интересно, есть ли способ сделать массовую инструкцию вставки, чтобы вставить все 100 записей одновременно.

Заранее спасибо.

5 ответов

Решение

Вы можете сделать это в одном выражении, выполнив что-то вроде этого:

$sXML = download_page('http://remotepage.php&function=getItems&count=100&page=1');
$oXML = new SimpleXMLElement($sXML);
$query = "INSERT INTO tbl_item (first_name, last_name, date_added) VALUES";
foreach($oXML->results->item->item as $oEntry){
    $query .=  "('" . $oEntry->firstname . "', '" . $oEntry->lastname . "', '" . date("Y-m-d H:i:s") . "'),";
}
mysql_query($query);

Может как то так?

foreach($oXML->results->item->item as $oEntry){
  $inserts[] = "(". implode(', ', array ($oEntry->firstname, $oEntry->lastname, date("Y-m-d H:i:s") ) ) .")";
}
$insert_query = mysql_query("INSERT INTO tbl_item (first_name, last_name, date_added) VALUES ".implode(', ', $inserts));

Вы можете вставить все записи одновременно, как показано ниже: Например, когда мы экспортируем данные из таблицы MySQL.

INSERT INTO tablename (id, field2, field3, field3) VALUES ('', 5454, '454', '545'), ('', 'erwe', 'rewrew', 'werew'), ('', 'ewrew', 'rwerwe', 'werwer'), ('', 'jkj', 'ere', 'uju') , ('', '343', '3434', 'dfdf');

Для массовой операции вставки вы можете добавить свой скрипт в переменную, и вы можете запустить это как целое, но для этого вы должны использовать mysqli_multi_query, Проверьте эту ссылку http://www.php.net/manual/en/mysqli.multi-query.php

      $sXML=download_page('http://remotepage.php&function=getItems&count=100&page=1');
$data = array();
$oXML = new SimpleXMLElement($sXML);
$query = "INSERT INTO tbl_item (first_name, last_name, date_added) VALUES ";
foreach($oXML->results->item->item as $oEntry){
    $data[] =  "('" . $oEntry->firstname . "', '" . $oEntry->lastname . "', '" . date("Y-m-d H:i:s") . "')";
}

$query .= implode(',', $data);
mysql_query($query);

На самом деле небольшое изменение, но таким образом данные копируются в ваш запрос только один раз.

Другие вопросы по тегам