Problème : INPUT et fonction PHP unlink()

Bonjour, je travaille actuellement sur une amélioration du script PHP listr (sous licence CeCILL). Son nom est KOLoad, il a pour but de permettre les uploads/suppression/renommage de fichiers par tout le monde très simplement dans un seul répertoire donné (dossier public).

Voilà, j’arrive au problème : je n’arrive pas à faire dialoguer des checkbox (input) avec la fonction PHP unlink(). Le principe est que des utilisateurs puissent supprimer plusieurs fichiers à la fois par sélection avec des checkbox.

Merci d’avance de votre aide ! :slight_smile:
Edité le 22/07/2009 à 18:06

C’est quoi le souci exactement? Et tant qu’à faire ton niveau de maitrise de PHP?

Si ce sont des checkbox, colle le chemin du fichier dans l’attribut value, et tu auras les chemins des checkboxes cochées…

Oui, ça j’ai fait un code qui permet de récupérer le chemin des fichiers depuis la racine du script (public/fichier), mais ce que je ne comprends pas c’est comment faire une fonction qui supprime les fichiers sélectionnés par un clic sur “Supprimer”.

Alors ça devrait être qqch comme ça.


//boucle avec les checkbox. tout ca dans la balise form
<?php
//$nom_fichier = récuperation de noms des fichiers dans le repertoire.
for ($i=0 ; $i < $valeur_max; $i++)
{
      echo '<input type="checkbox" name="nom'.$i.'" value="'.$nom_fichier[$i].'">',
}


//fichier de suppresion des fichiers/repertoires.

$chemin = "racine/rep";
for ($i=0 ; $i < $valeur_max; $i++)
{
      if ($_POST["nom$i"] != '') unlink($chemin.$_POST["nom$i"]); // le if pour éviter le warning.
}

Teste on ne sait jamais. :slight_smile:
Edité le 29/06/2009 à 11:08

Ok, merci, j’ai testé mais j’obtiens des erreurs PHP. Désolé mais là j’ai du mal, je suis un peu débutant en PHP, c’est vrai, et je me concentre plus sur le CSS/XHTML où je pratique bien sur ce script.

Je crois qu’il n’y a pas besoin de nouveau code pour le INPUT, j’en ai déjà trouvé un qui donne le répertoire du fichier :

Ici le code pour les inputs :

