����JFIF��`�`�����prepare("INSERT INTO bikes (reference_id, model_name, price, year, km_driven, location, map_url, status, colour, engine_capacity, insurance_status, ownership, engine_condition, tyres_condition, brakes_condition, battery_condition, suspension_condition, fuel_tank_capacity, insurance_valid_upto, rc_status, rto_code) VALUES (?, ?, ?, ?, ?, ?, ?, 'available', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$reference_id, $model_name, $price, $year, $km_driven, $location, $map_url, $colour, $engine_capacity, $insurance_status, $ownership, $engine_condition, $tyres_condition, $brakes_condition, $battery_condition, $suspension_condition, $fuel_tank_capacity, $insurance_valid_upto, $rc_status, $rto_code]); $bike_id = $pdo->lastInsertId(); // Handle image upload if (!empty($_FILES['main_image']['name'])) { $uploadDir = '../assets/uploads/bikes/' . $bike_id . '/'; if (!file_exists($uploadDir)) { mkdir($uploadDir, 0777, true); } $fileName = basename($_FILES['main_image']['name']); $targetPath = $uploadDir . $fileName; if (move_uploaded_file($_FILES['main_image']['tmp_name'], $targetPath)) { $dbPath = 'assets/uploads/bikes/' . $bike_id . '/' . $fileName; $imgStmt = $pdo->prepare("INSERT INTO bike_images (bike_id, image_url, is_main) VALUES (?, ?, TRUE)"); $imgStmt->execute([$bike_id, $dbPath]); } } if (!empty($_FILES['gallery_images']['name'][0])) { foreach ($_FILES['gallery_images']['name'] as $key => $name) { if ($_FILES['gallery_images']['error'][$key] == UPLOAD_ERR_OK) { $fileName = uniqid() . '_' . basename($name); $targetPath = $uploadDir . $fileName; if (move_uploaded_file($_FILES['gallery_images']['tmp_name'][$key], $targetPath)) { $dbPath = 'assets/uploads/bikes/' . $bike_id . '/' . $fileName; $imgStmt = $pdo->prepare("INSERT INTO bike_images (bike_id, image_url, is_main) VALUES (?, ?, FALSE)"); $imgStmt->execute([$bike_id, $dbPath]); } } } } if (!empty($_FILES['video']['name'])) { $fileName = uniqid() . '_' . basename($_FILES['video']['name']); $targetPath = $uploadDir . $fileName; if (move_uploaded_file($_FILES['video']['tmp_name'], $targetPath)) { $dbPath = 'assets/uploads/bikes/' . $bike_id . '/' . $fileName; $vidStmt = $pdo->prepare("INSERT INTO bike_videos (bike_id, video_url) VALUES (?, ?)"); $vidStmt->execute([$bike_id, $dbPath]); } } if (!empty($_FILES['zip_360']['name'])) { $zipPath = $_FILES['zip_360']['tmp_name']; $zip = new ZipArchive; if ($zip->open($zipPath) === TRUE) { $three60Dir = $uploadDir . '360/'; if (!file_exists($three60Dir)) mkdir($three60Dir, 0777, true); // Extract to a temporary directory first $tempExtractDir = $three60Dir . 'temp_extract/'; if (!file_exists($tempExtractDir)) mkdir($tempExtractDir, 0777, true); $zip->extractTo($tempExtractDir); $zip->close(); // Recursively find all images $images = []; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tempExtractDir)); foreach ($iterator as $file) { if ($file->isFile()) { $ext = strtolower($file->getExtension()); if (in_array($ext, ['jpg', 'jpeg', 'png', 'webp'])) { $images[] = $file->getPathname(); } } } natsort($images); $frameCount = count($images); if($frameCount > 0) { $sequence = 1; foreach($images as $oldPath) { $ext = strtolower(pathinfo($oldPath, PATHINFO_EXTENSION)); $newPath = $three60Dir . $sequence . '.' . $ext; rename($oldPath, $newPath); $sequence++; } $dbFolderPath = 'assets/uploads/bikes/' . $bike_id . '/360/'; $stmt360 = $pdo->prepare("INSERT INTO bike_360_images (bike_id, folder_path, frame_count) VALUES (?, ?, ?)"); $stmt360->execute([$bike_id, $dbFolderPath, $frameCount]); } // Cleanup temp dir $rmIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tempExtractDir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST); foreach ($rmIterator as $file) { $file->isDir() ? rmdir($file->getPathname()) : unlink($file->getPathname()); } rmdir($tempExtractDir); } } redirect('manage_bikes.php'); } catch (\PDOException $e) { $error = "Error saving bike: " . $e->getMessage(); } } ?> Add Bike - ReOwn Admin

Add New Bike

Back

Bike Specifications

150-Point Inspection Report

Media & Files