IntégrerPHP et javascript

Signaler
Messages postés
2
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
4 août 2004
-
Messages postés
181
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
2 mars 2009
-
Bonjour,

Sur mon serveur, je veux donner la possibilité aux amis hébergés de télécharger des fichiers mais aussi d'effacer les fichiers qu'ils ne désirent plus. J'en suis à la routine d'effacement. En particulier, je veux que la décision de détruire un fichier soit confirmée avant le unlink fatal. Pour cela, je fais appel à une fonction javascript mais je ne sais pas comment déclencher la destruction après la confirmation. La routine a pour nom «effacer.php». Voici mon code :
CODE
<html><head><title>effacer</title>
<script language="javascript">
<!--
function confirme()
{
if (confirm("Voulez-vous vraiment supprimer ce fichier ?")) ;
parent.location.href="effacer.php";
}
//-->
</script>
</head>
<?
$sla= '/';
$folder = "JEAN-YVES";
$dossier = opendir($folder);
$i=0;echo "<table border '2' bordercolor'#BB66BB <caption>Dossier de $folder
</caption>";

while ($Fichier[$i] = readdir($dossier)) {
if ($Fichier[$i] != "." && $Fichier[$i] != ".." && $Fichier[$i] != ".DS_Store") {
$nomFichier = $Fichier[$i];// les répertoires sous UNIX ont un fichier .DS_Store
?>
<tr onmouseout="this.style.background='#CCBBFF';" onmouseover="this.style.background='#DEF5FE';">
<td onClick="confirme()" width="250" valign="top" class="borderright">

<?php echo $nomFichier;?>
</td>
</td>
</tr>
<?
}
}
closedir($dossier);
//unlink($folder.$sla.$nomFichier[$i]);// on détruit le fichier choisi
?>
FIN CODE
Pour détruire le fichier sur lequel l'usager à cliqué il faudrait communiquer le $nomFichier choisi au-delà de l'appel à la fonction javascript. Comment ? On peut passer des variables à travers _GET ou une url mais là je suis vraiment gaga.
Merci de m'aider
Ben

3 réponses

Messages postés
181
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
2 mars 2009

donc soit tu peux passer ton nom de fichier par url
pour cela tu peux quand l'utilisateur clique sur le nom du fichier, passer le fichier a ta fonction confirme (appel dans le onclick) et donc completer ton parent.location.href = 'effacer.php?nomfichier='+fichier;
(voir ci dessous)

<html><head><title>effacer</title>
<script language="javascript">
<!--
function confirme(fichier)
{
if (confirm("Voulez-vous vraiment supprimer ce fichier ?"))
{
// on passer le fichier dans l'url
parent.location.href="effacer.php?nomfichier=" + fichier;
}
else
{
alert("suppression du fichier " + fichier + " annulée");
}
}
//-->
</script>
</head>

<?
$sla= '/';
$folder = ".";
$dossier = opendir($folder);
$i=0;

/* action a faire si nomfichier */

$nomfichier = (string) @$_GET["nomfichier"]; /* récupération de la variable nomfichier passée par url (sinon dans $_POST par formulaire) */
if(strlen(trim($nomfichier))>0) /* le nom de fichier est-il non vide et pas composé uniquement d'espaces */
{
$retour = unlink($folder.$sla.$nomfichier);

if($retour)
{
echo "
le fichier '$nomfichier' a été effacé avec succès.
";
}
else
{
echo "
Impossible de supprimer le fichier '$nomfichier'
";
}
}
else
{
/* pas de nomfichier passé (1er appel de la page par exemple) */
}
echo "<table border '2' bordercolor'#BB66BB <caption>Dossier de $folder
</caption>";

while ($Fichier[$i] = readdir($dossier)) {
if ($Fichier[$i] != "." && $Fichier[$i] != ".." && $Fichier[$i] != ".DS_Store") {
$nomFichier = $Fichier[$i];// les répertoires sous UNIX ont un fichier .DS_Store
?>
<tr onmouseout="this.style.background='#CCBBFF';" onmouseover="this.style.background='#DEF5FE';">
<td onClick="confirme('<?php echo $nomFichier; /* on passe nomfichier en param de confirme pour pouvoir l'utiliser une fois la page chargée */ ?>')" width="250" valign="top" class="borderright">

<?php echo $nomFichier;?>
</td>
</td>
</tr>
<?
}
}
closedir($dossier);
?>

mais cela veut dire que ton utilisateur peut directement appeler ta page en tapant http://chemin/du/site/effacer.php?nomfichier =essai.html

et donc supprimer un fichier directement....

sinon tu peux le poster avec un formulaire ce qui en modifiant très peu ton exemple donne

<html><head><title>effacer</title>
<script language="javascript">
<!--

function confirme(fichier)
{
if (confirm("Voulez-vous vraiment supprimer ce fichier ?"))
{
document.frmeffacer.nomfichier.value = fichier;
// tu poste ton formulaire qui s'appelle frmeffacer
document.frmeffacer.submit();
}
else
{
alert("suppression du fichier " + fichier + " annulée");
//on vide le nom du fichier pour que ce soit "propre" au cas ou yaurait un résidu de je ne sais quoi
document.frmeffacer.nomfichier.value='';
}
}
//-->
</script>
</head>

<?
$sla= '/';
$folder = ".";
$dossier = opendir($folder);
$i=0;

/* suppression a faire si on un nomfichier posté */