<?php
// Else, if it isn't a save file (terminating by a ~)
else if(!is_save($url)) {
                    
$ext = get_ext($url);
$imgtype = (array_key_exists($ext, $exts)) ? $exts[$ext] : 'unknown';

$type = '<td><img src="icons/icon-'.$imgtype.'.png" alt="['.strtoupper($ext).']" title="'.ucfirst(str_replace('%e', $ext, $LANG['filetype'])).'" /></td>' ;
$size = '<td class="rightAlign">'.humansize($url).'</td>' ;
$lmod = '<td>'.date('d/m/Y à H:i', filemtime($url)).'</td>' ;
$perm = '<td>'.show_perms(fileperms($url)).'</td>' ;
$select = '<td><input type="checkbox" value="public/'.str_replace($path, '', $name).'" name="file"/></td>' ;

$name = $url;
?>

Là pour le bouton suppression, et c’est là qu’il me manque la fonction PHP à lier au lien :


<?php
<a style="color: white" href="////////TO DO////////"><?php echo $LANG['delete']; ?></a>
?>

Et merci pour vos réponses !
Edité le 29/06/2009 à 12:02

Dans le code que tu as linké, je ne vois pas par quel methode tu envoies tes données?
Est-ce voulu ou pas?
Sinon qq’il en soit ton bouton n’est qu’un simple lien et non pas un bouton permettant l’envoi de données.
Peut-être que ton pb vient de là?

Bah pour tout te dire, je ne connais pas bien l’envoi de données en PHP, je me suis documenté mais je ne vois pas comment faire dans mon cas…

Donc faudrait-il que j’utilise un bouton de la balise qui dialogue avec un script PHP ?

Merci !

Dc, il semblerait que le problème vienne de là. En gros ton bouton ne fait rien de spécial, donc rien ne se passe logique tu me diras.

Bref, je te conseille de regarder ce site un tuto site du zero sur le php tu y trouveras ce que tu veux et tu comprendras mieux le code que je t’ai donné plus haut.

Reviens ici après, si tu as besoin d’autres info.

Okay, merci beaucoup pour ton aide :slight_smile:
Je vais travailler un peu mon PHP oui, c’est vrai qu’en me lançant dans ce petit projet, j’imaginais avoir beaucoup de CSS/XHTML et peu de PHP, mais en fait il y en a pas mal à ajouter par rapport à la base de listr que j’ai bien nettoyée du code inutile :frowning:

Bonjour,

J’ai réussi à écrire les scripts de suppression de fichier, donc pour ça c’est ok ! Pour les checkboxes je verrai plus tard, mais maintenant j’ai un nouveau problème : la fonction rename ne veut pas renommer mon fichier avec le script ci-dessous :

<?php
if(isset($_POST['rename']))
{
	$filename = '../public/'.$_GET['file'];
	$newname = '../public/'.$_POST['rename'];
	rename($filename, $newname);
	echo('<div style="margin: 5px; border: 1px solid #5eb854; padding: 10px; background: #9eff94 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameok'].'</div>');
}
else if($_POST['rename']='')
{
	echo('<div style="margin: 5px; border: 1px solid #ecdd33; padding: 10px; background: #fff36d none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameinfo'].'</div>');
}
else
{
	echo('<div style="margin: 5px; border: 1px solid #d65858; padding: 10px; background: #ff8686 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renamefail'].'</div>');
}
?>

Et me déplace dans le répertoire “includes” tout le répertoire “public” ou se trouve le fichier à renommer et au passage renomme “public” en “Renommer” ! Voici avec quel code ça me fait ça :

<?php
if(isset($_POST['rename']))
{
	$filename = '../public/'.$_GET['file'];
	$newname = '../public/'.$_POST['rename'];
	rename($filename, $newname);
	echo('<div style="margin: 5px; border: 1px solid #5eb854; padding: 10px; background: #9eff94 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameok'].'</div>');
}
else
{
	echo('<div style="margin: 5px; border: 1px solid #d65858; padding: 10px; background: #ff8686 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renamefail'].'</div>');
}
?>

Donc voilà, déjà je me demande quel script entre les deux est le meilleur, et ensuite ce qui cloche là dedans…
Après ce problème, je pourrai me débrouille tout seul pour le reste du projet :wink:
Edité le 06/11/2009 à 19:58

Et si tu fais un

echo $filename, ’ – ', $newname, “\n”;

Tu as quoi? (en regardant la source).

Ça me fait :

À la ligne 57 j’ai :

rename($filename, $newname);

Tout le code autour de cette ligne :

if(isset($_POST['rename']))
{
	$filename = '../public/'.$_GET['file'];
	$newname = '../public/'.$_POST['rename'];
	rename($filename, $newname);
	echo('<div style="margin: 5px; border: 1px solid #5eb854; padding: 10px; background: #9eff94 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameok'].'</div>');
}

Edité le 13/07/2009 à 15:29

Cherche pas… :slight_smile:

Tu as déjà essayé même sous Windows de déplacer un dossier parent dans un sous dossier du dossier parent?

Parce ce que là, c’est concrètement ce que tu cherches à faire :slight_smile:

J’ai essayé avec le script corrigé sur ce que tu m’as dit :

