Crontask

hares7293
Invité n'ayant pas de compte PHPfrance

02 août 2012, 11:59

je possède une table mysql contenant une colonne images (son nom est Lien), cette dernière contient le lien vers l'image sur le serveur.

Ce que je souhaite, c'est réaliser une cron task (lancée une fois par jour) pour nettoyer la table (supprimer ainsi les lignes si la photo a été supprimée du serveur)

Je pense qu'il faut utiliser une condition (if then)et tester la présence de l'image avec file exist.

Ce que je ne vois pas c'est la façon d'écrire la condition

Merci d'avance pour votre aide

PS : Sur un autre forum on m'avait conseillé ceci
<?php
foreach($enregistrementsDeTaBdd as $image) {
    if(!file_exists($image['url'])) {
        // Requête pour supprimer l'image qui a l'id $image['id']
    }
}
mais à quoi correspondent les différents variables ? ($enregistrementsDeTaBdd url )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 août 2012, 12:55

Il te faut effectivement parcourir chacun des enregistrements de ta base de données et tester pour chaque lien si le fichier est bien présent ou non sur ton serveur (avec file_exists()). Lorsque file_exists() renvoi la valeur FALSE, c'est que l'image n'existe pas ou plus et que le lien que tu as en base est déprécié. Il faut alors le supprimer.

Il te faut donc une requête qui effectue un SELECT de tous tes liens, puis une boucle (foreach comme dans ton exemple ou while si tu es plus à l'aise avec). Et le if(!file_exists($le_fichier_dont_tu_as_le_lien_en_base)) pour tester pour chaque lien l'existence du fichier et qui fera un DELETE en base chaque fois que le fichier physique n'est pas trouvé :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

hares7293
Invité n'ayant pas de compte PHPfrance

02 août 2012, 13:29

Merci pour la réponse.

J'ai commencé en faisant cela
<?php
 
$db =& JFactory::getDBO();

$query = "SELECT * FROM jooml_boutiques"; 	 
$result = mysql_query($query);

$row = mysql_fetch_array($result);

foreach($row as $Image) {
    if(!file_exists($Image['url'])) {
        // Requête pour supprimer l'image qui a l'id $image['id']
    }
}

?>
Ce que je ne comprends pas ce sont les variables $Image et $Image['url']

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 août 2012, 14:28

Dans ton code, $Image correspond à $row, c'est à dire le premier enregistrement retourné par ta requête. Ce qu'il faut, c'est qu'à chaque enregistrement que tu as en base et que tu ramènes avec le SELECT, tu dois lire la valeur de ta colonne lien et tester la présence du fichier :
$result = mysql_query($query); // exécution de la requête

while ($row = mysql_fetch_array($result)) { // parcours des différents enregistrements
    if (!file_exists($row['nom_de_la_colonne_qui_contient_le_lien'])) { // test la présence du fichier
        // Requête pour supprimer l'enregistrement associé si le fichier n'existe pas
    }
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

hares7293
Invité n'ayant pas de compte PHPfrance

03 août 2012, 15:02

<?php

$query = "SELECT * FROM jooml_boutiques";        
$result = mysql_query($query);

while ($row = mysql_fetch_array($result)) { 
    if (!file_exists($row['Image'])) { 
	    $Image = $row['Image'];
		$query2 = "DELETE  FROM jooml_boutiques WHERE Image=$Image";
		$result2 = mysql_query($query2);
		
    }
}
?>
J'ai donc fait ceci, mais je dois me tromper dans ma requête DELETE, car cela supprime toutes les lignes même celles qui retournent TRUE

Encore merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 août 2012, 15:18

Je pense que ton delete est bon (il manque peut être juste les apostrophes pour délimiter la chaine de caractère $Image).

A mon avis, le soucis est lié au chemin qui permet de tester si le fichier existe. En effet, ce chemin va partir du dossier dans lequel se trouve le script et suivre le chemin contenu dans ta variable pour chercher l'image.

Il faut donc que tu regardes comment est structuré ton site (en fait, ou se trouve ton script par rapport au répertoire qui contient les images ?) et quelle est la valeur que tu stockes en base (celle que tu récupères dans $row['Image']). Il faut qu'en parcourant le chemin depuis le répertoire où se trouve ton script il puisse trouver l'image que tu cherches :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

hares7293
Invité n'ayant pas de compte PHPfrance

03 août 2012, 16:23

File exist semble correctement fonctionner. J'ai testé avec echo True et echo False.

Mais mon delete ne fonctionne pas. Suivant vos recommandations j'ai écrit ceci :
  if (!file_exists($row['Image'])) { 
	    $Image = $row['Image'];
		$query2 = "DELETE FROM jooml_boutiques WHERE Image=".$Image.";";
		$result2 = mysql_query($query2);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 août 2012, 17:09

Attention tu ne doit faire le delete que lorsque l'image n'existe pas, hors ton code fait l'inverse.

litérallement tu fait
si le fichier "$row['Image']" existe
alors supprimer le fichier de la base

alors que toi tu veux

si le fichier "$row['Image']" n'existe pas
Alors supprimer le fichier de la base

donc le ! de Ryle n'était pas anodin :)

ensuite le 1er code fournit est complet (bon ton nom de champ c'est lien et pas image ....)

<?php

$query = "SELECT * FROM jooml_boutiques";        
// requete SQL pour récupérer tous ce qu'il y dans la table "jooml_boutiques"
$result = mysql_query($query);
// on parcourt le jeux de résultat
while ($row = mysql_fetch_array($result)) {
    if (!file_exists($row['lien'])) { // si le fichier n'existe pas
            $Image = $row['lien'];
            // on supprime
            $query2 = "DELETE  FROM jooml_boutiques WHERE lien=$Image";
            $result2 = mysql_query($query2); // Envoie la requete au serveur MySQL
               
    }
}
?>
Maintenant reste a savoir si le lien qui est dans la table est bon par rapport à l'emplacement du script ou pas. étant donnée que l'on cherche la négation, si a la base on ne sais pas accéder au bon dossier, file_exists retournera toujours false donc il faut commencer par vérifier ce que retourne $row['lien'] (dans l'exemple) pour être certain du chemin.

si tu n'es pas familier du SQL je te conseil ce tuto et les suivants. ainsi que http://sqlpro.developpez.com/cours/

@+
Il en faut peu pour être heureux ......

hares7293
Invité n'ayant pas de compte PHPfrance

03 août 2012, 17:52

if (!file_exists($row['lien'])) J'ai mis Image car ma colonne contenant le lien s'appelle Image

Les liens sont enregistrés sous la forme ./images/produits/nom.jpg et le script est à la racine du server

<?php
$query = "SELECT * FROM jooml_boutiques";        
// requete SQL pour récupérer tous ce qu'il y dans la table "jooml_boutiques"
$result = mysql_query($query);
// on parcourt le jeux de résultat
while ($row = mysql_fetch_array($result)) {
    if (!file_exists($row['Image'])) { // si le fichier n'existe pas
            echo "le fichier n'existe pas";
   }else  {echo "le fichier existe";}
}
?>
Quand le fichier existe j'obtiens bien "le fichier existe"
et "le fichier n'existe pas" si je le supprime

mais je confirme que la ligne associée n'est pas supprimée