if(isset($_POST["nomfichier"])) // on regarde si nomfichier a été posté
{
$nomfichier = (string) $_POST["nom_fichier"]; // on convertir $nomfichier en string pour appeler les fonctions strlen et trim sans erreur
if(strlen(trim((string)$nomfichier))>0) /* suppression possible si nom de fichier non vide et pas composé uniquement d'espaces */
{
$retour = unlink($folder.$sla.$nomfichier);

if($retour)
{
echo "
le fichier '$nomfichier' a été effacé avec succès.
";
}
else
{
echo "
Impossible de supprimer le fichier '$nomfichier'
";
}
}
else
{
/* nom de fichier posté mais incorrect */
/* traitement éventuel à faire */
}
}
else
{
/* aucun nom de fichier posté (1er appel de la page par exemple) */
}

// on ajoute un formulaire qui s'appelle frmeffacer et dont on envoie les données en postant à la page effacer.php
echo "<form name='frmeffacer' id='frmeffacer' method='post' action='effacer.php'>";

//on ajoute un champ caché qui contiendra le nom du fichier a supprimer (initialisé à vide tant que le fichier n'a pas été choisi)
echo "";echo "<table border '2' bordercolor'#BB66BB <caption>Dossier de $folder
</caption>";

while ($Fichier[$i] = readdir($dossier)) {
if ($Fichier[$i] != "." && $Fichier[$i] != ".." && $Fichier[$i] != ".DS_Store") {
$nomFichier = $Fichier[$i];// les répertoires sous UNIX ont un fichier .DS_Store

//sur le onclick on laisse le nomfichier en parametre de la fonction confirme pour pouvoir le mettre dans le champ caché si l'utilisateur confirme la suppression
?>
<tr onmouseout="this.style.background='#CCBBFF';" onmouseover="this.style.background='#DEF5FE';">
<td onClick="javascript:confirme('<?php echo $nomFichier;?>');" width="250" valign="top" class="borderright">

<?php echo $nomFichier;?>
</td>
</td>
</tr>
<?
}
}
closedir($dossier);
echo "</form>";
?>

</html>

voili
apres si tu modifie encore ton exemple et que tu veux qu'il puisse en suppr plusieurs, tu peux utiliser des cases a cocher ou alors si qu'un a la fois des boutons radios....

en esperant avoir réussi à expliquer...

si t'as besoin, si c pas kler hésite pas (gueule pas trop fort non plus) :)
Messages postés
2
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
4 août 2004

Bonjour aurelien0306,

Formidable ! On ne pouvait mieux expliquer, avec deux exemples en plus ! Mille mercis.
J'ai choisi le deuxième mais il me reste quelques petits problèmes que j'aurais du mal à saisir sans ton aide.

1. Pourquoi je ne peux utiliser les codes entities dans les messages d'alerte JS, à propos des caractères accentués ? Par exemple, si je fais «annulé», il affiche tel quel et si je fais «annulé» il affiche «annulZ».

2. Pourquoi, contrairement à ton premier exemple de traitement des réponses à confirm(), tu ajoutes un else
{
/* nom de fichier posté mais incorrect */
/* traitement éventuel à faire */
}
Pourquoi le fichier posté pourrait-il être incorrect s'il a été affiché correctement dans la routine readdir ? S'agit-il d'un problème de permission à traiter avec un chmod ? Quel traitement devrais-je appliquer ?

3. Pourquoi tu dis «(gueule pas trop fort non plus)» ? La taille de ma police de caractère est-elle trop grande ? (je suis trop loin de ton moniteur, je ne vois pas ce que cela donne chez toi )

Ben :big)
Messages postés
181
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
2 mars 2009

salut (désolé pour le retard mais g jamais été prévenu que tu avais répondu :sad) tu as bien fait de me prévenir par MP)

1. Pour ton prblème d'entities, je ne sais pas d'ou ça vient, moi il m'affiche très bien le é... alors je sais pas je dis surement n'importe quoi mais essaie de rajouter ça entre tes balises <head></head> :

<meta http-equiv="content-Type" content="text/html; charset=iso-8859-1" />

(je sais que sous windows le é dans l'alerte js fonctionne bien sans passer par les entities.. mé sinon ...)

2. pour le coup du else dans le deuxieme exemple c'est que je fais pas comme dans le premier : dans le premier je faisais direct $nomfichier = (string) @$_GET['nomfichier'];

donc si $nomfichier était passé dans l'url alors on récupérait la valeur que l'on convertissait en string, sinon dans le cas contraire, $_GET['nomfichier] renvoie une erreur (car 'nomfichier' n'existe pas dans le tableau $_GET donc avec le @ on ignore l'erreur et on se retrouve donc avec une chaine vide dans $nomfichier.

Dans le deuxieme cas, j'ai fait quelque chose d'a mon avis un peu plus propre, j'ai d'abord regardé si on avait $nomfichier de posté (isset(...) ) (le cas contraire il est pas posté)
si il est posté je le récupère et apres je teste la longueur pour éviter d'avoir une erreur dans mon unlink au cas ou $nomfichier serait vide.... je me dis on sait jamais et plutot que de pas comprendre si un jour une erreur survient pourquoi il fait une erreur dans le unlink et que ce soit a cause d'un nom de fichier pas bon,

ben je préfère tester... mais nan normalement le nom de fichier ne peut pas etre incorrect a cause de ta routine readdir...

mais bon moi je préfère prendre mes précautions lol

3. lol nan nan la taille de ta police n'est pas trop grande (celle de ton script est parfaitement normal) c'était car des fois ya des personnes qui s'énervent vite et qui disent direct "oué t'as rien compris ou c de la m..... ce que tu as dit" bref c'était pour te dire que si ça te convenait pas tu pouvais le dire sans gueuler (je peut pas savoir comment tu as l'hab de répondre)

voila....

encore désolé pour le temps de réponse je pige pas pkoi ça m'a pas choisi d'etre averti par mail lors d'une réponse... qui sait g ptet décoché mais alors c que je devais vraiment être a la masse

;) :sleepy)
-------------
Aurél :big)