Un site d'annonces PERSO en quelques clics avec CHATGPT
le login,pass après installation admin et admi123 donc à personnaliser dans le code ...
Bonjour je voudrais fabriquer un site
de petites annonces php avec sqlite3 je voudrais pouvoir l'héberger
sur mon propre serveur wamp en local ... - il faudrait un formulaire
html de contact protéger traiter par la function native mail() de
php Une protection par un token ou un captcha maison pour le
formulaire de contact et pas de service tiers comme recaptcha de
google la function mail() sera doublée par un stockage des messages
des contacts dans un fichier txt ou csv si le serveur est en local
donc avec un file_put_contents par exemples dans un repertoire
clients une liste date,ip,message donc une page contacter.php avec
captcha.php maison et traitement_envoi.php dans un repertoire admin/
- un CRUD php pour administrer ma table annonces - un formulaire de
dépôt d'annonces avec gestion des images par upload - lors du
lancement du crud la table doit se créer automatiquement, la
première fois - le driver pdo est souhaité id,titre
description,urls_images,prix,annonce_active,date_creation
amelioration possible un champs categorie txt, simple saisie depuis
un un select dans le formulaire de saisie d'annonce une gestion des
images avec thumbs via une class php de traitement d'images pour
mettre des miniatures dans la listes des annonces sur le frontend
voir plus tard une v2 avec une foreign_id pour la categorie et une
table categorie mais restons simple id auto increment le titre de
l'annonces la description de l'annonces 5 images le prix en euros
annonce_active 0 ou 1 comme en ligne la date de la création pour
faire un classement par date sur le front end donc un front end avec
la liste des titres des annonces (index.php) avec une pagination. le
clic sur le titre ouvre une page detail.php avec l'ensemble de
l'annonce et un bouton retour à l'index.php sur la page
detail.php?a=xxx si l'annonce est à 1 comme active dans la table
sinon message comme désactivé un repertoire admin avec le crud avec
une protection par $_SESSIONS et un login.php et logout.php ... le
script doit se pouvoir s'installer sur n'importe serveur php du monde
externe ou local pour l'installation sur un serveur wamp sous windows
10 et la mise en oeuvre de la redirection sur une box perso voir le
cryptage des messages cela sera discuter dans un autre prompt merci
pour ton aide
ChatGPT a dit :
Bonjour ! Ce projet de site de petites annonces avec PHP et
SQLite3 semble super intéressant. Voici comment nous pourrions
organiser cela et les étapes pour réaliser tout ce que tu
souhaites.
1. Structure du projet
Voici un schéma de l'architecture de base pour ton projet :
/projet
/admin
- login.php
- logout.php
- crud_annonces.php
/clients
- contact.txt (ou contact.csv)
/uploads
- (images des annonces)
- index.php
- detail.php
- contacter.php
- captcha.php
- traitement_envoi.php
- config.php
- database.php
2. Base de données SQLite
Nous allons commencer par créer une base de données SQLite3. Le
fichier sera créé automatiquement lors de la première exécution.
Voici un exemple de script pour créer la table annonces
:
<?php
// database.php
try {
$db = new PDO('sqlite:annonces.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Création de la table 'annonces' si elle n'existe pas
$db->exec("CREATE TABLE IF NOT EXISTS annonces (
id INTEGER PRIMARY KEY AUTOINCREMENT,
titre TEXT,
description TEXT,
urls_images TEXT,
prix REAL,
annonce_active INTEGER DEFAULT 1,
date_creation TEXT
)");
// Création de la table 'contacts' pour stocker les messages du formulaire de contact
$db->exec("CREATE TABLE IF NOT EXISTS contacts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
message TEXT,
ip TEXT,
date_creation TEXT
)");
} catch (PDOException $e) {
echo "Erreur de connexion à la base de données : " . $e->getMessage();
}
?>
3. Formulaire de Contact avec Protection (Token ou Captcha
Maison)
Pour le formulaire de contact (contacter.php),
nous allons créer un token simple qui sera validé lors de l'envoi
du message.
Exemple de contacter.php
:
<?php
session_start();
// Générer un token unique pour chaque session
if (!isset($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32)); // 64 caractères hexadécimaux
}
?>
<form action="traitement_envoi.php" method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />
<textarea name="message" required></textarea>
<input type="submit" value="Envoyer">
</form>
Exemple de traitement_envoi.php :
<?php
session_start();
// Vérifier que le token est valide
if ($_POST['token'] !== $_SESSION['token']) {
die("Token invalide.");
}
// Traitement du message
if (!empty($_POST['message'])) {
$message = $_POST['message'];
$ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d H:i:s');
// Sauvegarde du message dans un fichier texte
file_put_contents('clients/contact.txt', "$date | $ip | $message\n", FILE_APPEND);
// Envoi du mail
$to = 'contact@tonsite.com';
$subject = 'Nouveau message de contact';
$headers = 'From: webmaster@tonsite.com' . "\r\n" . 'Reply-To: webmaster@tonsite.com';
mail($to, $subject, $message, $headers);
echo "Message envoyé !";
} else {
echo "Le message ne peut pas être vide.";
}
?>
4. CRUD pour Annonces
Dans le répertoire admin/, nous
allons créer un CRUD pour gérer les annonces. Le CRUD pourra gérer
l'ajout, la modification, la suppression et la liste des annonces.
Exemple de crud_annonces.php
:
<?php
session_start();
// Vérifier que l'utilisateur est connecté
if (!isset($_SESSION['admin_logged_in'])) {
header("Location: login.php");
exit;
}
require_once('../database.php');
// Liste des annonces
$stmt = $db->query("SELECT * FROM annonces ORDER BY date_creation DESC");
$annonces = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Ajouter une annonce
if (isset($_POST['add_announcement'])) {
// Récupérer les données du formulaire
$titre = $_POST['titre'];
$description = $_POST['description'];
$prix = $_POST['prix'];
$urls_images = implode(',', $_FILES['images']['name']); // Liste des URLs des images
// Insertion de l'annonce dans la base de données
$stmt = $db->prepare("INSERT INTO annonces (titre, description, urls_images, prix, date_creation) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$titre, $description, $urls_images, $prix, date('Y-m-d H:i:s')]);
echo "Annonce ajoutée !";
}
// Afficher le formulaire d'ajout
?>
<form method="POST" enctype="multipart/form-data">
<input type="text" name="titre" placeholder="Titre de l'annonce" required>
<textarea name="description" placeholder="Description" required></textarea>
<input type="number" name="prix" placeholder="Prix" required>
<input type="file" name="images[]" multiple>
<button type="submit" name="add_announcement">Ajouter l'annonce</button>
</form>
5. Gestion des Images
Tu peux utiliser la fonction move_uploaded_file()
pour gérer les uploads d'images. Pour créer des miniatures, tu peux
utiliser une classe PHP pour le redimensionnement, comme par exemple
la bibliothèque GD.
Voici un exemple simple de fonction de création de miniature :
function createThumbnail($src, $dest, $width, $height) {
list($original_width, $original_height) = getimagesize($src);
$thumb = imagecreatetruecolor($width, $height);
$source = imagecreatefromjpeg($src); // Si l'image est au format JPEG
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $width, $height, $original_width, $original_height);
imagejpeg($thumb, $dest);
imagedestroy($thumb);
imagedestroy($source);
}
6. Front-End
Pour afficher les annonces et leur détail, voici un exemple de
structure pour index.php et detail.php.
index.php :
<?php
require_once('database.php');
$stmt = $db->query("SELECT * FROM annonces WHERE annonce_active = 1 ORDER BY date_creation DESC LIMIT 10");
$annonces = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<ul>
<?php foreach ($annonces as $annonce): ?>
<li>
<a href="detail.php?a=<?php echo $annonce['id']; ?>"><?php echo $annonce['titre']; ?></a>
</li>
<?php endforeach; ?>
</ul>
detail.php :
<?php
require_once('database.php');
$annonce_id = $_GET['a'];
$stmt = $db->prepare("SELECT * FROM annonces WHERE id = ?");
$stmt->execute([$annonce_id]);
$annonce = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$annonce || $annonce['annonce_active'] == 0) {
echo "Cette annonce n'est pas disponible.";
exit;
}
?>
<h1><?php echo $annonce['titre']; ?></h1>
<p><?php echo $annonce['description']; ?></p>
<p>Prix: <?php echo $annonce['prix']; ?>€</p>
<!-- Affichage des images -->
<?php
$images = explode(',', $annonce['urls_images']);
foreach ($images as $image) {
echo "<img src='uploads/$image' alt='Image de l'annonce'>";
}
?>
<a href="index.php">Retour à l'index</a>
7. Authentification Admin
Pour la gestion des annonces dans le répertoire admin/,
il faut créer un système de connexion avec login.php
et logout.php.
login.php :
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Vérification des identifiants
if ($_POST['username'] == 'admin' && $_POST['password'] == 'admin123') {
$_SESSION['admin_logged_in'] = true;
header("Location: crud_annonces.php");
} else {
echo "Identifiants incorrects.";
}
}
?>
<form method="POST">
<input type="text" name="username" placeholder="Nom d'utilisateur" required>
<input type="password" name="password" placeholder="Mot de passe" required>
<button type="submit">Se connecter</button>
</form>
logout.php :
<?php
session_start();
session_destroy();
header("Location: login.php");
?>
Conclusion
Ce code te donne une bonne base pour ton projet. Une fois que tu
as tout configuré, tu pourras héberger ton site localement avec
WAMP. Pour déployer en ligne, il te suffira de transférer les
fichiers sur ton serveur via FTP et de configurer SQLite pour
fonctionner avec le serveur.
N'hésite pas si tu as besoin de plus de détails ou d'aide
supplémentaire !
Cliquez sur un logo pour aller plus loin ...