getConnection(); function jsonOut($success, $message = '', $extra = []) { if (ob_get_length()) ob_clean(); header('Content-Type: application/json; charset=utf-8'); echo json_encode(array_merge(['success' => $success, 'message' => $message], $extra)); exit; } $id = (int)($_POST['id'] ?? 0); $nome = trim($_POST['nome'] ?? ''); $cliente = trim($_POST['cliente'] ?? ''); $data = trim($_POST['data'] ?? ''); $removePhoto = ($_POST['remove_photo'] ?? '0') === '1'; if ($nome === '') { jsonOut(false, 'Il nome matrice è obbligatorio'); } $data = ($data !== '' && preg_match('/^\d{4}-\d{2}-\d{2}$/', $data)) ? $data : null; $cliente = $cliente !== '' ? $cliente : null; $photoDir = __DIR__ . '/photos/matrici/'; if (!is_dir($photoDir)) { mkdir($photoDir, 0775, true); } // Validazione file (se presente) $hasUpload = isset($_FILES['photo']) && $_FILES['photo']['error'] !== UPLOAD_ERR_NO_FILE; $ext = ''; if ($hasUpload) { if ($_FILES['photo']['error'] !== UPLOAD_ERR_OK) { jsonOut(false, 'Errore upload foto (codice ' . $_FILES['photo']['error'] . ')'); } if ($_FILES['photo']['size'] > 10 * 1024 * 1024) { jsonOut(false, 'La foto supera i 10 MB'); } $ext = strtolower(pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION)); if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp'], true)) { jsonOut(false, 'Formato foto non consentito (jpg, jpeg, png, gif, webp)'); } if (@getimagesize($_FILES['photo']['tmp_name']) === false) { jsonOut(false, 'Il file caricato non è un\'immagine valida'); } } try { $pdo->beginTransaction(); $oldPhoto = null; if ($id > 0) { $st = $pdo->prepare("SELECT photo FROM matrice WHERE id = ?"); $st->execute([$id]); $row = $st->fetch(PDO::FETCH_ASSOC); if (!$row) { $pdo->rollBack(); jsonOut(false, 'Matrice non trovata'); } $oldPhoto = $row['photo']; $st = $pdo->prepare("UPDATE matrice SET nome = ?, cliente = ?, data_produzione = ? WHERE id = ?"); $st->execute([$nome, $cliente, $data, $id]); } else { $st = $pdo->prepare("INSERT INTO matrice (nome, cliente, data_produzione) VALUES (?, ?, ?)"); $st->execute([$nome, $cliente, $data]); $id = (int)$pdo->lastInsertId(); } // Nuova foto if ($hasUpload) { $newName = 'matrice_' . $id . '_' . time() . '.' . $ext; if (!move_uploaded_file($_FILES['photo']['tmp_name'], $photoDir . $newName)) { $pdo->rollBack(); jsonOut(false, 'Impossibile salvare la foto sul server'); } $pdo->prepare("UPDATE matrice SET photo = ? WHERE id = ?")->execute([$newName, $id]); if ($oldPhoto && is_file($photoDir . basename($oldPhoto))) { @unlink($photoDir . basename($oldPhoto)); } } elseif ($removePhoto && $oldPhoto) { // Rimozione foto $pdo->prepare("UPDATE matrice SET photo = NULL WHERE id = ?")->execute([$id]); if (is_file($photoDir . basename($oldPhoto))) { @unlink($photoDir . basename($oldPhoto)); } } $pdo->commit(); jsonOut(true, 'Matrice salvata correttamente', ['id' => $id]); } catch (Throwable $e) { if ($pdo->inTransaction()) $pdo->rollBack(); jsonOut(false, 'Errore: ' . $e->getMessage()); }