WordPress将数据从文本文件插入自定义表

时间:2018-07-03 07:32:54

标签: php wordpress

我正在尝试使用插件激活钩register_activation_hook将数据插入到自定义表中,因此当插件处于活动状态时,数据库及其数据将自动插入。数据位于插件目录中的文本文件中。当我激活插件数据库时,却没有插入。我想我没有看错txt文件。有人可以帮我解决这个问题吗?

我有一个文本文件格式的数据列表,例如

123|Jhon Doe
124|Michel Muller
125|Jems Curter
126|Miss Weedy
127|Burgel Heigen

我正在尝试将它们导入wordpress数据库,但是失败了。

贝洛是我的代码。

//creating db table 
function sbl_employee_create_db() {

    global $wpdb;

    $charset_collate = $wpdb->get_charset_collate();
    $table_employee  = $wpdb->prefix . 'sbl_employee';
    $table_br_name   = $wpdb->prefix . 'sbl_br_name';



    $sql = "CREATE TABLE IF NOT EXISTS $table_br_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        br_code int(5) NOT NULL,
        br_name varchar(220) NOT NULL,
        UNIQUE KEY id (id)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}


//function to insert branch data to database
function insert_brcode_name(){
    global $wpdb;
    $textCnt   = plugin_dir_path( __FILE__ )."data.txt";
    $file = fopen($textCnt, 'r');

    $arrfields = explode('|', $file);

    $br_code =  $arrfields[0]; 
    $br_name =  $arrfields[1]; 


    $data = array(
                    'br_code'           => $br_code,
                    'br_name'           => $br_name,
                   );

        //format values: %s as string; %d as integer
        $format = array(
            '%s', '%d'
          );
        $wpdb->insert( $tablename, $data, $format );

}

//do action when plugin active
register_activation_hook( __FILE__, 'sbl_employee_create_db' );
register_activation_hook( __FILE__, 'insert_brcode_name' );

1 个答案:

答案 0 :(得分:1)

insert_brcode_name()函数存在多个问题:

  • 假设文件已成功打开(通过fopen()),$file实际上是文件指针资源,而不是string。因此$arrfields = explode('|', $file);不起作用-它不会给您预期的结果(PHP会发出警告)。

  • 第二,$format应该是array( '%d', '%s' ),而不是array( '%s', '%d' ),因为在$data数组中,第一项是br_code(整数/ int),第二项是br_name(字符串/ varchar)。 所以 $format中的第一项是$data中的第一项; $format中的第二项是$data中的第二项;等等其他项目。

  • $tablename未定义;我认为是$wpdb->prefix . 'sbl_br_name'表。

这是insert_brcode_name() 没有上述问题:(经过测试并测试有效)

function insert_brcode_name(){
    $textCnt = plugin_dir_path( __FILE__ ) . "data.txt";
    $file = @fopen($textCnt, 'r');

    // Make sure that it's a valid file pointer resource.
    if ( ! $file ) {
        return false;
    }

    global $wpdb;
    $tablename = $wpdb->prefix . 'sbl_br_name';

    // Reads each line in the file.
    while ( ! feof( $file ) ) {
        $line = fgets( $file );
        $arrfields = explode('|', $line);

        // Ignores invalid entries..
        if ( count( $arrfields ) < 2 ) {
            continue;
        }

        $br_code = $arrfields[0];
        $br_name = $arrfields[1];
        //echo $br_code . '|' . $br_name . '<br>';

        $data = array(
            'br_code' => $br_code,
            'br_name' => $br_name,
        );

        //format values: %s as string; %d as integer
        $format = array(
            '%d', // Format of `br_code`
            '%s', // Format of `br_name`
        );

        $wpdb->insert( $tablename, $data, $format );
    }

    fclose( $file );
}

注意:为清楚起见,代码已重新缩进。除了主要的修复程序之外,还进行了一些较小的更改。