Вставка данных PHP MySQL из Excel не выполняется должным образомPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Вставка данных PHP MySQL из Excel не выполняется должным образом

Сообщение Anonymous »

У меня есть сценарий PHP, который считывает данные из файла Excel и вставляет их в базу данных MySQL. Скрипт корректно считывает данные и без проблем выполняет первоначальную вставку в таблицу tb_konsultasi. Однако последующая вставка в таблицу tb_detailrusak на основе условий данных Excel не выполняется должным образом.
Ниже приведен мой полный код:

Код: Выделить всё

require_once 'includes/connect.php';
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Reader\Xlsx;

// Mengaktifkan pelaporan error
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

function log_and_echo_error($message) {
error_log($message);
echo $message . "
";
}

if (!empty($_FILES['file']['name'])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);

if (!is_dir($target_dir)) {
mkdir($target_dir, 0777, true);
}

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
$reader = new Xlsx();
try {
$spreadsheet = $reader->load($target_file);
} catch (Exception $e) {
log_and_echo_error("Error loading spreadsheet: " . $e->getMessage());
die("Error loading spreadsheet");
}
$sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);

$koneksi = new mysqli(DATABASE_HOST, DATABASE_USER, DATABASE_PASS, DATABASE_NAME);
if ($koneksi->connect_error) {
log_and_echo_error("Connection failed: " . $koneksi->connect_error);
die("Connection failed: " . $koneksi->connect_error);
}

$header = $sheetData[1]; // Simpan header untuk referensi nama atribut
foreach ($sheetData as $index => $row) {
if ($index === 1) continue; // skip header row

if (!empty(array_filter($row))) {
$tanggal_raw = $row['A'];
$nama_perangkat = $row['B'];
$nama_pelanggan = $row['C'];
$kerusakan = $row['AM']; // Column containing kerusakan information

// Konversi format tanggal ke YYYY-MM-DD
$tanggal = date('Y-m-d', strtotime(str_replace('/', '-', $tanggal_raw)));

// Simpan data konsultasi
$stmt_konsultasi = $koneksi->prepare("INSERT INTO tb_konsultasi (tanggal, nama_perangkat, nama_pelanggan, hasil_kerusakan) VALUES (?, ?, ?, ?)");
if (!$stmt_konsultasi) {
log_and_echo_error("Prepare failed for konsultasi: " . $koneksi->error);
continue;
}
$stmt_konsultasi->bind_param("ssss", $tanggal, $nama_perangkat, $nama_pelanggan, $kerusakan);
if (!$stmt_konsultasi->execute()) {
log_and_echo_error("Execute failed for konsultasi: " . $stmt_konsultasi->error);
continue;
}
$id_konsultasi = $stmt_konsultasi->insert_id;
$stmt_konsultasi->close();

// Simpan detail kerusakan berdasarkan gejala
foreach ($row as $key => $value) {
if ($key > 'C' && $key < 'AK' && $value == 'Ya') {
$nama_atribut = $header[$key]; // Ambil nama atribut dari header
$stmt_atribut = $koneksi->prepare("SELECT id_atribut FROM tb_atribut WHERE nama_atribut = ?");
if (!$stmt_atribut) {
log_and_echo_error("Prepare failed for atribut: " . $koneksi->error);
continue;
}
$stmt_atribut->bind_param("s", $nama_atribut);
if (!$stmt_atribut->execute()) {
log_and_echo_error("Execute failed for atribut: " .  $stmt_atribut->error);
continue;
}
$result_atribut = $stmt_atribut->get_result();
if ($result_atribut->num_rows > 0) {
$atribut = $result_atribut->fetch_assoc();
$id_atribut = $atribut['id_atribut'];
$stmt_detail = $koneksi->prepare("INSERT INTO tb_detailrusak (id_konsultasi, id_atribut) VALUES (?, ?)");
if (!$stmt_detail) {
log_and_echo_error("Prepare failed for detailrusak: " . $koneksi->error);
continue;
}
$stmt_detail->bind_param("ii", $id_konsultasi, $id_atribut);
if (!$stmt_detail->execute()) {
log_and_echo_error("Execute failed for detailrusak: " . $stmt_detail->error);
continue;
}
$stmt_detail->close();
} else {
log_and_echo_error("Atribut not found: " . $nama_atribut);
}
$stmt_atribut->close();
}
}
}
}
$koneksi->close();
echo json_encode(array(
'status' => 'Success',
'message' => 'Data berhasil diimpor!'
));
} else {
log_and_echo_error("Failed to move uploaded file.");
echo json_encode(array(
'status' => 'Error',
'message' => 'Failed to move uploaded file.'
));
}
} else {
log_and_echo_error("No file selected.");
echo json_encode(array(
'status' => 'Error',
'message' => 'No file selected'
));
}
Проблемы:
Первоначальная вставка в tb_konsultasi работает нормально.
Последующая вставка в tb_detailrusak на основе определенные условия не работают должным образом.
**Что я пробовал:
**
Добавлено ведение журнала ошибок и операторы echo для устранения проблемы.
Проверено, что условия для вставки в tb_detailrusak соблюдены.
Убедено, что соединение с базой данных успешно и первоначальная вставка в tb_konsultasi работает.
Проверено. если tb_atribut содержит соответствующие данные для nama_atribut.
Схема базы данных:
tb_konsultasi: id_konsultasi (AUTO_INCREMENT, PRIMARY KEY) , tanggal, nama_perangkat, nama_pelanggan, hasil_kerusakan
tb_detailrusak: id_detailrusak (AUTO_INCREMENT, ПЕРВИЧНЫЙ КЛЮЧ), id_konsultasi, id_atribut
tb_atribut: id_atribut (AUTO_INCREMENT, ПЕРВИЧНЫЙ КЛЮЧ), nama_atribut
Вопросы
Почему вставка в tb_detailrusak не выполняется должным образом, даже если условия соблюдены?
Есть ли какие-либо улучшения или шаги по отладке, которые я могу предпринять? может быть не хватает для решения этой проблемы?
Будем очень признательны за любую помощь или информацию!

Подробнее здесь: https://stackoverflow.com/questions/785 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»