在插件安装期间将大量数据插入到定制表中

时间:2013-04-02 作者:Brett Clapper

我正在开发一个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;
}

2 个回复
最合适的回答,由SO网友:Jesse 整理而成

我有一些建议给你:

自己创建MySQL插入查询

  • 2,联合收割机multiple 将值查询插入一个类似值(1,2,3)、(4,5,6)
  • 3,使用$wpdb->query 然后,您需要找出适当数量的“multiple“是。

    我尝试了100个,它对我很有效,但我认为数量因服务器设置而异。

  • SO网友:Dominic Yun

    还有一个建议是在脚本中延长php执行时间限制。例如使用:

    set_time_limit($seconds);
    
    其中$seconds是脚本应运行的时间。

    结束

    相关推荐

    Display All Non-Used Plugins

    我的公司目前拥有大约20个多站点,并且每天都在增长。我们正在尝试通过插件并制定标准。IE,表单使用插件X。然而,我们还没有找到一种单一的方法来检查和系统地显示哪些插件甚至没有被使用。是否有一个功能可以向我们显示已使用或未使用的插件?我试着寻找我能想到的一切,但我一生都找不到答案。