Nous prendrons comme exemple une base de films. A vous d'adapter afin de correspondre à votre cas.
Une fois l'upload de l'image effectué et l'élément enregistré en base de données, l'idée est de :
- Retrouver l'ID de l'élément qui vient d'être enregistré
- Éditer le nom de l'image enregistrée dans son dossier avec le nom : film_{id}.png
- Mettre à jour (UPDATE) la base de données avec le nouveau nom de l'image
En effet, nous voulons d'abord enregistrer notre élément sans l'image, récupérer l'ID de l'élément nouvellement créé, et enfin enregistrer l'image avec l'ID dans le nom de l'image.
Prérequis : la photo doit déjà pouvoir s'enregistrer.
Vous allez déplacer le de code concernant l'enregistrement de la photo, celui qui effectue les vérifications sur l'image :
if ($_FILES['photo']['error'] == 0) {
...
}
A l'endroit suivant, c'est à dire juste après le execute
.
/**
* ENREGISTREMENT DES DONNEES
*/
$req = "INSERT INTO films(titre, genre, duree, date_de_sortie, realisateur, acteur_principal, note, image)
VALUES(:titre, :genre, :duree, :date_de_sortie, :realisateur, :acteur_principal, :note, :image)";
$res = $bdd->prepare($req);
$res->execute([
'titre' => $titre,
'genre' => $genre,
'duree' => $duree,
'date_de_sortie' => $dateDeSortie,
'realisateur' => $realisateur,
'acteur_principal' => $acteurPrincipal,
'note' => $note,
'image' => $image
]);
if ($_FILES['photo']['error'] == 0) {
...
}
En effet, maintenant on attend que l'élément soit enregistré avant de traiter notre image.
Juste après le execute()
, on souhaite récupérer l'ID de l'élément enregistré afin d'avoir un nom type film_42.png
.
Il nous faut donc :
- le nom de base (
film_
) - l'id (
42
) - l'extension du fichier (
.png
)
Pour récupérer l'ID, vous allez rajouter juste après le execute()
l'instruction suivante :
$id = $bdd->lastInsertId();
C'est une méthode de PDO qui permet de retrouver l'ID du dernier élément enregistré.
Vous allez également préparer le nouveau nom :
$newName =
film_. $id;
Il nous manquera donc l'extension.
Dans le code qui upload l'image :
if (in_array($extension_upload, $extensions_autorisees)) {
...
}
On a accès à l'extension du fichier quelque part. Vous allez donc modifier la fonction move_uploaded_file()
de la sorte :
move_uploaded_file($_FILES['photo']['tmp_name'], 'uploads/' . $newName . '.' $VARIABLE_A_TROUVER);
Remplacez ici $VARIABLE_A_TROUVER
par la variable contenant l'extension du fichier. C'est une variable qui se trouve dans le bloc qui gère l'upload de l'image !
Nous avons (1) déplacé l'enregistrement de l'image après la création de l'élément, afin d'avoir son ID, (2) mis à jour la requête afin de ne plus enregistrer l'image immédiatement en BDD, (3) renommé l'image en "film_38.png".
Il faut dorénavant mettre à jour l'élement enregistré afin d'indiquer en base de données le nouveau nom de l'image !
À la suite du move_uploaded_file()
, vous allez ajouter l'update :
/**
* PARTIE UPLOAD
*/
$request = "UPDATE films SET image = :image WHERE id = :id";
$response = $bdd->prepare($request);
$response->execute([
'id' => $ID_ELEMENT,
'image' => $NOM_IMAGE_COMPLET
]);
Vous remplacerez les variables $ID_ELEMENT
et $NOM_IMAGE_COMPLET
par les valeurs cohérentes (l'ID de l'élément que l'on a trouvé plus haut, et le nom complet de l'image que l'on a composé plus haut aussi).