💻 DéveloppementIntermédiaire PS 1.6 PS 1.7 PS 8.x

Récupérer l'ID d'une image après insertion en base PrestaShop

Comment récupérer l'identifiant d'une image produit après insertion en base de données PrestaShop avec Insert_ID() et l'ObjectModel Image.

En bref : Pour récupérer l'ID d'une image après insertion en base PrestaShop, utilisez Db::getInstance()->Insert_ID() juste après l'INSERT. La méthode recommandée reste l'ObjectModel Image qui gère automatiquement l'ID, le multiboutique et le chemin des fichiers.

Publié le 21 mars 2026 5 min de lecture Alexandre Carette

Le problème : synchroniser les ID d'images entre les tables PrestaShop

Lorsque vous développez un module PrestaShop qui gère l'upload d'images produit de manière programmatique, vous êtes confronté à un défi classique : la table ps_image génère un id_image en auto-incrémentation, et vous devez ensuite réutiliser cet identifiant pour alimenter les tables liées comme ps_image_shop ou ps_image_lang.

Une erreur fréquente consiste à tenter de deviner l'ID suivant avec un calcul comme $id_image + 1. Cette approche est fondamentalement fragile : elle échoue dès qu'un autre processus insère une image entre-temps, ou si l'utilisateur n'uploade pas toutes les images prévues, créant des décalages dans la séquence d'auto-incrémentation.

Solution rapide : Db::getInstance()->Insert_ID()

La méthode Insert_ID() de la classe Db retourne le dernier identifiant auto-incrémenté généré par la connexion MySQL courante. C'est l'équivalent PrestaShop de mysqli_insert_id() ou LAST_INSERT_ID() en SQL.


// Insertion de l'image en base
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'image (id_product, position, cover) VALUES (' . (int)$idProduct . ', 2, NULL)';
Db::getInstance()->execute($sql);

// Récupération fiable de l'ID généré
$idImage = (int)Db::getInstance()->Insert_ID();

// Utilisation pour ps_image_shop
$sqlShop = 'INSERT INTO ' . _DB_PREFIX_ . 'image_shop (id_image, id_shop, cover) VALUES (' . $idImage . ', ' . (int)Context::getContext()->shop->id . ', NULL)';
Db::getInstance()->execute($sqlShop);

Points importants :

  • Utilisez `execute()` et non `executeS()` pour les requêtes INSERT. La méthode `executeS()` est conçue pour les SELECT et retourne un tableau de résultats.
  • Appelez `Insert_ID()` **immédiatement** après l'INSERT, avant toute autre requête.
  • Castez toujours en `(int)` les valeurs injectées dans vos requêtes pour prévenir les injections SQL.

La bonne pratique : utiliser l'ObjectModel Image

Si la méthode Insert_ID() fonctionne, elle reste une approche bas niveau qui vous oblige à gérer manuellement chaque table associée. PrestaShop fournit la classe Image (ObjectModel) qui encapsule toute cette logique.


use PrestaShop\PrestaShop\Adapter\Image\ImageRetriever;

// Création d'une image via l'ObjectModel
$image = new Image();
$image->id_product = (int)$idProduct;
$image->position = Image::getHighestPosition($idProduct) + 1;
$image->cover = false;

if ($image->add()) {
    // L'ID est automatiquement disponible
    $idImage = (int)$image->id;
    
    // Le dossier de destination est calculé automatiquement
    $destinationPath = $image->getPathForCreation();
    
    // Copie du fichier uploadé
    ImageManager::resize(
        $tmpFilePath,
        $destinationPath . '.' . $image->image_format,
        null,
        null,
        $image->image_format
    );
    
    // Génération de toutes les déclinaisons de tailles
    $types = ImageType::getImagesTypes('products');
    foreach ($types as $type) {
        ImageManager::resize(
            $tmpFilePath,
            $destinationPath . '-' . stripslashes($type['name']) . '.' . $image->image_format,
            (int)$type['width'],
            (int)$type['height'],
            $image->image_format
        );
    }
}

Avantages de l'ObjectModel par rapport au SQL brut

