IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Supprimer photos qui ne sont pas dans la base


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut Supprimer photos qui ne sont pas dans la base
    bonjour
    je n'arrive pas a afficher tous les noms de photos à virer... il m'indique que le 1er et pourtant il y en a plus de 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    if($opdossier = opendir('./photos'))
    {
      while(false !== ($fichier = readdir($opdossier)))
      {
       if($fichier != '.' && $fichier != '..' && $fichier != 'index.html' && $fichier != 'nofoto.png')
       {
       	$photo = $bdd->query("SELECT photo FROM annonce WHERE photo != 'a:0:{}'");
    	$photos = $photo->fetchall();
    	foreach ($photos AS $visufoto)
    	{
    		if (!empty($visufoto['photo']))
    		{
    		$listfoto = unserialize($visufoto['photo']);
     
    	if (in_array($fichier, $listfoto))
    	{
    	$okfoto = 1;
    	}
    		}
    	} 
    	if (!isset($okfoto) AND !empty($visufoto['photo'])){
    	echo "a virer :".$fichier."<br>";
    	//unlink ("./photos/$fichier");
    	unset($okfoto);
    	}
     
       }
      }
    } 
     
    closedir($opdossier);
    je ne sais pas si on peut vérifier directement en sql comme mon champ photo et serializé

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    C'est pas pratique du tout ces listes de photos sérialisées, je dirais mauvais design de la base de données, mais on va faire avec. Pour éviter trop d'imbrications d'accolades et surtout pour éviter de faire la même requête SQL à chaque fichier, j'écrirais le code de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if ( $handle = opendir('./photos') )
    {
        $fichiers = [];
     
        while ( false !== $fichier = readdir($handle) )
        {
            if ( !in_array($fichier, ['.', '..', 'index.html', 'nofoto.png']) )
            {
                $fichiers[] = $fichier;
            }
        }
     
        $qres = $bdd->query("SELECT photo FROM annonce WHERE photo != 'a:0:{}'");
     
        $photos = array_column($qres->fetchall(), 'photo');
        $photos = array_map('unserialize', $photos);
        $photos = array_merge([], ...$photos);
     
        $toRemove = array_diff($fichiers, $photos);
     
        foreach ( $toRemove as $fichier ) {
            echo "À virer: ", $fichier, "<br />", PHP_EOL;
        }
        closedir($handle);
    }
    Bien sûr, je n'ai pas pu tester!

  3. #3
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut
    merci, je ne savais pas qu'on pouvait faire comme ça.
    j'avais pensé à récupérer les photos comme sur le sujet: extraire les noms des photos d'une variable
    mais ça va être super lourd.
    mon champ photo me sert uniquement pour contrôler les photos existante... car si l'utilisateur modifie ou supprime avant de validé, la photo est quand même enregistré dans le serveur.
    A voir sérialisées n'est pas la bonne façon... c'est quoi la meilleur façon pour enregistrer les noms de photos pour chaque page ?

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    A voir sérialisées n'est pas la bonne façon... c'est quoi la meilleur façon pour enregistrer les noms de photos pour chaque page ?
    C'est un design classique avec 3 tables (une pour les pages, une pour les photos, une qui fait la liaison entre les pages et les photos), un truc comme ça:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    t_page
    ---------------
    pag_id (primary key int autoincrement)
    pag_date
    pag_title
    pag_content
     
     
    t_photo
    ---------------
    pho_id (primary key int autoincrement)
    pho_desc
    pho_path (uniq)
     
     
    t_page_photo
    ---------------
    fk_pag_id
    fk_pho_id

    Avec un tel schéma, dans la table t_photo, une ligne correspond à une photo, on peut ajouter une contrainte d'unicité sur le chemin (deux photos ne peuvent pas avoir le même chemin). Du coup on peut avoir l'ensemble des photos directement en faisant: SELECT pho_path FROM t_photo.

    Tu remarqueras que t_page ne contient aucune colonne relative à une quelconque photo, de même que t_photo n'a aucune colonne relative à une quelconque page. C'est t_page_photo qui a pour rôle de faire la liaison entre une page et une photo.

    Disons que la page ayant pour id 21, contienne les photos ayant pour id 12, 13 et 14. La table t_page_photo aura donc les lignes:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fk_pag_id | fk_pho_id
    ----------+-----------
           21 |        12
           21 |        13
           21 |        14

    Le préfixe fk_ est une convention de nommage que j'utilise pour signifier que fk_pag_id et fk_pho_id sont des clefs étrangères (Foreign Key) qui proviennent respectivement pag_id et pho_id (les clefs primaires de t_page et t_photo). Ce sont des contraintes qu'il faut déclarer à la création de la table, elles empêcheront notamment d'insérer une ligne avec une id de photo ou de page qui n'existe pas.

    Pour récupérer les chemins des photos d'une page, il faudra alors faire une jointure, par exemple:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ph.pho_path
    FROM t_page_photo pa
    LEFT JOIN t_photo ph 
           ON ph.pho_id = pa.fk_pho_id
    WHERE pa.fk_pag_id = 21

    Ça peut paraître compliqué, mais en fait c'est très performant. Il faut bien voir qu'une base de données relationnelle c'est une machine à faire des opérations ensemblistes sur les tables et dont les rouages sont les clefs numériques. Le but de ce genre de design est notamment de respecter un des principes fondamentaux dans la construction d'une base de données: l'atomicité des données (ce qui n'est pas le cas avec une liste de photos).

    Le site est particulièrement bien fourni en tutoriels sur les bases de données et la modélisation si tu veux t'aguerrir sur le sujet. N'hésite pas à jeter un œil dans la section modélisation/schéma du forum et à te procurer l'outil looping.

  5. #5
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut
    merci pour l'explication bien détaillé.
    je pensais qu' avoir une seul table avec tous dedans été plus rapide et prend moins de ressource pour le serveur.
    je vais essayer cette méthode par la suite, mais beaucoup plus dur à comprendre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. supprimer les fichiers qui ne sont pas dans une liste
    Par jeorcal dans le forum Langage
    Réponses: 7
    Dernier message: 15/01/2011, 10h03
  2. Faire une liste d'élément qui ne sont pas dans la base
    Par bossLINDROS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/06/2007, 12h09
  3. Réponses: 10
    Dernier message: 15/12/2006, 07h34
  4. Réponses: 3
    Dernier message: 26/07/2006, 20h41
  5. Réponses: 4
    Dernier message: 02/06/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo