Я хочу вставить в базу данных содержимое файла XLSX. Файл анализируется с помощью синтаксического анализатора simple-xlsx (https://www.phpclasses.org/package/6279-PHP-Parse-and-retrieve-data-from-Excel-XLS-files.html), который отлично работает.
У меня есть следующая структура с точки зрения листов и столбцов.
СЕРИАЛЬНЫЕ
серийный номер артикула
FILES
partnumber, ручной, бом, тув
Итак, в моей базе данных у меня будут следующие столбцы:
ID, серийный номер, номер детали, инструкция, Bom, Tuv
У меня около 88 тыс. Строк на листе с сериалами и ~ 1,5 тыс. На листе с файлами. Серийные номера - это уникальные номера, но номера могут принадлежать нескольким серийным номерам, и на этом этапе я теряюсь.
Пример:
serial 1, partnumber 10, manual 10.pdf, bom 10.pdf, tuv 10.pdf
serial 2, partnumber 10, manual 10.pdf, bom 10.pdf, tuv 10.pdf
serial 3, partnumber 10, manual 10.pdf, bom 10.pdf, tuv 10.pdf
serial 4, partnumber 11, manual 11.pdf, bom 11.pdf, tuv 11.pdf
serial 5, partnumber 11, manual 11.pdf, bom 11.pdf, tuv 11.pdf
Текущий код, который, как мне кажется, является полным беспорядком, и я заблудился ...
public function prepare_xlsx_to_db( $serials, $files, $break ) {
global $wpdb;
$response = array();
$insert_string = array();
$temp_string = array();
$current_block = 0;
$total_serials = count( $serials );
$wp_table_name = $wpdb->prefix . 'ga_serials';
foreach ( $serials as $key => $serial ) {
if ( $key === 0 ) continue; // Skipping the first row.
$temp_string[$key] = array(
'serial' => $serial[0],
'partnumber' => $files[array_search($serial[1],array_column($files,0),true)][0],
'manual' => $files[array_search($serial[1],array_column($files,0),true)][1],
'bom' => $files[array_search($serial[1],array_column($files,0),true)][2],
'tuv' => $files[array_search($serial[1],array_column($files,0),true)][3]
);
}
foreach ( $temp_string as $key => $row ) {
if ( $key === 0 ) continue; // Skipping the first row.
$insert_string[] = $wpdb->prepare( "(%s,%s,%s,%s,%s)", $row['serial'], $row['partnumber'], $row['manual'], $row['bom'], $row['tuv'] );
if ( $current_block == $break || $key == $total_serials - 1 ) {
$query = "INSERT INTO {$wp_table_name} (serial, partnumber, manual, bom, tuv) VALUES ";
$query .= implode( ",\n", $insert_string );
if ( $wpdb->query( $wpdb->prepare( $query, $insert_string ) ) ) {
$response[ 'success' ] = 'true';
$response[ 'msg' ] = "File imported succesfully into the database.";
} else {
$response[ 'success' ] = 'false';
$response[ 'msg' ] = 'bla';
}
$current_block = 0;
unset( $insert_string );
} else {
$current_block++;
}
}
return json_encode( $response );
}
В базе данных я нахожу перезаписанные строки. Что я делаю не так?