AspectSQL brut + Insert_ID()ObjectModel Image Tables géréesManuelle (image, image_shop, image_lang)Automatique MultiboutiqueÀ gérer soi-mêmeNatif Hooks déclenchésAucunactionObjectImageAddAfter, etc. Calcul du chemin fichierManuel`getPathForCreation()` Validation des donnéesAucuneValidation ObjectModel Compatibilité versionsFragileMaintenue par le core

Gestion complète d'un upload multi-images

Voici un exemple complet et robuste pour gérer l'upload de plusieurs images produit dans un module PrestaShop 8.x :


/**
 * Associe des images uploadées à un produit PrestaShop.
 *
 * @param int $idProduct L'identifiant du produit
 * @param array $uploadedFiles Tableau de fichiers ($_FILES)
 * @return array Les IDs des images créées
 */
public function addProductImages(int $idProduct, array $uploadedFiles): array
{
    $createdIds = [];
    $position = (int)Image::getHighestPosition($idProduct);

    foreach ($uploadedFiles as $file) {
        if ($file['error'] !== UPLOAD_ERR_OK || !$file['size']) {
            continue;
        }

        // Validation du type MIME
        $allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
        if (!in_array($file['type'], $allowedTypes)) {
            continue;
        }

        $position++;

        $image = new Image();
        $image->id_product = $idProduct;
        $image->position = $position;
        $image->cover = ($position === 1);

        if (!$image->add()) {
            PrestaShopLogger::addLog(
                'Échec ajout image produit #' . $idProduct,
                3
            );
            continue;
        }

        $path = $image->getPathForCreation();

        // Redimensionnement et copie
        if (!ImageManager::resize(
            $file['tmp_name'],
            $path . '.' . $image->image_format
        )) {
            $image->delete();
            continue;
        }

        // Génération des miniatures
        $types = ImageType::getImagesTypes('products');
        foreach ($types as $type) {
            ImageManager::resize(
                $file['tmp_name'],
                $path . '-' . stripslashes($type['name']) . '.' . $image->image_format,
                (int)$type['width'],
                (int)$type['height'],
                $image->image_format
            );
        }

        $createdIds[] = (int)$image->id;
    }

    // Vider le cache des images produit
    if (!empty($createdIds)) {
        Hook::exec('actionProductUpdate', ['id_product' => $idProduct]);
    }

    return $createdIds;
}

Évolutions entre PrestaShop 1.6 et 8.x

Le stockage des images a évolué de manière significative entre les versions :

  • **PrestaShop 1.6** : les images étaient stockées dans des dossiers basés sur l'ID produit (`/img/p/1/2/3/123-home_default.jpg`). Le format de stockage "nouveau" (par ID image éclaté) existait déjà mais n'était pas activé par défaut.
  • **PrestaShop 1.7+** : le format éclaté par ID image est devenu le standard. L'image avec `id_image = 456` se trouve dans `/img/p/4/5/6/456.jpg`.
  • **PrestaShop 8.x** : support natif du format WebP et AVIF. La classe `ImageManager` gère automatiquement la conversion si le serveur le supporte.

Le chemin retourné par getPathForCreation() tient compte de ces différences, ce qui rend l'ObjectModel encore plus pertinent pour écrire du code portable.

Erreurs courantes à éviter

  1. **Utiliser `executeS()` pour un INSERT** : cette méthode est réservée aux SELECT. Utilisez `execute()` pour INSERT, UPDATE et DELETE.
  2. **Deviner l'ID suivant** avec `MAX(id_image) + 1` : en cas d'accès concurrent (deux clients qui uploadent en même temps), vous obtiendrez des doublons.
  3. **Oublier `ps_image_shop`** : en contexte multiboutique, une image sans entrée dans `ps_image_shop` est invisible en front-office.
  4. **Ne pas générer les miniatures** : l'insertion en base ne suffit pas. Sans les fichiers physiques redimensionnés, le front-office affichera des images cassées.
  5. **Ignorer les permissions de dossier** : le répertoire `/img/p/` doit être accessible en écriture par le processus PHP (généralement `www-data`).
#images produit #base de données #ObjectModel #module PrestaShop #API images

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.