PHP批量插入foreach

Posted

技术标签:

【中文标题】PHP批量插入foreach【英文标题】:PHP bulk insert foreach 【发布时间】:2012-05-23 20:26:34 【问题描述】:

我有一个从远程源读取数据的 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 条记录。

提前致谢。

【问题讨论】:

en.wikipedia.org/wiki/SQL_injection 你确定是慢的INSERT而不是cURL请求?尝试echo对页面进行一些超时,以确保您知道它在哪里变慢了。 请通过这个php.net/manual/en/mysqli.multi-query.php 您可以使用@magnetik、@chauhan 或@Repox 提供的代码在一次插入中添加多条记录。或者您可以使用准备好的语句,这将有助于防止 SQL 注入(或使用 mysql_real_escape_string)并预编译查询,这样如果您执行多个 INSERT 语句会更快。 【参考方案1】:

也许是这样的?

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

【讨论】:

【参考方案2】:

要进行批量插入操作,您可以将脚本附加到变量中,并且可以整体运行,但为此您必须使用mysqli_multi_query。检查此链接http://www.php.net/manual/en/mysqli.multi-query.php

【讨论】:

【参考方案3】:

您可以一次插入所有记录,如下所示:就像我们从 mysql 表中导出数据一样。

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

【讨论】:

【参考方案4】:

您可以通过执行以下操作在一个语句中执行此操作:

$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);

【讨论】:

在将$query 插入数据库之前删除最后一个逗号:$query = substr($query, 0, -1);

以上是关于PHP批量插入foreach的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

mybatis使用foreach进行批量插入和删除操作

Mybatis之foreach批量插入