Ajouter des voitures avec PHP et MySQL
Ajouter des voitures avec PHP et MySQL
php :
<?php
$servername = "localhost"; // L’adresse de votre serveur de base de don
nées (sur votre ordinateur)
$username = "root"; // Le nom d’utilisateur par défaut de MySQL a
vec XAMPP
$password = ""; // Le mot de passe par défaut de MySQL avec X
AMPP (vide)
$dbname = "Jxker"; // Le nom de la base de données que vous avez
créée
Try {
// Tente de se connecter à la base de données
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,
$password);
// Définit le mode d’erreur de PDO sur Exception (pour une meilleur
e gestion des erreurs)
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// echo “Connexion réussie”; // Vous pouvez décommenter ceci pour t
ester la connexion une fois
} catch(PDOException $e) {
// En cas d’échec de connexion, affiche un message d’erreur
Echo "Connexion échouée: " . $e->getMessage();
}
?>
[Link] :
<?php
Include '[Link]'; // Inclut le fichier de connexion à la base de do
nnées
$marque_val = '';
$email_val = '';
$annee_val = '';
$kilometrage_val = '';
$prix_val = '';
$photo_src = ''; // Initialisation de photo_src à vide par défaut
$uploadOk = 1; // Variable pour vérifier si l'upload de la photo est OK
$photo_uploaded_successfully = false; // Initialisation de la variable
à false
$form_submission_success = false; // Nouvelle variable pour suivre le s
uccès global de l'enregistrement
} else {
// Si échec, les champs du formulaire conservent les valeurs sa
isies par l'utilisateur
// Et la partie droite reste vide ou affiche l'état avant la te
ntative
$marque_val_display = '';
$email_val_display = '';
$annee_val_display = '';
$kilometrage_val_display = '';
$prix_val_display = '';
$photo_src_display = ''; // Pas d'aperçu pour l'affichage si éc
hec
}
} else {
// Premier chargement de la page (pas de soumission de formulaire)
// Les variables d'affichage restent vides
$marque_val_display = '';
$email_val_display = '';
$annee_val_display = '';
$kilometrage_val_display = '';
$prix_val_display = '';
$photo_src_display = '';
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Ajouter des voitures – [Link]</title>
<link rel="stylesheet" href="[Link]">
<link rel="stylesheet" href="asset/frontawesome/css/[Link]">
</head>
<body>
<div class="container">
<div class="sidebar">
<div class="logo">[Link]</div>
<ul>
<li><a href="[Link]"><i class="fas fa-tachometer-
alt"></i>Tableau de bord</a></li>
<li class="active">Ajouter des voitures</li>
<li><a href="[Link]">Listes des voitures</a></li>
<li><a href="#">A propos</a></li>
</ul>
</div>
<div class="main-content">
<h2>Ajouter des voitures</h2>
<div class="add-car-section">
<div class="add-car-form-container">
<form method="POST" action="" enctype="multipart/
form-data" id="addCarForm">
<label>Marque: <input type="text" name="marque"
value="<?php echo htmlspecialchars($marque_val); ?>" required onkeyu
p="updateDisplay()" ></label><br>
<label>Année: <input type="number" name="annee"
value="<?php echo htmlspecialchars($annee_val); ?>" required onkeyu
p="updateDisplay()"></label><br>
<label>Kilométrage: <input type="number" name="
kilometrage" value="<?php echo htmlspecialchars($kilometrage_val); ?>"
required onkeyup="updateDisplay()"></label><br>
<label>Email: <input type="email" name="email"
value="<?php echo htmlspecialchars($email_val); ?>" required onkeyu
p="updateDisplay()"></label><br>
<label>Prix: <input type="number" step="0.01" n
ame="prix" value="<?php echo htmlspecialchars($prix_val); ?>" required
onkeyup="updateDisplay()"></label><br>
<label>Photo: <input type="file" name="photo" i
d="photoInput" onchange="previewPhoto()"></label><br>
<input type="submit" name="submit" value="Valid
er">
</form>
</div>
<div class="added-car-details">
<h3>Détails de la voiture</h3>
<p>Marque: <span id="displayMarque"><?php echo html
specialchars($marque_val_display); ?></span></p>
<p>Années: <span id="displayAnnee"><?php echo htmls
pecialchars($annee_val_display); ?></span></p>
<p>Kilométrage: <span id="displayKilometrage"><?php
echo htmlspecialchars($kilometrage_val_display); ?></span></p>
<p>Email: <span id="displayEmail"><?php echo htmlsp
ecialchars($email_val_display); ?></span></p>
<p>Prix: <span id="displayPrix"><?php echo htmlspec
ialchars($prix_val_display); ?></span></p>
<div class="photo-display">
<img id="previewImage" src="<?php echo htmlspec
ialchars($photo_src_display); ?>" alt="Photo de la voiture" style="<?
php echo empty($photo_src_display) ? 'display:none;' : ''; ?>">
<span id="noPhotoText" style="<?php echo !
empty($photo_src_display) ? 'display:none;' : ''; ?>">Photo</span>
</div>
</div>
</div>
</div>
</div>
<script>
// Cette fonction met à jour les informations affichées à droit
e du formulaire
// Note: Cette fonction s'exécute quand l'utilisateur tape dans
les champs.
// Les valeurs affichées ici sont temporaires et ne reflètent p
as le succès/échec de l'enregistrement.
Function updateDisplay() {
[Link]('displayMarque').innerText = docume
[Link]('input[name="marque"]').value;
[Link]('displayAnnee').innerText = documen
[Link]('input[name="annee"]').value;
[Link]('displayKilometrage').innerText = d
[Link]('input[name="kilometrage"]').value;
[Link]('displayEmail').innerText = documen
[Link]('input[name="email"]').value;
[Link]('displayPrix').innerText = document
.querySelector('input[name="prix"]').value;
}
</script>
</body>
</html>
[Link] :
<?php
Include '[Link]'; // Inclut le fichier de connexion
[Link] :
<?php
Include '[Link]';
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Tableau de Bord – [Link]</title>
<link rel="stylesheet" href="[Link]">
<script src=[Link]
</head>
<body>
<div class="container">
<div class="sidebar">
<div class="logo">[Link]</div>
<ul>
<li class="active">Tableau de bord</li>
<li><a href="[Link]">Ajouter des voitures</a></li>
<li><a href="[Link]">Listes des voitures</a></li>
<li><a href="#">A propos</a></li>
</ul>
</div>
<div class="main-content">
<div class="dashboard-widgets">
<div class="widget car-count">
<span class="count-number">0<?php echo $totalCars;
?></span>
<p>Nombre des voitures Disponibles</p>
</div>
<div class="widget graph-container">
<canvas id="carsByYearChart"></canvas>
</div>
<div class="car-image">
<img src="voiture_sport.png" alt="Voiture"> </div>
</div>
</div>
</div>
<script>
// Code JavaScript pour créer le graphique avec [Link]
Const ctx = [Link]('carsByYearChart').getConte
xt('2d');
New Chart(ctx, {
Type: 'bar', // Type de graphique à barres
Data: {
Labels: <?php echo json_encode($graphLabels); ?>, // An
nées des voitures
Datasets: [{
Label: 'Nombre de voitures',
Data: <?php echo json_encode($graphValues); ?>, //
Compte des voitures par année
backgroundColor: 'rgba(75, 192, 192, 0.6)', // Coul
eur des barres
borderColor: 'rgba(75, 192, 192, 1)', // Couleur de
la bordure des barres
borderWidth: 1
}]
},
Options: {
Scales: {
Y: {
beginAtZero: true, // L'axe Y commence à zéro
ticks: {
stepSize: 1 // Les tiques de l'axe Y sont d
es entiers (nombre de voitures)
}
}
},
Responsive: true,
maintainAspectRatio: false, // Permet de contrôler la t
aille du graphique via CSS
plugins: {
legend: {
display: false // Cache la légende si vous ne v
oulez qu'un seul dataset
}
}
}
});
</script>
</body>
</html>
[Link]
<?php
Include '[Link]';
// Pagination settings
$results_per_page = 3; // Nombre de voitures à afficher par page
$stmt->execute();
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Listes des voitures - [Link]</title>
<link rel="stylesheet" href="[Link]">
<style>
/* Styles spécifiques pour le design de la page Listes des voit
ures */
.search-section {
Margin-bottom: 10px;
Padding: 15px;
Border: 1px solid #ddd;
Border-radius: 8px;
Background-color: #f9f9f9;
Display: flex; /* Utilisation de flexbox pour l'alignement
*/
Align-items: flex-end; /* Aligner les éléments en bas si le
urs hauteurs sont différentes */
Flex-wrap: wrap; /* Permettre aux éléments de passer à la l
igne si l'espace est insuffisant */
Gap: 10px; /* Espace entre les éléments */
}
.search-section .form-group {
Display: flex;
Flex-direction: column; /* Chaque groupe (label + input) en
colonne */
}
.search-section label {
Margin-bottom: 5px; /* Espace sous le label */
Font-weight: bold;
}
.search-section input[type='text'],
.search-section input[type='number'] {
Padding: 8px;
Border: 1px solid #ccc;
Border-radius: 4px;
Width: 150px; /* Ajuster la largeur des champs de saisie */
}
.search-section input[type='submit'] {
Padding: 8px 15px;
Background-color: #83AE92; /* Bleu des boutons */
Color: white;
Border: none;
Border-radius: 4px;
Cursor: pointer;
Height: 38px; /* Ajuster la hauteur pour s'aligner avec les
champs */
}
.search-section input[type='submit']:hover {
Background-color: #02503A;
}
Table {
Width: 100%;
Border-collapse: collapse;
Margin-top: 20px;
}
Table th, table td {
Border: 1px solid #ddd;
Padding: 8px;
Text-align: center;
}
Table th {
Background-color: #f2f2f2;
}
Table img {
Max-width: 80px; /* Ajustez la taille de l'image dans le ta
bleau */
Height: auto;
Display: block;
Margin: auto; /* Centrer l'image si elle est petite */
}
.pagination {
Margin-top: 20px;
Text-align: center;
}
.pagination a, .pagination span {
Display: inline-block;
Padding: 8px 16px;
Text-decoration: none;
Color: #007bff;
Border: 1px solid #ddd;
Margin: 0 4px;
Border-radius: 4px;
}
.pagination a:hover {
Background-color: #f2f2f2;
}
.pagination .current-page {
Background-color: #007bff;
Color: white;
Border: 1px solid #007bff;
}
.pagination .disabled {
Color: #ccc;
Pointer-events: none; /* Désactiver les clics */
Cursor: default;
}
<div class="search-section">
<form method="GET" action="[Link]" style="display: fl
ex; align-items: flex-end; gap: 10px; flex-wrap: wrap;">
<div class="form-group">
<label for="search_marque">Marque</label>
<input type="text" name="search" id="search_mar
que" placeholder="" value="<?php echo htmlspecialchars($search_query);
?>">
</div>
<div class="form-group">
<label for="start_year">Année</label>
<input type="number" name="start_year" id="star
t_year" placeholder="" value="<?php echo htmlspecialchars($start_year);
?>">
</div>
<div class="form-group">
<label for="end_year">Jusqu'au </label>
<input type="number" name="end_year" id="end_ye
ar" placeholder="" value="<?php echo htmlspecialchars($end_year); ?>">
</div>
<?php
Echo "<table>
<thead>
<tr>
<th>Marque</th>
<th>Année</th>
<th>Kilométrage</th>
<th>Prix</th>
<th>Photo</th>
<th>Actions</th>
</tr>
</thead>
<tbody>";
If ($stmt->rowCount() > 0) {
While ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
Echo "<tr>
<td>" . htmlspecialchars($row['marque']) .
"</td>
<td>" . htmlspecialchars($row['annee']) . "
</td>
<td>" . htmlspecialchars($row['kilometrage'
]) . "</td>
<td>" . htmlspecialchars($row['prix']) . "<
/td>
<td>";
If (!empty($row['photo_path']) && file_exist
s($row['photo_path'])) {
Echo "<img src='" . htmlspecialchars($row['phot
o_path']) . "' alt='Photo voiture'>";
} else {
Echo "N/A";
}
Echo " </td>
<td>
<div class='action-buttons'>
<a href='[Link]?id=" . htmlspec
ialchars($row['id']) . "'>Modifier</a>
<a href='[Link]?id=" . htmlspec
ialchars($row['id']) . "'>Supprimer</a>
</div>
</td>
</tr>";
}
} else {
// Le colspan doit correspondre au nombre de <th> affic
hés (Marque, Année, Kilométrage, Prix, Photo, Actions = 6 colonnes)
Echo "<tr><td colspan='6'>Aucune voiture trouvée.</
td></tr>";
}
Echo "</tbody>
</table>";
/* Styles généraux */
Body {
Font-family: Arial, sans-serif;
Margin: 0;
Padding: 0;
Background-color: #f4f4f4; /* Fond gris très clair */
Color: #333; /* Couleur de texte par défaut */
}
.container {
Display: flex; /* Utilise Flexbox pour la mise en page (sidebar + c
ontenu principal) */
Min-height: 100vh; /* La hauteur minimale est 100% de la hauteur de
la fenêtre */
}
.sidebar .logo {
Font-size: 30px;
Font-weight: bold;
Margin-bottom: 45px;
Color: #333;
Text-align: center;
}
.sidebar ul {
List-style: none; /* Supprime les puces de liste */
Padding: 0;
Margin: 0;
}
.sidebar ul li {
Margin-bottom: 20px;
}
.sidebar ul li a {
Text-decoration: none; /* Supprime le soulignement des liens */
Color: #333;
Font-size: 18px;
Display: block;
Padding: 10px 0;
Transition: all 0.3s ease; /* Animation douce au survol */
}
.sidebar ul li a:hover {
Color: #28a745; /* Vert plus foncé au survol */
}
.sidebar ul [Link] {
Font-weight: bold;
Font-size: 25px;
Color: #f4AA7D; /* Vert plus foncé pour l’élément actif */
}
/* Contenu principal */
.main-content {
Flex-grow: 1; /* Prend tout l’espace restant */
Padding: 20px;
Background-color: #f4f4f4;
}
.widget {
Background-color: #fff;
Padding: 20px;
Border-radius: 8px;
Box-shadow: 0 2px 5px rgba(0,0,0,0.1);
Text-align: center;
}
.car-count {
Background-color: #83AE92; /* Vert clair pour le compteur */
Color: #FAFFF1; /* Texte vert foncé */
Border: 1px solid #c3e6cb;
Flex: 0 0 200px; /* Largeur fixe pour le compteur */
Height: 150px;
Display: flex;
Flex-direction: column;
Justify-content: center;
Align-items: center;
}
.car-count .count-number {
Font-size: 48px;
Font-weight: bold;
Color: #FAFFF1 ; /* Vert éclatant */
Margin-bottom: 10px;
}
.car-count p {
Font-size: 18px;
Margin: 0;
}
.graph-container {
Flex: 1; /* Prend l’espace restant entre le compteur et l’image */
Max-width: 450px; /* Largeur max pour le graphique */
Height: 250px; /* Hauteur fixe pour le graphique */
Position: relative; /* Nécessaire pour le positionnement absolu si
besoin */
Background-color: #fff;
Padding: 15px;
Box-sizing: border-box; /* Inclut le padding dans la largeur/
hauteur */
}
.car-image {
Flex: 0 0 350px; /* Largeur fixe pour l’image de la voiture */
Text-align: center;
Overflow: hidden; /* Cache les parties de l’image qui dépassent */
Height: 250px; /* Hauteur similaire au graphique pour l’alignement
*/
Display: flex;
Justify-content: center;
Align-items: center;
}
.car-image img {
Max-width: 100%;
Height: auto;
Display: block; /* Supprime l’espace sous l’image */
}
/* --- Formulaires ([Link], [Link]) --- */
H2 {
Margin-bottom: 40px;
Color: #333;
}
Form {
Background-color: #e0f2e8;
Padding: 20px;
Border-radius: 8px;
Box-shadow: 0 2px 5px rgba(0,0,0,0.1);
/*Margin-top: 20px;*/
Max-width: 500px;
Margin-left: auto;
Margin-right: auto;
}
Form label {
Display: block;
Margin-bottom: 10px;
Font-weight: bold;
}
Form input[type="text"],
Form input[type="email"],
Form input[type="number"],
Form input[type="file"] {
Width: calc(100% - 22px);
Padding: 10px;
Margin-top: 5px;
Margin-bottom: 15px;
Border: 1px solid #ccc;
Border-radius: 4px;
Box-sizing: border-box;
}
Form input[type="submit"] {
Background-color: #83AE92; /* Vert foncé pour le bouton */
Color: white;
Padding: 10px 20px;
Border: none;
Border-radius: 5px;
Cursor: pointer;
Font-size: 16px;
Transition: background-color 0.3s ease;
}
Form input[type="submit"]:hover {
Background-color: #02503A; /* Vert encore plus foncé au survol */
}
.add-car-form-container {
Flex: 1; /* Prend une part égale de l’espace */
Max-width: 500px; /* Limite la largeur du formulaire */
}
.added-car-details {
/*margin-top: 20px;*/
Flex: 1; /* Prend une part égale de l’espace */
Background-color: #fff;
Padding: 20px;
Border-radius: 8px;
Box-shadow: 0 2px 5px rgba(0,0,0,0.1);
Text-align: left;
}
.added-car-details h3 {
Margin-top: 0;
Color: #333;
}
.added-car-details p {
Margin-bottom: 10px;
Font-size: 16px;
}
.added-car-details span {
Font-weight: normal; /* Les valeurs ne sont pas en gras */
Color: #555;
}
.photo-display {
Width: 100%;
Height: 200px;
Border: 2px dashed #ccc; /* Bordure en pointillés */
Display: flex;
Justify-content: center;
Align-items: center;
Margin-top: 10px;
Color: #aaa; /* Couleur du texte “Photo" */
Overflow: hidden; /* Cache ce qui dépasse si l’image est trop grand
e */
Background-color: #f9f9f9; /* Fond léger pour la zone de photo */
}
.photo-display img {
Max-width: 100%;
Max-height: 100%;
Object-fit: contain; /* L’image est contenue dans la boîte sans êtr
e coupée */
Display: none; /* Caché par défaut, affiché par JS si une photo est
là */
}
Table th {
Background-color: #83AE92; /* Fond vert clair pour les en-têtes */
Color: #333;
Font-weight: bold;
}
Table td img {
Display: block; /* Enlève l’espace sous l’image */
Max-width: 100px; /* Taille max des miniatures */
Height: auto;
Border-radius: 4px; /* Coins légèrement arrondis */
}
Table td a {
Margin-right: 10px;
Color: #007bff; /* Bleu pour les liens */
Text-decoration: none;
}
Table td a:hover {
Text-decoration: none; /*Souligné au survol */
background-color: #02503A;
}
.search-form {
Display: flex;
Gap: 10px; /* Espace entre les champs de recherche */
Flex-wrap: wrap;
Align-items: center;
}
.search-form label {
Font-weight: bold;
Margin-right: 5px;
}
.search-form input[type="text"],
.search-form input[type="number"] {
Width: auto; /* Laisse le navigateur déterminer la largeur */
Padding: 8px;
Border: 1px solid #ccc;
Border-radius: 4px;
Box-sizing: border-box;
}
.search-form button {
Background-color: #007bff; /* Bouton bleu pour la recherche */
Color: white;
Padding: 8px 15px;
Border: none;
Border-radius: 4px;
Cursor: pointer;
Transition: background-color 0.3s ease;
}
.search-form button:hover {
Background-color: #0056b3;
}
.pagination-nav {
Margin-left: auto; /* Pousse la pagination vers la droite */
}
.pagination {
Display: flex;
List-style: none;
Padding: 0;
Margin: 0;
Gap: 5px; /* Espace entre les numéros de page */
}
.pagination li a {
Text-decoration: none;
Padding: 8px 12px;
Border: 1px solid #ddd;
Border-radius: 4px;
Color: #007bff;
Transition: background-color 0.3s ease, color 0.3s ease;
}
.pagination li a:hover {
Background-color: #e9ecef;
}
.pagination [Link] a {
Background-color: #007bff;
Color: white;
Border-color: #007bff;
}
/* Message de succès/erreur */
P[style*="color:green"], p[style*="color:red"] {
Padding: 10px;
Border-radius: 5px;
Margin-top: 15px;
Text-align: center;
Font-weight: bold;
}
P[style*="color:green"] {
Background-color: #d4edda;
Border-color: #c3e6cb;
Color: #155724;
}
P[style*="color:red"] {
Background-color: #f8d7da;
Border-color: #f5c6cb;
Color: #721c24;
}
[Link] :
<?php
Include '[Link]'; // Inclut le fichier de connexion
If (!$car) {
$message = "<p style='color:red;'>Voiture non trouvée.</p>";
}
}
$check = getimagesize($_FILES["photo"]["tmp_name"]);
If ($check !== false) {
// Fichier est une image
} else {
$message = "<p style='color:red;'>Le nouveau fichier n'est
pas une image.</p>";
$uploadOk = 0;
}
If ($uploadOk == 1) {
If (move_uploaded_file($_FILES["photo"]["tmp_name"], $targe
t_file)) {
$photo_path = $target_file; // Mettre à jour le chemin
de la photo
// Optionnel: supprimer l'ancienne photo si elle existe
et est différente
If (!empty($current_photo_path) && $current_photo_path
!= $photo_path && file_exists($current_photo_path)) {
Unlink($current_photo_path);
}
} else {
$message = "<p style='color:red;'>Désolé, il y a eu une
erreur lors du téléchargement de la nouvelle photo.</p>";
// On ne change pas $photo_path si l'upload échoue
}
}
}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Modifier une voiture – [Link]</title>
<link rel="stylesheet" href="[Link]">
</head>
<body>
<div class="container">
<div class="sidebar">
<div class="logo">[Link]</div>
<ul>
<li><a href="[Link]">Tableau de bord</a></li>
<li><a href="[Link]">Ajouter des voitures</a></li>
<li><a href="[Link]">Listes des voitures</a></li>
<li><a href="#">A propos</a></li>
</ul>
</div>
<div class="main-content">
<h2>Modifier une voiture</h2>
<?php echo $message; // Affiche les messages de succès/
erreur ?>
Photo actuelle:
<?php if (!empty($car['photo_path'])): ?>
<img src="<?php echo htmlspecialchar
s($car['photo_path']); ?>" width="150px" style="margin-bottom: 10px;
"><br>
<?php else: ?>
<p>Pas de photo actuelle.</p>
<?php endif; ?>
<label>Nouvelle Photo: <input type="file" name="photo"
id="photo"></label><br>
<input type="submit" name="submit" value="Mettre à jour
">
</form>
<?php else: ?>
<p>Aucune voiture sélectionnée pour la modification ou
voiture introuvable.</p>
<?php endif; ?>
</div>
</div>
</body>
</html>