我正在开发一个WordPress插件,它可以在数据库中创建几个新表。它还将一些默认数据从CSV文件加载到表中。其中大多数都很小,加载数据效果很好。然而,其中之一是一个邮政编码数据库,它意味着要加载超过43000行的数据。
我第一次尝试完全按照我对插入的数据量小得多的表所做的操作。WordPress回应道:“插件无法激活,因为它触发了致命错误。”在检查完数据库后,我发现它在停止之前只通过了1000多个邮政编码。因此,我从该CSV中提取了前1500行,并将其分解为2个CSV文件(每个文件750行)。我使用下面的代码循环加载这两个CSV文件,以测试我是否可以在速度非常慢的解决方案中完成这项工作,但至少可以做到这一点。结果,在停车之前,它仍然只能通过1099个邮政编码。
有没有人能从WordPress插件向表中插入大量数据的解决方案?提前感谢所有在这里帮助我的人。
以下是zips CSV中的一行示例:
%1%;%00544%;%NY%;%HOLTSVILLE%;%-73.047623%;%40.813296%;%0%
以下是创建表函数:
function zip_table_create() {
global $wpdb;
$table_name = $wpdb->prefix . "zip";
$sql = "CREATE TABLE $table_name (
`zip_id` bigint(20) NOT NULL AUTO_INCREMENT,
`zip` char(5) DEFAULT NULL,
`state` char(2) NOT NULL DEFAULT \'\',
`name` char(40) DEFAULT NULL,
`lng` double NOT NULL DEFAULT \'0\',
`lat` double NOT NULL DEFAULT \'0\',
`population` int(10) unsigned NOT NULL DEFAULT \'0\',
PRIMARY KEY (`zip_id`)
);";
dbDelta($sql);
// Check to see if any records are stored in table
// If not, load default data from CSV
$zip = $wpdb->get_row("SELECT * FROM $table_name WHERE zip_id = 1");
if ($zip == null) {
for ($z=1; $z<3; $z++)
{
$csvpath = plugin_dir_path(__FILE__);
$csvpath = $csvpath."csv/zips".$z.".csv";
$csv_array = csv2array($csvpath, ";", "%");
for ($x=0; $x < count($csv_array); $x++) {
$wpdb->insert(
$table_name,
array(
\'zip_id\' => $csv_array[$x][0],
\'zip\' => $csv_array[$x][1],
\'state\' => $csv_array[$x][2],
\'name\' => $csv_array[$x][3],
\'lng\' => $csv_array[$x][4],
\'lat\' => $csv_array[$x][5],
\'population\' => $csv_array[$x][6]
)
);
}
}
}
}
以下是在create函数中调用的csv2array函数:
function csv2array($file, $delimiter, $enclosure) {
if (($handle = fopen($file, "r")) !== FALSE) {
$i = 0;
while (($lineArray = fgetcsv($handle, 4000, $delimiter, $enclosure)) !== FALSE) {
for ($j=0; $j<count($lineArray); $j++) {
$data2DArray[$i][$j] = $lineArray[$j];
}
$i++;
}
fclose($handle);
}
return $data2DArray;
}