PDA

Afficher la version complète : [Réglé] PHP supression de fichier automatique



adminlinux
08/05/2006, 21h41
Bonsoir, ou re bonsoir celon le ca,

J'ai une ligne de suppression automatique dans la base de données


mysql_query("DELETE FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");

le problème est que les fichier dont les nons ce trouvais dans la base ne ce suprimme pas des reppèrtoir, la solution qu'on me conseille est de faire un


$sql = 'SELECT count(*) FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND';

et de faire un unlink() juste avant la fonctionn DELETE FROM demande....

la théorie pas de problème, mai en pratique je voie pas comment intégrer sa dans ma page avec le reste du code....

Dudule-le-poisson
08/05/2006, 22h07
* rien compris - mais... où est passé mon fusil à pompe ??? *

Quels fichiers ? Bon, je vais supposer que chacune des entrées supprimées par ta requête contient l'adresse d'un fichier. Comme j'ai cru comprendre que tu n'effectuais ce traitement qu'une fois par jour, tu n'auras pas de remords en terme de performances à parcourir déjà toutes les entrées à supprimer puis, pour chacune de ces entrées, appeler ton unlink(). Ensuite seulement, tu appelles le DELETE.


$deletes = mysql_query("SELECT nom_de_fichier FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del[nom_de_fichier'']);
// gere les suppressions ratées si tu veux
}

adminlinux
08/05/2006, 23h03
Ben j'explique, j'ai un fichier qui contien du code php qui affiche le contenu de la base pour le visiteur, dans ce mème fichier, je voudrais une requète qui suprime les données (fichier compris) qui sont plus vieux que 15jours, il y a 5 noms de fichier dans la base et 5 repertoires qui on le fichier respectif.

donc ton idée est bonne,

Mes repertoir son écri comme suite /var/www/photo1, /var/www/photo2, etc jusque 5.

les champs de la base sont photo1, photo2, photo3, photo4 et photo5.

Si sais pas claire je ré explique mieu...

re,

enplus de ce que tu me donne comme idée, il ne faus pas ajouter quelque par ?


mysql_query("DELETE FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");

Dudule-le-poisson
08/05/2006, 23h22
Ah, petit changement alors. Ce traitement est exécuté à chaque fois qu'un visiteur veut afficher la liste des annonces (c'est bien ça ?). Pour ne pas trop ralentir, il serait bien d'effectuer la requete avec le count(*) ; si son resultat est différent de zero, tu appliques mon bout de code (n'oublie pas de modifier l'argument passé au unlink() ), effectivement suivi du DELETE ; sinon tu n'effectues pas le traitement.

adminlinux
08/05/2006, 23h39
Quoi c'est pas une bonne idée de le faire a chaque visite d'un surfeur ???

Si non je voie pas comment le faire automatiquement....

pour le code,


$deletes = mysql_query("SELECT count(*) FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del["/var/www/photos1/"$photo1]);
}
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del["/var/www/photos2/"$photo2]);
}
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del["/var/www/photos3/"$photo3]);
}
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del["/var/www/photos4/"$photo4]);
}
while ($del = mysql_fetch_array($deletes)) {
$suppression = unlink($del["/var/www/photos5/"$photo5]);
}
mysql_query("DELETE FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");

C'est bon comme sa ?

Dudule-le-poisson
09/05/2006, 00h05
Quoi c'est pas une bonne idée de le faire a chaque visite d'un surfeur ???

Si non je voie pas comment le faire automatiquement....[/b]

Si c'est une bonne idée, ça t'évite de devoir configurer un cron.
<div class='quotetop'>Citation (adminlinux @ 8/05/2006 à 23:39) <{POST_SNAPBACK}> (index.php?act=findpost&pid=86523)</div>
pour le code,


/* code d'adminlinux sous l'emprise de la vodka */

C'est bon comme sa ?[/b]

Euh.... nan... pas du tout http://www.alionet.org/style_emoticons/<#EMO_DIR#>/unsure.gif
Je vais finir par demander tes coordonnées bancaires http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif


$requete_nb_annonces_a_supprimer = mysql_query("SELECT count(*) AS compte FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");
// gere l'echec de cette requete si tu veux
$nb_annonces_a_supprimer = mysql_fetch_array($requete_nb_annonces_a_supprimer );

