Page 1 sur 1
Supprimer en base, ok mais également sur le serveur ^^
Posté : 29 août 2006, 15:39
par Titoon
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
Posté : 29 août 2006, 15:44
par Cyrano
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

Posté : 29 août 2006, 16:21
par Invité
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

Posté : 29 août 2006, 17:15
par Cyrano
C'est bien comme ça que je l'entendais aussi petit scarabée

, 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

Posté : 30 août 2006, 11:24
par Henri
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
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.
Posté : 20 sept. 2006, 16:39
par Titoon
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
Posté : 20 sept. 2006, 16:49
par Invité
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
Posté : 20 sept. 2006, 17:09
par Titoon
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
Titoon
Posté : 20 sept. 2006, 17:16
par Ryle
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
Posté : 27 sept. 2006, 14:55
par Titoon
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'
Posté : 27 sept. 2006, 15:38
par Ryle
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

Posté : 27 sept. 2006, 16:14
par Titoon
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

.
Titoon
Ps : Résolu (par Ryle)