Create user login and registration functionality

This commit is contained in:
Flatlogic Bot 2025-09-16 20:53:40 +00:00
parent 4e77aa8f18
commit 4b959efca7
8 changed files with 377 additions and 38 deletions

20
agent.md Normal file
View File

@ -0,0 +1,20 @@
# Project Tasks
This file tracks the progress of the project.
## Completed
- [x] **Leaderboard UI**: Create a static, visually-styled leaderboard page with a podium for top players and a table for others.
- [x] **Member Profile Modal**: Display player profiles in a modal dialog instead of a separate page.
- [x] **Refine Profile Modal**: Update the profile modal to remove the bio and include `joined_date`, `matches_played`, `wins`, and `losses`.
- [x] **Implement Register/Login**: Build user registration and login functionality. This will be a prerequisite for features that require user authentication.
## In Progress
- [ ] **Training Game Interest Form**: Create a form for players to register their interest in training games. The form will allow users to look up their account with their phone number. If an account doesn't exist, submitting the form will create one.
## Backlog
- [ ] **Backend for Player Data**: Create a backend endpoint to serve the list of players, replacing the mock data in `index.php`.
- [ ] **Player Dashboard**: Build a personalized dashboard for logged-in players to see their own detailed stats, track progress over time, and manage their information.
- [ ] **Branded Landing Page**: Develop a more formal, public-facing homepage for the application that explains its purpose and value.

View File

@ -0,0 +1,29 @@
<?php
require_once __DIR__ . '/../config.php';
try {
$pdo = db();
$sql = "
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
phone_number VARCHAR(255) NOT NULL UNIQUE,
role ENUM('player', 'club_manager', 'admin') NOT NULL DEFAULT 'player',
rank INT,
points INT,
trend VARCHAR(50),
img VARCHAR(255),
position VARCHAR(255),
joined_date DATE,
matches_played INT,
wins INT,
losses INT,
`group` VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB;
";
$pdo->exec($sql);
echo "Table 'users' created successfully." . PHP_EOL;
} catch (PDOException $e) {
die("DB ERROR: " . $e->getMessage());
}

View File

