我有一个将数据插入自定义Wordpress数据库表的功能。当该功能需要处理更多数据时,它会创建重复的条目。
我在函数中进行了检查,以检查数据库中是否存在该条目的数据。如果没有结果,则使用$wpdb->insert
。如果结果确实存在,则将现有数据与新数据进行比较。如果数据相同,则continue
到下一次迭代。如果它们不同,则使用$wpdb->update
。
我尝试在循环中放置一个sleep(1)
,这似乎给了函数足够的时间来更准确地进行数据库检查,但同时也给了我超时问题,我认为这不是理想的解决方法。
注意,我正在使用init
钩子运行此代码。
function insert_data( $data ){
global $wpdb;
foreach ( $data as $k => $d ){
$table = 'wp_sales_monthly';
$where = "year = '" . $d['year'] . "' AND month = '" . $d['month'] . "' AND who = '" . $k . "'";
$sql = "
SELECT *
FROM " . $table . "
WHERE " . $where . "
ORDER BY 'meta_id'";
$results = $wpdb->get_results( $sql, ARRAY_A );
if ($results) {
$last_entry = end($results);
unset($last_entry['meta_id']);
ksort($last_entry);
// Adjust input array
$d['who'] = $k;
ksort($d);
$d = array_map('strval', $d);
// If last database entry is the same as this new data, skip this item and continue to the next.
if ($last_entry == $d) { // Intentionally equal to, not identical to.
continue;
}
}
$columns = array(
'year' => $d['year'],
'month' => $d['month'],
'who' => $k,
'leads_processing' => $d['leads_processing'],
'leads_processing_target' => $d['leads_processing_target'],
'leads_closed' => $d['leads_closed'],
'leads_closed_target' => $d['leads_closed_target'],
'turnover' => $d['turnover'],
'turnover_target' => $d['turnover_target'],
'profit' => $d['solar_profit'],
'profit_target' => $d['profit_target'],
'margin' => $d['margin'],
'margin_target' => $d['margin_target'],
);
$columns_where = array('year' => $d['year'], 'month' => $d['month'], 'who' => $k );
if ( $results ){
// Update Data
$updated = $wpdb->update(
$table,
$columns,
$columns_where
);
// Else insert new data.
} else {
$inserted = $wpdb->insert(
$table,
$columns
);
}
// sleep(1);
}
}