Newsgroup: it.comp.www.php
Titolo: PHP/HTML/AJAX: eliminazione cartella/files attraverso OnClick()

Salve a tutti,
 
ho la necessità di rimuovere una cartella con tutti i suoi files all'interno tramite pressione di un tasto "cancel" presente in un form sfruttanto la proprietà onclick().
Il percorso della cartella è memorizzato in una variabile di sessione $_SESSION['del_path_dir'].
 
Dopo essermi documentato ho compreso che, trattandosi di una pagina mista HTML/PHP, dovevo necessariamente ricorrere ad una chiamata asincrona sfruttando la tecnologia AJAX (che purtroppo non conosco).
Ho cercato di comprenderne il funzionamento e ho preparato il codice che mi permettesse di raggiungere l'obiettivo; ...purtoppo senza successo (non mi meraviglio considerato che non ho fatto altro che sperimentare)!
Chiedo quindi aiuto, con la speranza che qualcuno di voi possa illuminarmi per comprendere cos'è che non funziona e/o come rimediare.
 
Qui di seguito le porzioni di codice relative ai due file chiamati in causa:
 
 
 
[btncftrsm.php] -> il file che contiene il codice dove è presente il pulsante.
 
<?php
session_start();
?>
<html>
<head>
 
<script type="text/javascript" src="../jquery/external/jquery/jquery.js"></script>
 
<script type="text/javascript">
function DelData()
{
var PathDel=$("#Path2Del").val();
$.ajax({
                type:'POST',
                url:'deltmpfiles.php',
                data:PathDel,
                success: function(response)
                {
                        rrmdir(PathDel);
                }
     });
}
</script>
</head>
<body>
<div class="container">
        <div class="row">
            <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
            <form method="post" action="conferma_2_0.php">
            <input type="hidden" name="confermato" value="true">
            <input type="hidden" name="Path2Del" id="Path2Del" value="<? echo $_SESSION['del_path_dir']?>" />
            <div class="row">
                <div class="col-xs-6 col-sm-6 col-md-6">
                    <input type="button" onClick="DelData()" value="Annulla e Modifica" id="Annulla e Modifica" class="btn btn-primary btn-block btn-lg" tabindex="1">          
                </div>
                <div class="col-xs-6 col-sm-6 col-md-6">
                    <input type="submit" value="Conferma e Trasmetti" class="btn btn-primary btn-block btn-lg" tabindex="2">
                </div>
            </div>
            </form>
        </div>
    </div>
</div>
</body>
</html>
 
 
 
 
[deltmpfiles.php] -> il file dove è presente il codice che dovrebbe provedere alla cancellazione della cartella e dei files contenuti in essa.
<?php
 
function rrmdir($strPATH)
{
                if (is_dir($strPATH))
                {
                        $objects = scandir($strPATH);
                        foreach ($objects as $object)
                        {
                                if ($object != "." && $object != "..")
                                {
                                        if (filetype($strPATH."/".$object) == $strPATH) rrmdir($strPATH."/".$object); else unlink($strPATH."/".$object);
                                }
                        }
                        reset($objects);
                        rmdir($strPATH);
                }
                echo "<script type=\"text/javascript\" charset=\"utf-8\">window.self.close()</script>";
}
 
/*
$percorso = $_POST['percorso'];
rrmdir($percorso);
 */
?>
 
 
 
Se qualcuno avesse un po' di tempo da dedicarmi, gliene sarei infinitamente grato.
 
 
Maurizio

 }
 
le variabili post devono avere una chiave ed un valore, tu stai mandando 
solo un valore, guarda gli esempi qui :
 
http://api.jquery.com/jquery.ajax/
 
 
In success stai chiamando una funzione php che risiede sul server (?!), 
mentre dovresti chiamare una funzione javascript che avverte l'utente  
delle esito dell' operazione (che sta dentro response).
 
 
 

WTECH di Maurizio Romano ha pensato forte :

