Page 1 sur 1

Crontask

Posté : 02 août 2012, 11:59
par hares7293
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 )

Re: Crontask

Posté : 02 août 2012, 12:55
par Ryle
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é :)

Re: Crontask

Posté : 02 août 2012, 13:29
par hares7293
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']

Re: Crontask

Posté : 02 août 2012, 14:28
par Ryle
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
    }
}

Re: Crontask

Posté : 03 août 2012, 15:02
par hares7293
<?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.

Re: Crontask

Posté : 03 août 2012, 15:18
par Ryle
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 :)

Re: Crontask

Posté : 03 août 2012, 16:23
par hares7293
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);

Re: Crontask

Posté : 03 août 2012, 17:09
par moogli
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/

@+

Re: Crontask

Posté : 03 août 2012, 17:52
par hares7293
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