| Server IP : 173.209.174.21 / Your IP : 216.73.216.89 Web Server : Apache/2.4.58 (Ubuntu) System : Linux wcfs-server 6.8.0-124-generic #124-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 13:00:45 UTC 2026 x86_64 User : nodor ( 1000) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/thelittlebigshow/app/ |
Upload File : |
<?php
session_start();
include_once("db.php");
include_once("voting_helpers.php");
function public_town_only($address) {
$address = trim((string) $address);
if ($address === '') {
return 'Not listed';
}
if (strpos($address, ',') !== false) {
$address = trim(explode(',', $address)[0]);
}
if (preg_match('/\d/', $address)) {
return 'Not listed';
}
return $address;
}
$scoreOptions = [
'fit_finish' => 'Fit and Finish',
'paint' => 'Paint',
'interior' => 'Interior',
'overall_look' => 'Overall Look',
'stance' => 'Stance',
'engine_bay' => 'Engine Bay',
'wheels_tires' => 'Wheels and Tires',
'cleanliness_detail' => 'Cleanliness and Detail',
];
function ensureVoteScoreColumns($conn)
{
$columns = [];
$result = mysqli_query($conn, "SHOW COLUMNS FROM `vote`");
if (!$result) {
return false;
}
while ($row = mysqli_fetch_assoc($result)) {
$columns[$row['Field']] = true;
}
$neededColumns = [
'fit_finish' => "TINYINT UNSIGNED DEFAULT NULL",
'paint' => "TINYINT UNSIGNED DEFAULT NULL",
'interior' => "TINYINT UNSIGNED DEFAULT NULL",
'overall_look' => "TINYINT UNSIGNED DEFAULT NULL",
'stance' => "TINYINT UNSIGNED DEFAULT NULL",
'engine_bay' => "TINYINT UNSIGNED DEFAULT NULL",
'wheels_tires' => "TINYINT UNSIGNED DEFAULT NULL",
'cleanliness_detail' => "TINYINT UNSIGNED DEFAULT NULL",
'total_score' => "SMALLINT UNSIGNED DEFAULT NULL",
'judge_notes' => "TEXT NULL",
'created_at' => "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP",
];
foreach ($neededColumns as $column => $definition) {
if (!isset($columns[$column])) {
$sql = "ALTER TABLE `vote` ADD COLUMN `$column` $definition";
if (!mysqli_query($conn, $sql)) {
return false;
}
}
}
return true;
}
$settingSql = "SELECT * FROM `settings` WHERE id = 1";
$settingQuery = mysqli_query($conn, $settingSql);
$setting = mysqli_fetch_assoc($settingQuery);
$votingSettings = getVotingSettings($conn);
$vehicle = null;
$vehicleId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$judgeCookieName = $vehicleId ? "judged_" . $vehicleId : "";
$hasJudgedVehicle = $judgeCookieName !== "" && isset($_COOKIE[$judgeCookieName]);
$adminOverride = isset($_GET['override']) && $_GET['override'] === '1' && isset($_SESSION['user_logged_in']) && $_SESSION['user_logged_in'] == true;
$votingClosed = isVotingClosed($votingSettings);
$allowUnscoredOverride = $adminOverride && !empty($votingSettings['allow_unscored_after_close']);
$vehicleScoreCount = 0;
$closedOverridePassword = trim($votingSettings['closed_override_password'] ?? '');
$closedOverrideInput = trim($_POST['closed_override_password'] ?? '');
$hasClosedPasswordOverride = $votingClosed && $closedOverridePassword !== '' && hash_equals($closedOverridePassword, $closedOverrideInput);
if ($vehicleId) {
$vehicleStmt = mysqli_prepare($conn, "SELECT * FROM vehicles WHERE id = ?");
mysqli_stmt_bind_param($vehicleStmt, "i", $vehicleId);
mysqli_stmt_execute($vehicleStmt);
$vehicleResult = mysqli_stmt_get_result($vehicleStmt);
$vehicle = mysqli_fetch_assoc($vehicleResult);
$scoreCountStmt = mysqli_prepare($conn, "SELECT COUNT(*) AS score_count FROM vote WHERE vehicle_id = ?");
mysqli_stmt_bind_param($scoreCountStmt, "i", $vehicleId);
mysqli_stmt_execute($scoreCountStmt);
$scoreCountResult = mysqli_stmt_get_result($scoreCountStmt);
$scoreCountRow = mysqli_fetch_assoc($scoreCountResult);
$vehicleScoreCount = (int) ($scoreCountRow['score_count'] ?? 0);
}
if ($vehicle && $_SERVER['REQUEST_METHOD'] === 'POST') {
if ($votingClosed && !$hasClosedPasswordOverride && !($allowUnscoredOverride && $vehicleScoreCount === 0)) {
$_SESSION['err'] = "Voting is closed. Enter the admin override password to submit this score.";
} elseif (!$adminOverride && $hasJudgedVehicle) {
$_SESSION['err'] = "You have already scored this vehicle.";
} elseif (!ensureVoteScoreColumns($conn)) {
$_SESSION['err'] = "The scoring fields could not be prepared. Please contact an admin.";
} else {
$notes = trim($_POST["judge_notes"] ?? '');
$scores = [];
$totalScore = 0;
foreach ($scoreOptions as $field => $label) {
$score = filter_input(INPUT_POST, $field, FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 10],
]);
if ($score === false || $score === null) {
$_SESSION['err'] = "Please score every category from 1 to 10.";
break;
}
$scores[$field] = $score;
$totalScore += $score;
}
if (!isset($_SESSION['err'])) {
$newVoteCount = (int) $vehicle['vote_status'] + 1;
$updateStmt = mysqli_prepare($conn, "UPDATE vehicles SET vote_status = ? WHERE id = ?");
mysqli_stmt_bind_param($updateStmt, "ii", $newVoteCount, $vehicleId);
mysqli_stmt_execute($updateStmt);
$voteMarker = "judge_cookie";
$voteInsertStmt = mysqli_prepare(
$conn,
"INSERT INTO vote
(vehicle_id, password, fit_finish, paint, interior, overall_look, stance, engine_bay, wheels_tires, cleanliness_detail, total_score, judge_notes)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
);
mysqli_stmt_bind_param(
$voteInsertStmt,
"isiiiiiiiiis",
$vehicleId,
$voteMarker,
$scores['fit_finish'],
$scores['paint'],
$scores['interior'],
$scores['overall_look'],
$scores['stance'],
$scores['engine_bay'],
$scores['wheels_tires'],
$scores['cleanliness_detail'],
$totalScore,
$notes
);
mysqli_stmt_execute($voteInsertStmt);
setcookie($judgeCookieName, "1", time() + (86400 * 365), "/");
$_SESSION['msg'] = "Scores submitted. Total score: " . $totalScore . " out of 80.";
header("Location: vote.php?id=" . $vehicleId);
exit;
}
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vehicle Scoring</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="style.css">
<style>
body {
height: auto !important;
min-height: 100vh;
}
.main {
margin-top: 40px;
margin-bottom: 40px;
padding-bottom: 32px;
}
.vehicle-summary {
color: #fff;
font-size: 18px;
}
.score-card {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(206, 126, 0, 0.45);
border-radius: 8px;
margin-bottom: 16px;
padding: 14px;
}
.score-title {
color: #CE7E00;
font-weight: 700;
margin-bottom: 10px;
}
.score-options {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 8px;
}
.score-options input {
position: absolute;
opacity: 0;
}
.score-options label {
align-items: center;
background: #fff;
border: 2px solid transparent;
border-radius: 6px;
color: #111;
cursor: pointer;
display: flex;
font-size: 16px;
height: 42px;
justify-content: center;
margin: 0 !important;
}
.score-options input:checked + label {
background: #CE7E00;
border-color: #fff;
color: #000;
}
textarea.form-control {
min-height: 95px;
}
.btn-warning {
color: #000;
font-weight: 700;
min-height: 48px;
width: 100%;
}
@media screen and (max-width: 550px) {
.main {
margin-top: 24px;
}
h1 {
font-size: 28px !important;
}
}
</style>
</head>
<body>
<?php if ($vehicle) { ?>
<div class="container">
<div class="main">
<h1 class="text-center">Vehicle Scoring</h1>
<div class="text-center mb-4">
<img src="./admin/assets/upload/<?php echo htmlspecialchars($setting['logo'] ?? '', ENT_QUOTES); ?>" alt="" class="card-img-top" style="width:180px; height:180px; margin:auto;">
<p class="vehicle-summary mt-3 mb-0">
#<?php echo htmlspecialchars($vehicle['id'], ENT_QUOTES); ?>
<?php echo htmlspecialchars($vehicle['vehicle_year'] . " " . $vehicle['vehicle_maker'] . " " . $vehicle['vehicle_model'], ENT_QUOTES); ?>
</p>
<p class="vehicle-summary mb-0">
<?php echo htmlspecialchars($vehicle['category'] ?? '', ENT_QUOTES); ?>
</p>
<p class="vehicle-summary mb-0">
Town: <?php echo htmlspecialchars(public_town_only($vehicle['address'] ?? ''), ENT_QUOTES); ?>
</p>
</div>
<div class="row">
<div class="col-md-8 offset-md-2">
<?php if (isset($_SESSION['msg'])) { ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo htmlspecialchars($_SESSION['msg'], ENT_QUOTES); ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php unset($_SESSION["msg"]); ?>
<?php } ?>
<?php if (isset($_SESSION['err'])) { ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo htmlspecialchars($_SESSION['err'], ENT_QUOTES); ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php unset($_SESSION["err"]); ?>
<?php } ?>
<?php if (!$adminOverride && $hasJudgedVehicle) { ?>
<p class="text-danger text-center mt-2">You have already scored this vehicle.</p>
<?php } else { ?>
<form action="" method="POST">
<?php if ($votingClosed && !($allowUnscoredOverride && $vehicleScoreCount === 0)) { ?>
<div class="alert alert-warning text-center" role="alert">
Voting is closed<?php echo formatVotingCloseTime($votingSettings) ? " as of " . htmlspecialchars(formatVotingCloseTime($votingSettings), ENT_QUOTES) : ""; ?>. Admin override is required.
</div>
<div class="form-group">
<label for="closed_override_password">Admin Override Password</label>
<input type="password" class="form-control" id="closed_override_password" name="closed_override_password" required placeholder="Enter override password">
</div>
<?php } ?>
<?php foreach ($scoreOptions as $field => $label) { ?>
<div class="score-card">
<div class="score-title"><?php echo htmlspecialchars($label, ENT_QUOTES); ?></div>
<div class="score-options">
<?php for ($score = 1; $score <= 10; $score++) { ?>
<?php $inputId = $field . "_" . $score; ?>
<input type="radio" id="<?php echo $inputId; ?>" name="<?php echo $field; ?>" value="<?php echo $score; ?>" required>
<label for="<?php echo $inputId; ?>"><?php echo $score; ?></label>
<?php } ?>
</div>
</div>
<?php } ?>
<div class="form-group">
<label for="judge_notes">Notes</label>
<textarea class="form-control" id="judge_notes" name="judge_notes" placeholder="Optional judge notes"></textarea>
</div>
<button type="submit" name="vote" class="btn btn-warning">Submit Scores</button>
</form>
<?php } ?>
</div>
</div>
</div>
</div>
<?php } else { ?>
<div class="text-center mt-5">
<p>NO DATA FOUND!!!!</p>
<a href="index.php" class="btn btn-info">Go To Home</a>
</div>
<?php } ?>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>