prepare('
SELECT e.id, e.title, e.status, e.xptype, e.tags, e.description, e.duration, e.image_url, e.markdown, e.link_url, e.created_at,
ep.pdf_filename
FROM experiences e
LEFT JOIN experience_pdfs ep ON ep.experience_id = e.id
ORDER BY e.id DESC
');
// Execution de la requête SQL
$stmt->execute();
// Retourne toutes les données collectés dans un ARRAY
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) { // En cas d'erreur
die("Erreur de connexion à la base de donnée portfolio :".$e->getMessage());
return [];
}
}
// Fonction qui permet de récupérer les experiences par id et donc de modifier une xp en particulier en ciblant l'id
function recupererXPParId($id) {
global $dbh;
try {
// Même principe que listeXP() : le PDF est joint pour son nom de fichier
// uniquement, jamais son contenu binaire
$stmt = $dbh->prepare('
SELECT e.id, e.title, e.status, e.xptype, e.tags, e.description, e.duration, e.image_url, e.markdown, e.link_url, e.created_at,
ep.pdf_filename
FROM experiences e
LEFT JOIN experience_pdfs ep ON ep.experience_id = e.id
WHERE e.id = :id
');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
// En cas d'erreur => renvoyer un message avec l'erreur
} catch (PDOException $e) {
die("Erreur de connexion à la base de donnée portfolio :" . $e->getMessage());
// Retourner false en cas d'eerreur
return false;
}
}
// Fonction qui va afficher les experiences
function afficherXP() {
// Récupération de la liste des experiences
$experiences = listeXP();
// Ajout de la class pour la liste des experiences FUTUR CSS
echo '
';
// Pour chaque experience dans le ARRAY
foreach ($experiences as $experience) {
// On récupère le titre, le type, la description, la durée et l'image et le tableau avec les tags
$id = (int) $experience['id'];
$titre = htmlspecialchars($experience['title']);
$xptype = htmlspecialchars($experience['xptype']);
$description = nl2br(htmlspecialchars($experience['description']));
$duration = htmlspecialchars($experience['duration']);
$image = htmlspecialchars($experience['image_url']);
$status = htmlspecialchars($experience['status'] ?? '');
$markdown = trim($experience['markdown'] ?? '');
$lien = trim($experience['link_url'] ?? '');
$pdf = trim($experience['pdf_filename'] ?? '');
$tags = [];
// S'il y a des tags alors on les sépares grâce à la virgule que l'user à ajouté dans le champs (tags1,tags2,etcc...)
if (!empty($experience['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $experience['tags'])));
}
echo '
';
// Si la donnée avec l'image n'est pas null alors on l'affiche
if (!empty($image)) {
echo '';
echo '

';
if (!empty($status)) {
echo '
' . $status . '
';
}
echo '
';
}
// Ajout de la class project-content et du titre
echo '';
echo '
' . $titre . '
';
echo '
Type : ' . $xptype . '
';
echo '
Durée : ' . $duration . '
';
// Si les tags ne sont pas vides alors afficher
if (!empty($tags)) {
echo '
';
foreach ($tags as $tag) {
echo '' . htmlspecialchars($tag) . '';
}
echo '
';
}
// Ajout de la description et fin des classes
echo '
' . $description . '
';
// Indicateur de page détaillée : markdown > PDF > lien externe > rien
// Le lien rend toute la carte cliquable (voir CSS .card-link)
if ($markdown !== '') {
echo '
Voir la page détaillée';
} elseif ($pdf !== '') {
echo '
Voir le PDF';
} elseif ($lien !== '') {
echo '
Voir le lien externe';
} else {
echo '
Pas de page détaillée';
}
echo '
';
echo '';
}
echo '
';
}
// Fonction identique à celle en haut mais ajout de bouton
function afficherXPAdmin() {
$experiences = listeXP();
echo '';
foreach ($experiences as $experience) {
$id = (int) $experience['id'];
$titre = htmlspecialchars($experience['title']);
$xptype = htmlspecialchars($experience['xptype']);
$description = nl2br(htmlspecialchars($experience['description']));
$duration = htmlspecialchars($experience['duration']);
$status = htmlspecialchars($experience['status'] ?? '');
$image = htmlspecialchars($experience['image_url']);
$tags = [];
if (!empty($experience['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $experience['tags'])));
}
echo '
';
if (!empty($image)) {
echo '';
echo '

';
if (!empty($status)) {
echo '
' . $status . '
';
}
echo '
';
}
echo '';
echo '
' . $titre . '
';
// Si le status n'est pas vide alors on l'affiche
if (!empty($status)) {
echo '
' . $status . '
';
}
echo '
Type : ' . $xptype . '
';
echo '
Durée : ' . $duration . '
';
if (!empty($tags)) {
echo '
';
foreach ($tags as $tag) {
echo '' . htmlspecialchars($tag) . '';
}
echo '
';
}
echo '
' . $description . '
';
// Boutons qui vont permettrent la modification / Suppresion
echo '
';
echo '
';
echo '';
}
echo '
';
}