<?php
if(isset($_POST['rename']))
{
	$filename = $_GET['file'];
	$newname = $_POST['rename'];
	rename($filename, $newname);
	echo('<div style="margin: 5px; border: 1px solid #5eb854; padding: 10px; background: #9eff94 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameok'].'</div>');
}
else if($_POST['rename']='')
{
	echo('<div style="margin: 5px; border: 1px solid #ecdd33; padding: 10px; background: #fff36d none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renameinfo'].'</div>');
}
else
{
	echo('<div style="margin: 5px; border: 1px solid #d65858; padding: 10px; background: #ff8686 none repeat scroll 0% 0%; color: black; font-weight: bold;">'.$LANG['renamefail'].'</div>');
}
?>

Je n’ai plus de message d’erreur, mais le fichier ne se renomme pas, le script dit avoir réussi (donc le code semble bon ?), mais rien ne change, c’est comme si j’avais pas renommé !

EDIT : j’ai trouve le problème, ça venait du fait que je ne transmettais pas la variable “file” après l’envoi du formulaire du coup PHP ne savait plus quel était le nom du fichier.
Et mon second problème sur le script de rename venait du fait que je n’avais pas défini le bon attribut $_POST[X] pour que ce soit “lié” à l’envoi de données via l’INPUT !
En tout cas, merci pour votre aide à tous, je peux maintenant me débrouiller seul et connais un peu plus de trucs sur le PHP grâce à cycyand1 :wink:

Edité le 19/07/2009 à 16:51

Bonjour, voilà, le développement de KOLoad est terminé, vous pouvez tester ça en téléchargeant la version 1.3 (définitive normalement !).

vanaryon.fr.nf…
Merci de votre aide pendant le développement ! :wink:
Edité le 06/11/2009 à 20:00

Que dire à par que ya une grosse faille dans ton script :smiley:

Edit : Cf MP !
Edité le 06/08/2009 à 23:49

Voilà, après ton MP (merci), j’ai trouvé la faille que tu avais exploité (si c’est bien ça ?) :
J’avais oublié d’interdire l’upload de fichiers en .phpX, du genre .php4, que le serveur pouvait exécuter…
Du coup maintenant j’utilise la fonction ereg(".php", $ext), et comme ça plus de problèmes :wink: Merci pour ton test (et pour ne pas avoir détruit le site aussi) ! :slight_smile:
Au passage j’en ai profité pour interdire les .pl, .sh et compagnie.

EDIT : j’ai mis à jour la 1.3 pour pas faire 36 version différentes pour rien, donc avant de la (re)télécharger, videz le cache de votre navigateur si vous l’aviez déjà prise hier !
Edité le 07/08/2009 à 12:22

Tu as corrigé le probleme, mais sans le voir en fait. Le probleme c’était pas le phpX, même si c’était un soucis aussi. Mais surtout que tu testais l’extension uniquement sur le champ de l’extension lors du rename. Il suffisais de metre dans “toto.php” “”, au lieu de “toto” “.php”.


rename.php Line 83 :

else if ($_POST['newname'] && !ereg("../", $filename))

Tu tests si le nom source n’a pas de …/, il faut testé le nouveau nom ( concaténation du nom + extension )
Edité le 07/08/2009 à 13:19

Bah j’ai déjà corrigé ça il y a quelques minutes, là j’ai interdit par ereg les extensions ‘.php’, ‘.asp’, ‘.jsp’, ‘.cgi’, ‘.sh’, ‘.pl’, cette fois sur toute la variable $newname, ce qui fait que les 2 champs sont réunis.

Voilà, donc j’espère que c’est à peu près tout, non ?

Et pour le …/, c’est pour éviter que les gens renomment des fichiers des répertoires précédents (et pareil pour la suppression), car du coup si je met : ?file=test.txt, ça équivaut à …/files/test.txt, donc du coup je peux écrire ?file=…/icons/icon_nav.ico, qui équivaut à …/files/…/icons/icon_nav.ico et ainsi l’utilisateur peut supprimer ou renommer les fichiers des répertoires précédents…
Edité le 07/08/2009 à 13:32

Faut testé sur $filename et sur $newname donc.