Skip to content

Instantly share code, notes, and snippets.

@tomsihap
Last active June 26, 2019 12:08
Show Gist options
  • Save tomsihap/25b180b4211639dfdef487f509dcb152 to your computer and use it in GitHub Desktop.
Save tomsihap/25b180b4211639dfdef487f509dcb152 to your computer and use it in GitHub Desktop.
Développements complémentaires (1)

Développements complémentaires (1)

Comment renommer mon fichier en "film_38.png" ?

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 :

  1. Retrouver l'ID de l'élément qui vient d'être enregistré
  2. Éditer le nom de l'image enregistrée dans son dossier avec le nom : film_{id}.png
  3. 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.

1. Déplacement du bloc de validation après le execute :

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.

2. Ajustement du nom de l'image (film_38.png)

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)

Récupérer l'ID

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.

Modifier le bloc d'instruction qui enregistre l'image

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 !

4. Mise à jour de l'élément

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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment