Ниже приведен мой полный код:
Код: Выделить всё
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
Мобильная версия