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' );
解决方案
该功能有几个问题insert_brcode_name()
:
假设文件已成功打开(通过
fopen()
),$file
实际上是文件指针资源而不是string
. 所以$arrfields = explode('|', $file);
行不通——它不会给你预期的结果(并且 PHP 会抛出一个警告)。其次,
$format
should bearray( '%d', '%s' )
和 notarray( '%s', '%d' )
,因为在$data
数组中,第一项是br_code
(integer/int
),第二项是br_name
(string/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 );
}
注意:为清楚起见,代码重新缩进。除了主要修复之外,还有一些小的变化。
推荐阅读
- php - 下面 curl 命令的 php curl 版本是什么
- javascript - ngFor 与 Pagination 一起使用时的索引问题
- php - 如何在wordpress中始终在顶部(常规帖子之前)显示粘性帖子?
- algorithm - 尽快评估多变量递归关系
- javascript - 为什么我的函数没有从 fetch 中获取结果?
- c# - 如何使用windows窗体c#删除文件
- html - 如何使此图像位于文本下方?
- daml - 行使选择权时如何获取当前的合约ID
- google-cloud-storage - Google Cloud Storage 库中的更新
- usb - 如何在新的 USB 设备上创建和加载设备描述符以便 Windows 识别它?