5) { $_SESSION['error_message'] = "Invalid data provided. Please try again."; header("Location: leave_review.php?order_id=" . $order_id); exit(); } // 2. Security and integrity validation $stmt = $db->prepare("SELECT id, status FROM orders WHERE id = ? AND user_id = ? AND restaurant_id = ?"); $stmt->execute([$order_id, $user_id, $restaurant_id]); $order = $stmt->fetch(); if (!$order) { $_SESSION['error_message'] = "You cannot review this order."; header("Location: order_history.php"); exit(); } elseif ($order['status'] !== 'Delivered') { $_SESSION['error_message'] = "You can only review delivered orders."; header("Location: leave_review.php?order_id=" . $order_id); exit(); } // 3. Check if a review already exists $stmt_rating = $db->prepare("SELECT id FROM ratings WHERE order_id = ?"); $stmt_rating->execute([$order_id]); if ($stmt_rating->fetch()) { $_SESSION['error_message'] = "You have already reviewed this order."; header("Location: order_history.php"); exit(); } // --- All checks passed, insert into database --- try { $stmt_insert = $db->prepare( "INSERT INTO ratings (order_id, restaurant_id, user_id, rating, review) VALUES (?, ?, ?, ?, ?)" ); $stmt_insert->execute([$order_id, $restaurant_id, $user_id, $rating, $review]); $_SESSION['success_message'] = "Thank you for your review!"; header("Location: order_history.php"); exit(); } catch (PDOException $e) { // Log error properly in a real application // error_log($e->getMessage()); $_SESSION['error_message'] = "A database error occurred. Please try again later."; header("Location: leave_review.php?order_id=" . $order_id); exit(); }