Ti mando un esempio.
Una chiamata aiax (no jQuery) ad un file AjTest.php
Il metodo è quello più complesso POST ma penso ti basterà usare il 
metodo GET eseguendo  una analisi in php più semplice dell' arrivo al 
server
 
Ovviamente, il tuo file php deve rileggere la variabile di sessione e 
fare le operazioni richieste. Alla fine invierà al browser un ok se 
tutto è a posto. Con javascript leggerai la stringa di arrivo, se è ok 
o meno e ti regolerai di conseguenza
 
---  AjTest.html
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>frammento Ajax</title>
<script type="text/javascript">
	function AjTest(){
		var a={};
		a.testo = document.getElementById('divTest').innerHTML;
		a.key = 'keyPagina';
		var toServer = JSON.stringify(a);
		var xhr = new XMLHttpRequest();
 
		xhr.open('POST', 'AjTest.php');
		xhr.setRequestHeader("Content-Type", "text/plain");
		xhr.send(toServer);
 
		xhr.onreadystatechange=function(){
			if(xhr.readyState==4 && xhr.status==200){
				document.getElementById('divArrivo').innerHTML = xhr.responseText + 
'&nbsp;: !Ok ritorno al browser';
			}
		};
	}
</script>
</head>
<body>
	<div style="margin-left: auto; margin-right: auto; margin-top: 
25px;width:400px;">
		<span>Digita un testo:</span>
		<div id="divTest" style="border: 1px solid;width:300px; height:30px;" 
contenteditable="true"></div>
		<br>
		<button id="buttonTest" style="width:150px; clear: left;" 
onclick="AjTest();">INVIA</button>
		<br>
		<div id="divArrivo" style="color:red; margin-top:20px;"></div>
	</div>
</body>
</html>
 
 
---  AjTest.php
<?php
header('Cache-Control: no-cache, must-revalidate');
 
$jarrivo=file_get_contents('php://input');
$arrivo = json_decode($jarrivo);
 
echo 'Server arrivo Ok! : &nbsp;<b>' . $arrivo->testo . ' + ' . 
$arrivo->key . '</b>';
 
 
Bye.  S.E & O.
 
-- 
Alex
 
--- news://
freenews.netfront.net/
 - complaints: 
ne...@netfront.net
 ---


Buonasera,
 
do immediato riscontro breve a RedWiz, ringraziandolo e confermandogli che effettivamente sono piuttosto impreparato sull'argomento e che è per questo motivo che sento la necessità di trovare un'anima pia che possa aiutarmi nel risolvere il mio problema.della mia presenza quì.
Grazie per i link; sapevo che la tecnologia va approfondita. Se non fosse per l'urgenza che ho, mi sarei concesso il lusso di studiare per bene prima di ricorrere a determinate soluzioni. Purtroppo la chiamata in causa di AJAX non me l'aspettavo e sono con un sito (già online) che necessità urgentemente di questa funzionalità.
 
Sono consapevole di aver dato la sensazione di non avere le idee chairissime!
Infatti è così! :-/
Prima di rispondervi, ...ho cercato ancora di approfondire, ...quindi sono consapevole della sciocchezza di chiamare un funzione che sta sul server, tramire success!
 
Invece, per dare un riscontro ad Alez, che ringrazio, ...dico che ho analizzato con molta attenzione l'esempio che mi ha gentilmente postato. Hai ragione quando affermi che si tratta di un esempio complesso; infatti lo è così tanto (per me) che non sono sicurissimo di essere così bravo da riportarmi al mio problema, riadattando gli spunti sul codice che dovrebbe servire la mia causa.
Per esempio, non ho ben compreso cosa fa
 
a.key = 'keyPagina';
 
E ancora, nel tuo esempio, il valore che viaggia verso lo script viene prelevato attraverso
 
a.testo = document.getElementById('divTest').innerHTML;
 
Ma nel mio caso, dovrei passare una variabile di sessione
 
$_SESSION['del_path_dir']
 
Ma come?
 