@ -0,0 +1,49 @@
<?php
require_once __DIR__ . '/../config.php';
$players = [
['rank' => 1, 'name' => 'Alex Mercer', 'points' => 1500, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player1/100/100', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => '2020-12-01', 'matches_played' => 98, 'wins' => 70, 'losses' => 28],
['rank' => 2, 'name' => 'Samira Khan', 'points' => 1450, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player2/100/100', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => '2020-11-15', 'matches_played' => 102, 'wins' => 65, 'losses' => 37],
['rank' => 3, 'name' => 'Leo Martinez', 'points' => 1420, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player3/100/100', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => '2021-01-05', 'matches_played' => 95, 'wins' => 60, 'losses' => 35],
['rank' => 4, 'name' => 'Chloe Davis', 'points' => 1390, 'trend' => 'same', 'img' => 'https://picsum.photos/seed/player4/80/80', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => '2021-02-20', 'matches_played' => 90, 'wins' => 58, 'losses' => 32],
['rank' => 5, 'name' => 'Ben Carter', 'points' => 1350, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player5/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => '2021-03-10', 'matches_played' => 88, 'wins' => 55, 'losses' => 33],
['rank' => 6, 'name' => 'Eva Rostova', 'points' => 1310, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player6/80/80', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => '2021-04-01', 'matches_played' => 85, 'wins' => 52, 'losses' => 33],
['rank' => 7, 'name' => 'Daniel Park', 'points' => 1280, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player7/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => '2021-05-25', 'matches_played' => 82, 'wins' => 50, 'losses' => 32],
['rank' => 8, 'name' => 'Olivia Chen', 'points' => 1250, 'trend' => 'same', 'img' => 'https://picsum.photos/seed/player8/80/80', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => '2021-06-15', 'matches_played' => 80, 'wins' => 48, 'losses' => 32],
['rank' => 9, 'name' => 'Niko Bellic', 'points' => 1220, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player9/80/80', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => '2021-07-01', 'matches_played' => 78, 'wins' => 45, 'losses' => 33],
['rank' => 10, 'name' => 'Jasmine Kaur', 'points' => 1190, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player10/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => '2021-08-10', 'matches_played' => 75, 'wins' => 42, 'losses' => 33],
];
try {
$pdo = db();
$stmt = $pdo->prepare(
"INSERT INTO users (name, phone_number, role, rank, points, trend, img, position, joined_date, matches_played, wins, losses, `group`)
VALUES (:name, :phone_number, 'player', :rank, :points, :trend, :img, :position, :joined_date, :matches_played, :wins, :losses, :group)
ON DUPLICATE KEY UPDATE name=VALUES(name), points=VALUES(points), trend=VALUES(trend), img=VALUES(img), position=VALUES(position), joined_date=VALUES(joined_date), matches_played=VALUES(matches_played), wins=VALUES(wins), losses=VALUES(losses), `group`=VALUES(`group`);"
);
foreach ($players as $i => $player) {
// Assign a unique placeholder phone number
$phoneNumber = '+155501' . str_pad($i, 2, '0', STR_PAD_LEFT);
$stmt->execute([
':name' => $player['name'],
':phone_number' => $phoneNumber,
':rank' => $player['rank'],
':points' => $player['points'],
':trend' => $player['trend'],
':img' => $player['img'],
':position' => $player['position'],
':joined_date' => $player['joined_date'],
':matches_played' => $player['matches_played'],
':wins' => $player['wins'],
':losses' => $player['losses'],
':group' => $player['group']
]);
}
echo "Table 'users' seeded successfully." . PHP_EOL;
} catch (PDOException $e) {
die("DB ERROR: " . $e->getMessage());
}

View File

@ -0,0 +1,11 @@
<?php
require_once __DIR__ . '/../config.php';
try {
$pdo = db();
$sql = "ALTER TABLE users ADD COLUMN nickname VARCHAR(255) NULL AFTER name";
$pdo->exec($sql);
echo "Migration successful: 'nickname' column added to 'users' table." . PHP_EOL;
} catch (PDOException $e) {
die("Migration failed: " . $e->getMessage());
}

View File

@ -0,0 +1,11 @@
<?php
require_once __DIR__ . '/../../db/config.php';
try {
$pdo = db();
$sql = "ALTER TABLE users ADD COLUMN photo VARCHAR(255) DEFAULT NULL AFTER nickname";
$pdo->exec($sql);
echo "Migration successful: 'photo' column added to 'users' table." . PHP_EOL;
} catch (PDOException $e) {
die("Migration failed: " . $e->getMessage() . PHP_EOL);
}

101
index.php
View File

@ -1,17 +1,25 @@
<?php
session_start();
require_once 'db/config.php';
$current_user = $_SESSION['user'] ?? null;
try {
$pdo = db();
$stmt = $pdo->query("SELECT *, DATE_FORMAT(joined_date, '%M %e, %Y') as formatted_joined_date FROM users WHERE role = 'player' ORDER BY points DESC, name ASC");
$players = $stmt->fetchAll();
foreach ($players as $key => &$player) {
$player['rank'] = $key + 1;
}
unset($player);
} catch (PDOException $e) {
die("DB ERROR: " . $e->getMessage());
}
// --- Data Simulation ---
$players = [
['rank' => 1, 'name' => 'Alex Mercer', 'points' => 1500, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player1/100/100', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => 'December 1, 2020', 'matches_played' => 98, 'wins' => 70, 'losses' => 28],
['rank' => 2, 'name' => 'Samira Khan', 'points' => 1450, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player2/100/100', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => 'November 15, 2020', 'matches_played' => 102, 'wins' => 65, 'losses' => 37],
['rank' => 3, 'name' => 'Leo Martinez', 'points' => 1420, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player3/100/100', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => 'January 5, 2021', 'matches_played' => 95, 'wins' => 60, 'losses' => 35],
['rank' => 4, 'name' => 'Chloe Davis', 'points' => 1390, 'trend' => 'same', 'img' => 'https://picsum.photos/seed/player4/80/80', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => 'February 20, 2021', 'matches_played' => 90, 'wins' => 58, 'losses' => 32],
['rank' => 5, 'name' => 'Ben Carter', 'points' => 1350, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player5/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => 'March 10, 2021', 'matches_played' => 88, 'wins' => 55, 'losses' => 33],
['rank' => 6, 'name' => 'Eva Rostova', 'points' => 1310, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player6/80/80', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => 'April 1, 2021', 'matches_played' => 85, 'wins' => 52, 'losses' => 33],
['rank' => 7, 'name' => 'Daniel Park', 'points' => 1280, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player7/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => 'May 25, 2021', 'matches_played' => 82, 'wins' => 50, 'losses' => 32],
['rank' => 8, 'name' => 'Olivia Chen', 'points' => 1250, 'trend' => 'same', 'img' => 'https://picsum.photos/seed/player8/80/80', 'group' => 'B3SC Strikers', 'position' => 'Forward', 'joined_date' => 'June 15, 2021', 'matches_played' => 80, 'wins' => 48, 'losses' => 32],
['rank' => 9, 'name' => 'Niko Bellic', 'points' => 1220, 'trend' => 'down', 'img' => 'https://picsum.photos/seed/player9/80/80', 'group' => 'B3SC Defenders', 'position' => 'Defender', 'joined_date' => 'July 1, 2021', 'matches_played' => 78, 'wins' => 45, 'losses' => 33],
['rank' => 10, 'name' => 'Jasmine Kaur', 'points' => 1190, 'trend' => 'up', 'img' => 'https://picsum.photos/seed/player10/80/80', 'group' => 'B3SC Midfield', 'position' => 'Midfielder', 'joined_date' => 'August 10, 2021', 'matches_played' => 75, 'wins' => 42, 'losses' => 33],
];
$podium = array_slice($players, 0, 3);
$rest_of_players = array_slice($players, 3);
@ -55,6 +63,14 @@ function get_trend_icon_modal($trend) {
<div class="container my-5">
<header class="text-center mb-5">
<div class="d-flex justify-content-end mb-2">
<?php if ($current_user): ?>
<span class="navbar-text me-3">Welcome, <?php echo htmlspecialchars($current_user['name']); ?>!</span>
<a href="logout.php" class="btn btn-outline-secondary">Logout</a>
<?php else: ?>
<a href="login.php" class="btn btn-primary">Login / Register</a>
<?php endif; ?>
</div>
<h1 class="display-4 fw-bold leaderboard-header">B3SC Leaderboard</h1>
<p class="lead" style="color: #6E7191;">Season 1 - Premier Division</p>
</header>
@ -63,24 +79,28 @@ function get_trend_icon_modal($trend) {
<section class="podium mb-5">
<div class="row justify-content-center align-items-end">
<?php foreach ($podium as $index => $player): ?>
<?php
$player_photo = !empty($player['photo']) ? htmlspecialchars($player['photo']) : 'https://picsum.photos/seed/'.md5($player['name']).'/100/100';
?>
<div class="col-12 col-md-4 <?php echo $index == 0 ? 'order-md-2' : ($index == 1 ? 'order-md-1' : 'order-md-3'); ?> mb-4 mb-md-0">
<div class="podium-card rank-<?php echo $player['rank']; ?> text-center p-4"
data-bs-toggle="modal" data-bs-target="#profileModal"
data-player-name="<?php echo htmlspecialchars($player['name']); ?>"
data-player-img="<?php echo htmlspecialchars($player['img']); ?>"
data-player-rank="<?php echo $player['rank']; ?>"
data-player-points="<?php echo $player['points']; ?>"
data-player-trend="<?php echo $player['trend']; ?>"
data-player-position="<?php echo htmlspecialchars($player['position']); ?>"
data-player-joined="<?php echo htmlspecialchars($player['joined_date']); ?>"
data-player-matches="<?php echo $player['matches_played']; ?>"
data-player-wins="<?php echo $player['wins']; ?>"
data-player-losses="<?php echo $player['losses']; ?>"
data-player-nickname="<?php echo htmlspecialchars($player['nickname'] ?? '--'); ?>"
data-player-img="<?php echo $player_photo; ?>"
data-player-rank="<?php echo $player['rank'] ?? '--'; ?>"
data-player-points="<?php echo $player['points'] ?? 0; ?>"
data-player-trend="<?php echo $player['trend'] ?? 'same'; ?>"
data-player-position="<?php echo htmlspecialchars($player['position'] ?? '--'); ?>"
data-player-joined="<?php echo htmlspecialchars($player['formatted_joined_date'] ?? '--'); ?>"
data-player-matches="<?php echo $player['matches_played'] ?? 0; ?>"
data-player-wins="<?php echo $player['wins'] ?? 0; ?>"
data-player-losses="<?php echo $player['losses'] ?? 0; ?>"
style="cursor: pointer;">
<div class="podium-rank mb-3"><?php echo $player['rank']; ?></div>
<img src="<?php echo $player['img']; ?>" alt="B3SC #<?php echo $player['rank']; ?> ranked player" class="podium-img mb-3">
<div class="podium-rank mb-3"><?php echo $player['rank'] ?? '--'; ?></div>
<img src="<?php echo $player_photo; ?>" alt="B3SC #<?php echo $player['rank']; ?> ranked player" class="podium-img mb-3">
<div class="podium-name"><?php echo htmlspecialchars($player['name']); ?></div>
<div class="podium-points"><?php echo $player['points']; ?> PTS</div>
<div class="podium-points"><?php echo $player['points'] ?? 0; ?> PTS</div>
</div>
</div>
<?php endforeach; ?>
@ -101,22 +121,26 @@ function get_trend_icon_modal($trend) {
</thead>
<tbody>
<?php foreach ($rest_of_players as $player): ?>
<?php
$player_photo = !empty($player['photo']) ? htmlspecialchars($player['photo']) : 'https://picsum.photos/seed/'.md5($player['name']).'/80/80';
?>
<tr data-bs-toggle="modal" data-bs-target="#profileModal"
data-player-name="<?php echo htmlspecialchars($player['name']); ?>"
data-player-img="<?php echo htmlspecialchars($player['img']); ?>"
data-player-rank="<?php echo $player['rank']; ?>"
data-player-points="<?php echo $player['points']; ?>"
data-player-trend="<?php echo $player['trend']; ?>"
data-player-position="<?php echo htmlspecialchars($player['position']); ?>"
data-player-joined="<?php echo htmlspecialchars($player['joined_date']); ?>"
data-player-matches="<?php echo $player['matches_played']; ?>"
data-player-wins="<?php echo $player['wins']; ?>"
data-player-losses="<?php echo $player['losses']; ?>"
data-player-nickname="<?php echo htmlspecialchars($player['nickname'] ?? '--'); ?>"
data-player-img="<?php echo $player_photo; ?>"
data-player-rank="<?php echo $player['rank'] ?? '--'; ?>"
data-player-points="<?php echo $player['points'] ?? 0; ?>"
data-player-trend="<?php echo $player['trend'] ?? 'same'; ?>"
data-player-position="<?php echo htmlspecialchars($player['position'] ?? '--'); ?>"
data-player-joined="<?php echo htmlspecialchars($player['formatted_joined_date'] ?? '--'); ?>"
data-player-matches="<?php echo $player['matches_played'] ?? 0; ?>"
data-player-wins="<?php echo $player['wins'] ?? 0; ?>"
data-player-losses="<?php echo $player['losses'] ?? 0; ?>"
style="cursor: pointer;">
<th scope="row" class="align-middle"><?php echo $player['rank']; ?></th>
<th scope="row" class="align-middle"><?php echo $player['rank'] ?? '--'; ?></th>
<td class="align-middle player-name"><?php echo htmlspecialchars($player['name']); ?></td>
<td class="align-middle text-end fw-bold" style="color: #361C7A;"><?php echo $player['points']; ?></td>
<td class="align-middle text-center fs-5"><?php echo get_trend_icon($player['trend']); ?></td>
<td class="align-middle text-end fw-bold" style="color: #361C7A;"><?php echo $player['points'] ?? 0; ?></td>
<td class="align-middle text-center fs-5"><?php echo get_trend_icon($player['trend'] ?? 'same'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
@ -143,6 +167,7 @@ function get_trend_icon_modal($trend) {
const triggerElement = event.relatedTarget;
const name = triggerElement.getAttribute('data-player-name');
const nickname = triggerElement.getAttribute('data-player-nickname');
const img = triggerElement.getAttribute('data-player-img').replace('/100/100', '/150/150').replace('/80/80', '/150/150');
const rank = triggerElement.getAttribute('data-player-rank');
const points = triggerElement.getAttribute('data-player-points');
@ -153,6 +178,8 @@ function get_trend_icon_modal($trend) {
const wins = triggerElement.getAttribute('data-player-wins');
const losses = triggerElement.getAttribute('data-player-losses');
const displayName = (nickname && nickname !== '--') ? `${name} (${nickname})` : name;
function getTrendIconModal(trend) {
if (trend === 'up') {
return '<span class="trend-up"><i class="bi bi-arrow-up-right-circle-fill"></i></span>';
@ -169,7 +196,7 @@ function get_trend_icon_modal($trend) {
<div class="profile-header">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" style="position: absolute; top: 1rem; right: 1rem;"></button>
<img src="${img}" alt="${name}" class="profile-avatar">
<h1 class="profile-name">${name}</h1>
<h1 class="profile-name">${displayName}</h1>
<p class="profile-position">${position}</p>
<p class="profile-joined">Joined on ${joined}</p>
</div>

185
login.php Normal file
View File

@ -0,0 +1,185 @@
<?php
session_start();
require_once 'db/config.php';
$error = null;
$phone_number_for_registration = null;
// Handle Registration Submission
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['register'])) {
$phone_number = $_POST['phone_number'] ?? null;
$name = $_POST['name'] ?? null;
$nickname = $_POST['nickname'] ?? null;
$positions = $_POST['positions'] ?? ['Sub'];
$photo_path = null;
if (isset($_FILES['photo']) && $_FILES['photo']['error'] == 0) {
$target_dir = "assets/images/users/";
if (!is_dir($target_dir)) {
mkdir($target_dir, 0755, true);
}
$file_extension = pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION);
$safe_filename = preg_replace('/[^a-zA-Z0-9_.-]/', '_', basename($_FILES['photo']['name']));
$target_file = $target_dir . uniqid() . '-' . $safe_filename;
if (move_uploaded_file($_FILES['photo']['tmp_name'], $target_file)) {
$photo_path = $target_file;
}
}
if ($phone_number && $name && $positions) {
try {
$pdoconn = db();
$pdoconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$position_str = implode(', ', $positions);
$sql = "INSERT INTO users (phone_number, name, nickname, position, photo, joined_date, role) VALUES (:phone_number, :name, :nickname, :position, :photo, CURDATE(), 'player')";
$stmt = $pdoconn->prepare($sql);
$stmt->bindParam(':phone_number', $phone_number);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':nickname', $nickname);
$stmt->bindParam(':position', $position_str);
$stmt->bindParam(':photo', $photo_path);
$stmt->execute();
$user_id = $pdoconn->lastInsertId();
$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $pdoconn->prepare($sql);
$stmt->bindParam(':id', $user_id);
$stmt->execute();
$_SESSION['user'] = $stmt->fetch(PDO::FETCH_ASSOC);
header("Location: index.php");
exit();
} catch (PDOException $e) {
$error = "Database error during registration: " . $e->getMessage();
}
} else {
$error = "Please fill out all required fields.";
$phone_number_for_registration = $phone_number; // Keep phone number for the form
}
}
// Handle Phone Number Lookup
else if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['phone'])) {
$phone_number = $_POST['phone'];
try {
$pdoconn = db();
$pdoconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM users WHERE phone_number = :phone_number";
$stmt = $pdoconn->prepare($sql);
$stmt->bindParam(':phone_number', $phone_number);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
$_SESSION['user'] = $user;
header("Location: index.php");
exit();
} else {
// User not found, set phone number to show registration form
$phone_number_for_registration = $phone_number;
}
} catch (PDOException $e) {
$error = "Database error: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login / Register</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css">
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h3 class="card-title text-center mb-4">Login or Register</h3>
<?php if ($error): ?>
<div class="alert alert-danger"><?php echo htmlspecialchars($error); ?></div>
<?php endif; ?>
<?php if (!$phone_number_for_registration): ?>
<!-- Step 1: Phone Number Form -->
<form action="login.php" method="POST">
<div class="mb-3">
<label for="phone" class="form-label">Phone Number</label>
<input type="tel" class="form-control" id="phone" name="phone" required placeholder="Enter your phone number">
</div>
<button type="submit" class="btn btn-primary w-100">Continue</button>
</form>
<?php else: ?>
<!-- Step 2: Registration Form -->
<h4 class="text-center mb-3">Welcome! Let's get you set up.</h4>
<form action="login.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="register" value="1">
<input type="hidden" name="phone_number" value="<?php echo htmlspecialchars($phone_number_for_registration); ?>">
<div class="mb-3">
<label class="form-label">Phone Number</label>
<input type="text" class="form-control" value="<?php echo htmlspecialchars($phone_number_for_registration); ?>" disabled>
</div>
<div class="mb-3">
<label for="name" class="form-label">Full Name</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="mb-3">
<label for="nickname" class="form-label">Nickname (Optional)</label>
<input type="text" class="form-control" id="nickname" name="nickname">
</div>
<div class="mb-3">
<label class="form-label">Position(s)</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="positions[]" value="GK" id="pos_gk">
<label class="form-check-label" for="pos_gk">GK</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="positions[]" value="Defender" id="pos_def">
<label class="form-check-label" for="pos_def">Defender</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="positions[]" value="Midfield" id="pos_mid">
<label class="form-check-label" for="pos_mid">Midfield</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="positions[]" value="Forward" id="pos_fwd">
<label class="form-check-label" for="pos_fwd">Forward</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="positions[]" value="Sub" id="pos_sub" checked>
<label class="form-check-label" for="pos_sub">Sub</label>
</div>
</div>
<div class="mb-3">
<label for="photo" class="form-label">Photo (Optional)</label>
<input type="file" class="form-control" id="photo" name="photo" accept="image/*">
</div>
<button type="submit" class="btn btn-success w-100">Register</button>
</form>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

7
logout.php Normal file
View File

@ -0,0 +1,7 @@
<?php
session_start();
session_unset();
session_destroy();
header("Location: index.php");
exit();
?>