Supprimer en base, ok mais également sur le serveur ^^

Titoon
Invité n'ayant pas de compte PHPfrance

29 août 2006, 15:39

Salut tou'l'monde,

Je cherche à compléter le script ci-dessous de façon à supprimer également les fichiers physiques placés sur le serveur.
...
$q = "DELETE FROM matable WHERE macol1='".$_SESSION['id']."'"; 
$sql = ""; 
foreach ($_POST['champ'] as $champ => $valeur){
if ($sql!="") $sql.= " OR "; 
$sql .= " ( id_doc = $valeur ) "; 
}
$q .= " AND ( $sql ) "; 
mysql_query($q);
mysql_close(); 
...
Je sais que je dois utiliser la commande unlink mais quel est la meilleure façon d'aborder ce script selon vous ?

Amicalement,

Titoon

Mammouth du PHP | 19672 Messages

29 août 2006, 15:44

Je te retourne la question : selon toi, quelle serait la meilleure manière... et pourquoi : Te dire quoi faire résoudrait le problème, mais te le faire comprendre par ta propre déduction me semble plus intéressant pour ton propre apprentissage ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

29 août 2006, 16:21

Je suis en partie d'accord avec toi seulement je préfère la notion de partage, apporter mon savoir et ma logique quand je peux et qu'on fasse de même avec moi. Cette façon de faire permet d'ouvrir de nouveaux horizons et ne pas rester cloîtrer dans sa façon de penser/développer. C'est p'tet pour çà qu'il existe une notion prof-élève, maître-disciple...
Il n'a jamais été question de me finaliser ce script mais écouter un autre point de vue ;)

Titoon le p'tit scarabée :idea:

Mammouth du PHP | 19672 Messages

29 août 2006, 17:15

C'est bien comme ça que je l'entendais aussi petit scarabée :D, mais tu auras peut-être noté que j'ai ajouté un détail important dans la demande : le pourquoi de telle solution. Ce que faisant, je pourrais apporter un avis divergeant avec des explications de mon propre pourquoi : Dis-toi bien en tout état de cause que ça n'est qu'une question de logique ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 332 Messages

30 août 2006, 11:24

C'est bien joli tout ça, mais ça n'apporte rien de bien positif. Ici c'est, je pense le forum "Débuter en PHP" et pas le forum philosophie orientale de l'enseignement du kung-fu :lol:

Une solution serait qu'avant d'effectuer ton delete, tu fasses un select sur les noms de fichiers avec les mêmes critères que dans le delete.
Tu récupères les noms de fichiers (que tu n'oublies pas de mettre en path absolu), et tu fais une boucle dans laquelle tu fais des unlink sur ces noms des fichiers.

Puis, tu fais ton delete dans la base.

Titoon
Invité n'ayant pas de compte PHPfrance

20 sept. 2006, 16:39

Merci pour cette intervention pleine de sagesse :)

Le problème avec mon exemple c'est que j'ai déjà à faire à une boucle et ne voit pas comment et où placer la fonction unlink quand ma requête SELECT renvoie un truc du genre :

Code : Tout sélectionner

SELECT * FROM documents WHERE actif = 1 AND (id=1 OR id=8 OR id=19...)
:(

Titoon

Invité
Invité n'ayant pas de compte PHPfrance

20 sept. 2006, 16:49

tu commences par faire un select qui liste tes fichiers a supprimer
ensuite dans la boucle du resultat du select tu fais ton unlink

et enfin tu fait ta requete delete avec les meme parametre que dans le where du select

Titoon
Invité n'ayant pas de compte PHPfrance

20 sept. 2006, 17:09

Oui c'est exactement ce que je dis et veux faire ^^. J'ai la logique, je vois bien l'ensemble, c'est juste en mode opératoire que je foire :oops:

Titoon

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

20 sept. 2006, 17:16

Qu'est ce que tu foires ? est ce que tu as un message d'erreur ?
est ce que c'est quelque chose que tu ne comprends pas ? que tu ne vois pas comment faire ?

C'est un forum, c'est fait pour s'exprimer ronthudjiou ?! :)

Pour le mod op, notre invité t'as indiqué la procédure à suivre, y a juste à mettre le code à la place des mots :

Code : Tout sélectionner

Ecrire le SELECT Exécuter le SELECT tantQue "il y a des résultats dans le select" Faire Récupérer le nom du fichier Supprimer le fichier finTantQue Ecrire le DELETE Exécuter le DELETE

Titoon
Invité n'ayant pas de compte PHPfrance

27 sept. 2006, 14:55

Re,

C'est le résultat de mon select qui me pose problème. Si ca m'avait renvoyé qu'une valeur, j'aurai dit ok mais là ca me renvoie ce select :
SELECT FROM docs WHERE aff=1 AND ( ( id = 17 ) OR ( id = 36 ) OR ( id = 54 ) )
Je peux pas traiter via la fonction unlink une telle requête et suis obligé de découper ma requête pour chaque id et c'est ça qui "m'ennuie"...Ca sent le tableau tout ca je crois :?

Tit'

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

27 sept. 2006, 15:38

Pas besoin de tableau ou de découper ta requête, tu peux très bien ramener plusieurs enregistrement avec un select, et faire une simple boucle pour les parcourir tous :)

Tu as toute une série de fonction de type mysql_fetch_* pour lire les résultat d'un select. Par exemple mysql_fetch_assoc() :
$rs = mysql_query(...) or die (mysql_error()); // execution du select
while ($row = mysql_fetch_assoc()) { // pour chaque ligne retournée par le select, celle-ci est convertie en tableau et stockée dans $row
  echo $row['nom_de_ma_colonne']; // affiche la valeur contenue dans 'nom_de_ma_colonne' pour la ligne courrante
}
Au lieu d'un echo, tu pourrais très bien envisager un unlink par exemple... tu supprimerais ainsi tous les fichiers associés avant de passer au delete en base :)

Titoon
Invité n'ayant pas de compte PHPfrance

27 sept. 2006, 16:14

Un grand merci à toi Ryle. Au risque de choquer, je ne connaissais que de nom la fonction mysql_fetch_assoc(). J'en avais vaguement entendu parler sans savoir de quoi il en retournait réellement. Je me suis toujours débrouiller sans et j'ai pourtant fait des trucs plus durs que ca...
C'est parce que je ne savais pas son utilité que j'ai peiné. Ca semble être une des fonctions de base et je ne le savais pas. Je suppose que tu comprends maintenant pourquoi je peinais. Encore merci pour m'avoir permis de progresser dans mon initiation à PHP :wink:.

Titoon

Ps : Résolu (par Ryle)