E soprattutto, ...nel file che sta sul server c'è il codice relativo ad una funzione per la cancellazione della cartella con i files che ci stanno dentro! L'argomento come lo passo?
Insomma, ...ho davvero bisogno di un tutor telematico! :-)


 
Visto che hai un urgenza e non sai come fare (e, da quanto scrivi, ti manca
ben più della conoscenza di AJAX), cerca un programmatore, fagli fare il
lavoro, pagalo e poi (se ti va) leggiti il codice.
Tieni presente che, anche tu ce la facessi da solo, quello che scrivi poi
lo dovrai pure manutenere.
 
Ciao

 Ma come?
 
Il piccolo esempio html è solo indicativo. Tu ci metterai il tuo html 
con chiamata ajax collegata ad un pulsante se ho capito.
Non ti serve passare una variabile di sessione perché dovrebbe essere 
già stata impostata. Devi rileggerla in AjTest.php, però dovresti 
davvero passare un id di pagina al server.  Se usi ajax con il metodo 
GET allora chiamerai  AjTest.php?keyPagina=qualcosa
Dopo di che usi (in AjTest.php) il tuo codice php per fare le 
cancellazioni.
Quando ha finito controlli che sia tutto a posto e mandi un 'ok' dal 
server al browser. Con il javascript lo leggi e ti orienti in base alla 
risposta.
 
Comunque un tantino di pratica è necessaria, specialmente per evitare i 
famosi buchi.
L' idea di un programmatore terzo, per questa singola chiamata, non è 
malvagia.
 
Bye


Il giorno martedì 26 gennaio 2016 13:13:32 UTC+1, WTECH di Maurizio Romano ha scritto:

Buonasera a tutti,
Vi ringrazio per i suggerimenti, le indicazioni, i consigli e la pazienza dimostratami.
 
Spero di sfruttare al massimo i preziosi spunti giunti in questa discussione.
 
 
Saluti.
 
Maurizio
 
Maurizio

 lo dovrai pure manutenere.
 
Quoto.
 
 

  */
 
Cioè esattamente quello che hai commentato qui. :P
 
Come ti hanno già detto, poi, hai già la variabile in sessione sul server, 
non serve (ed è pericoloso) mandarla a client per farsela rimandare 
indietro.
 
Ti basta un rrmdir($_SESSION['del_path_dir'])
 
Ora capisco l'urgenza e la necessità di imparare (per questo te l'ho 
spiegato), ma ripeto: se sbagli qualcosa chiunque potrà cancellare 
qualsiasi file sul tuo server, quindi fai esperimenti in privato su un 
server che puoi permetterti di perdere e dover formattare, ma non usare 
quello che ti ho detto in produzione.
 
Bye.
 

Ciao Alessandro,
 
