【问题标题】:WordPress Insert Data from a text file to custom tableWordPress 将文本文件中的数据插入自定义表
【发布时间】:2018-07-03 21:49:33
【问题描述】:

我正在尝试使用插件激活挂钩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' );

【问题讨论】:

    标签: php wordpress


    【解决方案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 );
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2014-08-13
      • 2012-12-17
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多