/* On n'effectue le select que s'il y a des annonces à supprimer */
if ($nb_annonces_a_supprimer['compte'] > 0) {
$deletes = mysql_query("SELECT nom_de_fichier FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");
// gere l'echec de cette requete si tu veux
while ($del = mysql_fetch_array($deletes)) {
for ($i = 1; $i <= 5; ++$i) {
$suppression = unlink('/var/www/photos'.$i.'/'.$del['photo'.$i]);
// gere les suppressions ratées si tu veux
}
}
}

adminlinux
09/05/2006, 00h14
comment tu sais que j'aime la vodka ???


/* code d'adminlinux sous l'emprise de la vodka */

Dudule-le-poisson
09/05/2006, 00h19
comment tu sais que j'aime la vodka ???


/* code d'adminlinux sous l'emprise de la vodka */[/b]

<mode-arnaque> Donne moi tes coordonnées bancaires et je te réponds http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif </mode-arnaque>

(tiens j'atteins la barre des 2^9 messages)

adminlinux
09/05/2006, 00h26
y a un stude,


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/cobra/Documents/consulteoffre.php

connéssais pas la balise modarnaque....

Dudule-le-poisson
09/05/2006, 00h30
Si tu as recopié tel quel, sans tenir compte du fait que je ne connais pas la structure de la table sur laquelle portent les requêtes, c'est normal que ça merdouille.

Il y a de fortes chances que ça plante à ce niveau là =>
SELECT nom_de_fichier

Remplace ça par photo1, photo2, photo3, photo4, photo5 ; adapte éventuellement le unlink().

adminlinux
09/05/2006, 00h43
non, je suis pas con a ce point la, j'avais bien adapté unlink et nom_de_fichier évidament...

par contre, sa vien de quoi "AS compte" ?

Dudule-le-poisson
09/05/2006, 00h46
'AS compte' permet de définir le nom de la colonne. C'est parce que je n'aime pas écrire COUNT(*).

Bon, t'as plus qu'à gérer ce que renvoient les mysql_query pour déterminer laquelle des deux requêtes plante.

adminlinux
09/05/2006, 00h50
J'ai pas de colonne compte....

peut pas remplacer compte par id ?

Dudule-le-poisson
09/05/2006, 00h51
*oh putin*

<div class='sqltop'>SQL</div><div class='sqlmain'>SELECT nom_de_colonne_reelle AS nom_de_colonne_de_ton_choix FROM nom_table WHERE condition </div> nom_de_colonne_reelle : peut être le nom réel d'un champ ou le nom d'un champ passé dans une ou plusieurs fonctions - doit correspondre à quelque chose qui sera interprété par le SGBD et donc à des champs réellement dans la base de données.
nom_de_colonne_de_ton_choix : peut être n'importe quoi du moment que ça sert soit à éviter des ambiguités dans ta requête soit à écrire "cequejeveux" au lieu d'un truc parfois horrible genre "MAX(UNIX_TIMESTAMP(machin))" - définit entre autres les noms de colonnes du tableau associatif que retournera mysql_fetch_array()

adminlinux
09/05/2006, 00h57
non attent, c'est moi qui fais une fois de plus le con, je me trompe de table...

a ben mème avec la bonne table sa fonctionne pas... arfff

count(*), évite de taper toute la ligne des champ de la base ?

Dudule-le-poisson
09/05/2006, 01h00
<fieldset><legend>Pensées</legend>while (!adminlinux.aFaitCeQuIlFallait()) dudule.repeter(adminlinux, (SuggestionInevitable)gerer_les_erreurs_mysql);
</fieldset>

<div class='quotetop'>Citation (Dudule-le-poisson @ 9/05/2006 à 0:46) <{POST_SNAPBACK}> (index.php?act=findpost&pid=86534)</div>
Bon, t'as plus qu'à gérer ce que renvoient les mysql_query pour déterminer laquelle des deux requêtes plante.[/b]

Eventuellement, teste-les dans un phpMyAdmin...

COUNT(*) sert à compter le nombre de lignes répondant à ta requête.

adminlinux
09/05/2006, 12h02
bon, j'ai ragouté cette ligne,


or die ("erreur nb_annonces_a_supprimer ".mysql_error())
derrière

$nb_annonces_a_supprimer = mysql_fetch_array($requete_nb_annonces_a_supprimer );
sa donne

$nb_annonces_a_supprimer = mysql_fetch_array($requete_nb_annonces_a_supprimer ) or die ("erreur nb_annonces_a_supprimer ".mysql_error());

sa me donne une idée du problème

<div class='quotetop'>Citation </div>
erreur nb_annonces_a_supprimer You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1[/b]

donc aparement c'est une ) de trop, mais ou, j'ai vérifié et sa semble normale...

Dudule-le-poisson
09/05/2006, 12h38
Ok ; fais voir à quoi ressemble la ligne exact contenant le count(*) ?

adminlinux
09/05/2006, 12h45
$requete_nb_annonces_a_supprimer = mysql_query("SELECT count(*) AS compte FROM offre WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");

Dudule-le-poisson
09/05/2006, 15h25
Oulah...
version de MySQL ?
Structure de ta table offre ? de ta table demande ?

adminlinux
09/05/2006, 20h24
mysql Ver 14.7 Distrib 4.1.12, for pc-linux-gnu (i486) using readline 4.3

table offre pas demande, je me suis trompé... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/rolleyes.gif

Dudule-le-poisson
09/05/2006, 20h34
table offre pas demande, je me suis trompé... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/rolleyes.gif[/b]


Que ça ne t'empêche de me donner leur structure. (idéalement le CREATE TABLE correspondant)

adminlinux
09/05/2006, 20h36
<div class='quotetop'>Citation </div>
Champ Type Interclassement Attributs Null Défaut Extra Action
id int(11) Non auto_increment Modifier Supprimer Primaire Index Unique Texte entier
date datetime Non 0000-00-00 00:00:00 Modifier Supprimer Primaire Index Unique Texte entier
userid varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
email varchar(100) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
categorie varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
marque varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
type varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
kilometres varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
chassisplaque varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
datemisecirc varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
carrosserie varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
message text latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
prix varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
idperso varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
abs varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
intarder varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
climatisation varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
ebs varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
retarder varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
gps varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
chauffagenuit varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
compresseur varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
grue varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
hydraulique varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
attacheremorque varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
communal varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
transmission varchar(30) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
photo1 varchar(250) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
photo2 varchar(250) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
photo3 varchar(250) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
photo4 varchar(250) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier
photo5 varchar(250) latin1_swedish_ci Non Modifier Supprimer Primaire Index Unique Texte entier[/b]

Dudule-le-poisson
09/05/2006, 21h10
Je vois que tu as un phpMyAdmin à ta disposition ; va dans l'onglet "SQL", colle ça =>
<div class='sqltop'>SQL</div><div class='sqlmain'>SELECT count(*) AS compte FROM offre WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME() </div>

Et donne-moi le résultat (tu peux même faire un screenshot si tu veux) ; je me demande si c'est vraiment MySQL qui merde...

adminlinux
09/05/2006, 22h00
http://www.mezimages.com/image/cobra-expert/miniature/mini_capture1.png (http://www.mezimages.com/image/cobra-expert/capture1.png)

sa voudrais dire que mon mysql est foireux ?

Dudule-le-poisson
09/05/2006, 22h01
*cool un screenshot*
Euh ouais.... copier-coller, ça voulait pas dire non plus "laisser les caracteres HTML dans la requete SQL". Le "&lt;", c'est le code HTML pour < (less than).
-refais la requête en corrigant
-vérifie ton code PHP à ce niveau-là.

On va finir par y arriver ...

adminlinux
09/05/2006, 22h09
bn oui, mais meme si je tape a la main, sa donne le mème résulta....

Alors je sais pas quoi faire...

Dudule-le-poisson
09/05/2006, 22h16
Attends, je vais me créer une table similaire et tester de mon côté (apparemment, c'est le TIME() qui pose problème)

adminlinux
09/05/2006, 22h16
ok merci.

Dudule-le-poisson
09/05/2006, 22h23
Saletés d'humains... qu'est-ce que vous pouvez être ####### avec vos types de données à la ###... Exemple typique : la torture de la manipulation des dates...

Allez, la solution :

<div class='sqltop'>SQL</div><div class='sqlmain'>SELECT count(*) AS compte FROM offre WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < NOW() </div>

<div align='center'>http://phpmyhostimage.free.fr/images/87277//05465166a71f900c1996687ed8b9f294.png (http://phpmyhostimage.free.fr/images/87277//05465166a71f900c1996687ed8b9f294.png)</div>

adminlinux
09/05/2006, 22h25
NOW a la place de TIME !!!!, c'est le forum de developpez.com

Dudule-le-poisson
09/05/2006, 22h30
T'es en retard ^^

adminlinux
09/05/2006, 22h31
bon, évidament, sa enchène d'autre erreur, je vais vraiment me suicidé la...

<div class='quotetop'>Citation </div>
//espace supression
$requete_nb_annonces_a_supprimer = mysql_query("SELECT count(*) AS compte FROM offre WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < NOW()");
// gere l'echec de cette requete si tu veux
$nb_annonces_a_supprimer = mysql_fetch_array($requete_nb_annonces_a_supprimer ) or die ("erreur nb_annonces_a_supprimer ".mysql_error());

/* On n'effectue le select que s'il y a des annonces a supprimer */
if ($nb_annonces_a_supprimer['compte'] > 0) {
$deletes = mysql_query("SELECT photo1,photo2,photo3,photo4,photo5 FROM offre WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()");
// gere l'echec de cette requete si tu veux
while ($del = mysql_fetch_array($deletes)) {
for ($i = 1; $i <= 5; ++$i) {
$suppression = unlink('/var/www/photos'.$i.'/'.$del['photo'.$i]);
}
}
}[/b]
maintenant j'ai comme erreur

<div class='quotetop'>Citation </div>
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/cobra/Documents/consulteoffre.php on line 235[/b]

j'ai éssayer de mètre aussi NOW a la place de TIME au 2 ème sélècte et la sa me donne 25.000 message d'erreur

Dudule-le-poisson
09/05/2006, 22h33
Oui, il faut bien mettre NOW à la place de TIME dans le deuxième SELECT.
Sinon tu peux essayer de nous mettre les 5 premiers des 25 000 messages d'erreur http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

adminlinux
09/05/2006, 22h37
<div class='quotetop'>Citation </div>
Warning: unlink(/var/www/photos1/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos2/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos3/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos4/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos5/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos1/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos2/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos3/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos4/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos5/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos1/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos2/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos3/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos4/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos5/) [function.unlink]: Is a directory in /home/cobra/Documents/consulteoffre.php on line 237
Warning: unlink(/var/www/photos1//tmp/phpH4JWaT) [function.unlink]: No such file or directory /home/cobra/Documents/consulteoffre.php on line 237[/b]

Dudule-le-poisson
09/05/2006, 22h39
Ok, on approche du bout du tunnel ; tu devrais tester si photoX est null ou non :


if ($del['photo'.$i] != '') $suppression = unlink('/var/www/photos'.$i.'/'.$del['photo'.$i]);

adminlinux
09/05/2006, 22h53
info suplémentaire, il y a 5 repertoirs, et 5 champ dans la base, tous est pas rempli, si y a que 3 photos a mètre y en a 2 vide si y a pas de photo, tous est vide...

Plus d'erreur, tu me sauve encore une fois la vie... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/smile.gif

Pour la requète


DELETE FROM demande WHERE DATE_ADD(date, INTERVAL 1296000 SECOND) < TIME()

je peux laisser TIME ou je dois remplacer aussi par NOW ?????? http://www.alionet.org/style_emoticons/<#EMO_DIR#>/unsure.gif

voila ce que on me dit sur le forum developpez.com..

<div class='quotetop'>Citation </div>
Aie,
n'utilise pas now(), c'est trop consommateur, utilise time() en php.[/b]

Dudule-le-poisson
09/05/2006, 22h59
On ne parle pas de PHP mais de SQL ici ; si tu veux composer ta requête SQL en insérant la date en PHP, libre à toi mais je ne pense pas que ça te simplifie la vie ni que ça accélère réellement le traitement. Sinon il n'y a pas de TIME() en SQL - Il y a CURTIME mais ça ne fonctionne pas car ça ne renvoie que l'heure, pas la date.

adminlinux
09/05/2006, 23h04
ok, je connais pas encoe tous... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif

ce qui est bien dommage.....

Dudule-le-poisson
09/05/2006, 23h09
De toute façon, avant d'optimiser, cela doit fonctionner. Et je crois que c'était suffisamment laborieux comme ça. Mets-moi donc ce topic en "Réglé"...