Ringrazio anche te, per la pazienza con la quale ti sei soffermato nel rispondermi.
In effetti, le porzioni di codice che ho postato, alcune delle quali commentate (te ne sei accorto), sono la risultante di modifiche e modifiche apportate ad un codice che inizialmente era più' pulito e forse anche più' vicino ai risultati che devo, al più' presto, raggiungere.
Inizialmente, infatti, l'approccio era più' prossimo a quanto da te rimarcato (anche se non privo di errori), ma poi, assenza di risultati, disperazione e scarsa conoscenza, mi hanno portato a rendere il codice quel che hai visto anche tu.
Preziose le precisazioni che voluto darmi; ...rivedro' il codice tenedone conto e prestero' massima attenzione alla sicurezza (non pensavo che rimuovere una cartella temporanea sul server mi esponesse cosi' tanto).
Quindi, ...il nodo sta nello script ajax con il quale devo impartire l'ordine al server di eseguire il codice presente nel file.php che lo contiene senza preoccuparmi di passare il path (visto che una variabile di sessione lo contiene, anche se per un brevissimo momento)!
E fare in modo di innescare questo meccanismo sruttando l'evento on click di un pulsante "annulla".
Speriamo bene.
Ancora grazie.

 e forse anche più' vicino ai risultati che devo, al più' presto, raggiungere.
 
"Prima di ieri perché ho premura"
 
Puoi spiegare il problema vero alla bas?
Non intendo "devo cancellare una directory sul server premendo…" che è 
come l'hai riassunto ma quello a monte che ti fa pensare che "devi 
cancellare una directory". Magari è un XY e qualcuno ti indica una 
strada migliore.
 
Per la cronaca hai fatto una domanda _molto_ migliore di tante altre 
che compaiono spesso sul gruppo e che con PHP non c'entrano una fava - 
tipo i database o le configurazioni varie dei webserver, dalla cache a 
redirect- perché almeno hai postato il codice a cui sei arrivato dopo 
qualche sforzo, ed esr riposa contento.
 
-- 
Andrea
 


C.mo Andrea, buongiorno anche a te.
Intanto grazie per la considerazione e per la tua incoraggiante pazienza.
Effettivamente chiedi bene ed io cercherò di risponderti in maniera dettagliata, sapendo che approfitterò del tuo prezioso tempo. Sorry!
Ho realizzato un applicazione in PHP (già funzionante e regolarmente utilizzata dagli utenti) che in alcune fasi di calcolo, genera delle cartelle con all'interno dei files.
A seconda dell'esito dell'elaborazione (il risultato è al vaglio dell'utente tramite la visualizzazione di una preview all'interno di una popup) queste cartelle, se il risultato non soddisfa l'utente, potrebbero diventare inutili e quindi andrebbero eliminate.
Ed eccoci giunti al mio ostacolo: nella popup con la preview ho due pulsanti (Annulla/Modifica) e (Accetta/Trasmetti).
Sul primo dovrei incentrare le funzionalità per rimuovere la ormai famosa ed odiata cartella con i files al suo interno! :-/
Vincolato dal metodo POST per un eventuale conferma dell'elaborazione (guardando il codice noterai che i due pulsanti fanno parte di un banale FORM), pensavo di appoggiarmi sull'evento OnClick del primo pulsante così da rimuovere i dati dell'elaborazione.
Ho la sensazione che la soluzione del mio problema sia più semplice di come mi stia sembrando e che il nodo sta solo nell'esatta impostazione dello script AJAX con il quale devo poter indirizzare l'ordine al server per eseguire il codice utile ad eliminare la cartella.
Tutto quì.
 
Ancora grazie per l'attenzione. Ti auguro una serena giornata e buon lavoro.
 
 
Maurizio.


E quindi il codice del sito l'hai scritto tu e ci tieni a completarlo 
tu.
Comprensibile.
Beh, con un po' di pazienza e un certo numero di prove inquadrerai ajax 
e ne verrai a copo.
Nel caso ti servisse (non oneroso) un ambiente di sviluppo, dove 
inserire un robots.txt che vieta l'indirizzamento ai bot, fammelo 
sapere.


 sapere.
 
Eh?
 
-- 
Andrea
 


@Alex.
Grazie - ricevuto - ne terrò conto.
 
@Andrea.
Quel tuo "Eh?" è rivolto ad Alex?
Oppure è rivolto a me? (La mia isposta alla tua domanda di ieri, sta immediatamente prima dell'ultimo intervento di Alex).
 
 
Saluti a tutti e due...

 
 
Fermo restando quello che ho scritto sopra...
 
Non ti serve necessariamente Ajax, puoi fare anche una pagina come tutte le
altre. Ajax in questo caso servirebbe solo per rendere l'interfaccia più
interattiva, ma niente ti vieta di mettere un bottone o un link ad una
seconda pagina che effettua la cancellazione, scrive "ok, ho cancellato"
e un link "torna indietro".
 
Per punti bonus: collegandosi a quello che ha scritto Alessandro, visto che
le tue cartelle vengono da un processo residente sul server, non c'è bisogno
di trasmettere (o di far vedere, per questo) all'utente il path di suddetta
cartella; se l'utente vuole cancellare "i file di preview del processo
tal-de-tali" il server già sà di quale cartella si tratta.
 
Ciao!

.
 
-- 
Andrea