Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

PHP:passare variabili per url nascondendole come in $_POST

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

PHP:passare variabili per url nascondendole come in $_POST

Postdi GAD » 03/08/05 20:13

Sto iniziando a programmare in php, ho trovato un inghippo stupidissimo che pero' non riesco a risolvere.
Il mio problema e' che ho una pagina con un bel link del tipo:
<a href="ciccio.php?azione=fai_qualcosa"> chiama ciccio</a>
Nella pagina richiamata "ciccio.php" vorrei catturare la variabile "azione"...il metodo get pero' e' troppo facile. Vorrei passare i dati col metodo post attravero url per fare in modo che nella statusabar ne nella barra dell'indirizzo compaiano mai i dati accodati...ossia compaia solo "http://ciccio.php".
Non posso usare form e gradirei non cambiare header perche' provando la funzione header(); ho visto che mi genera dei bei conflitti dicendo che l'header non puo' essere cambiato ecc.. vorrei evitare anche l'utilizzo di coockie perche' non sempre la gente li abilita.
Che voi sappiate c'e' un modo semplice per passare dei parametri in modo nascosto simil post?
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Sponsor
 

Postdi Mone » 03/08/05 22:44

una funzione javascript che conpila un form tutto nascosto con metodo POST
:)
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi Mone » 03/08/05 22:57

beh già che ci sono:
Codice: Seleziona tutto
<script>
   function chiamaCiccio() {
        document.chiamaCiccioForm.submit();
   }
</script>
<form name="chiamaCiccioForm" id="chiamaCiccioForm" action="ciccio.php" method="POST">
   <input type="hidden" name="azione" value="fai_qualcosa">
</form>
<a href="javascript:chiamaCiccio()">chiama ciccio</a>


Ho notato ora:
Non posso usare form


Beh potresti usare xmlhttp allora, ma così non avrai il ricaricamento della pagina...mmm...ma perchè npn puoi usare i form??
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi GAD » 03/08/05 23:46

mmm...ma perchè non puoi usare i form??

e facilitarmi cosi' la vita??
E' che ho un pannello di controllo amministrazione molto ma molto complesso... un po' come quello di phpmyadmin per intenderci.
Ogni link di sto pannello e' un'azione ben precisa che richiede il passaggio di variabili differenti.
Mettere delle form solo per sfruttare l'action post funzionerebbe ma mi pare solo un trick per non cadere nel problema, poi visto che l'azione e' specifica per ogni link dovrei mettere una form per ogni link che ora e proprio la cosa non mi gusta.
Ho cercato in giro e mi pare strano che una cosa cosi' semplice non sia per niente documentata e sia impossibile da realizzare senza sfruttare strutture a basso livello come tag form o coockie...non sai come mi fa incavolare la sta cosa! In fondo se il passaggio di dati post funziona nelle form , per come la vedo io dovrebbe essere una caolata sfruttare la stessa funzionalità per qualunque passaggio di variabile per url... se non hanno implementato sta cosa in php limitandolo ai soli form non capisco proprio il perche'!
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi Triumph Of Steel » 04/08/05 00:17

io sinceramente non conosco altri metodi per passare variabili in POST se non dal form

e cmq non è necessario creare un form per ogni link!
basta che crei un form solo, metti un campo hidden che si chiama "azione" e per ogni link usi una funzione JS, che cambia il valore del campo nascosto "azione" e fa il submit del form!
Avatar utente
Triumph Of Steel
Moderatore
 
Post: 7852
Iscritto il: 22/08/01 01:00

Postdi Mone » 04/08/05 00:27

La questione è a livello concettuale.
con POST si intende una richiesta in cui i parametri sono nascosti nell'header, mentre in una richiesta GET i parametri stanno in coda all'url.

Comunque se il problema è il proliferare dei form sappi che li puoi creare al volo
Codice: Seleziona tutto
var form = document.createElement("form");
form.setAttribute("method","post");
form.setAttribute("action","ciccio.php");
var input = document.createElement("input");
input.setAttribute("type","hidden");
input.setAttribute("name","azione");
input.setAttribute("value","fai_qualcosa");

form.appendChild(input);
var container = document.getElementById("container");
container.appendChild(form);
form.submit();

inserendo questo nel body:
Codice: Seleziona tutto
<div id="container"></div>

Conta che poi in javascript puoi creare funzioni come questa:
Codice: Seleziona tutto
function doSomething() {
   var form = document.createElement("form");
   form.setAttribute("method","post");
   form.setAttribute("action","ciccio.php");
   var i=0;
   while (this.doSomething.arguments.length >= i+2) {
      var input = document.createElement("input");
      input.setAttribute("type","hidden");
      input.setAttribute("name",this.doSomething.arguments[i]);
      input.setAttribute("value",this.doSomething.arguments[i+1]);
      form.appendChild(input);
      i += 2;
   }
   var container = document.getElementById("container");
   container.appendChild(form);
   form.submit();
}

E quindi ti verrà poi semplice modificare i link così:
Codice: Seleziona tutto
href='javascript:doSomething("azione","fai_qualcosa");'
href='javascript:doSomething("azione","fai_qualcosaltro","nome_param1", "param1");'
href='javascript:doSomething("azione","fai","paramX","6","paramY","3", "paramZ", "1");'


Che ne dici?
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi Mone » 04/08/05 00:51

se non hanno implementato sta cosa in php limitandolo ai soli form

No php non c'entra proprio, è nel come viene implementata la richiesta dal browser.

Ecco guarda, questo è quello che viene inviato dal browser al server quando fai una GET

Codice: Seleziona tutto
GET /cartella/pagina.php?param=param&parametro2=valore2 HTTP/1.0
Host: www.sito.it

mentre per un POST
Codice: Seleziona tutto
POST /cartella/file.php HTTP/1.0
Host: www.sito.it
Content-Length: 32

param=param&parametro2=valore2


Se ti interessa tutta la "storia" la trovi qui:
http://www.ietf.org/rfc/rfc2616.txt
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi GAD » 04/08/05 12:11

Dopo provo la scappatoia ma la soluzione javascript non me gusta molto, volevo rimanere solo sul php puro.
Sul get\post e' vero che dipende dalle richieste del browser ma e' sempre vero che essendo php un servizio che gira su server poteva benissimo essere implementata una funzione che reindirizzasse le richieste alla stregua di session_start a inizio script per rinfrescare i dati sessione.
Per esempio io passo per uri dei parametri con l'header get alla pagina fai_qualcosa.php ed obbligo il server a leggere quei parametri col metodo post mettendo nell'intestazione della pagina una funzione che forza la lettura in quel modo tipo SetPostMethod();... cioe' la vedo da programmatore che lavora ad un servizio di rete, essendo un servizio posso mettere le mani dove voglio e decidere di sviluppare in una direzione o in un'altra andando a colmare lacune che ci sono nello standard http e creando soluzioni nuove.
Altra cosa che non mi e' chiara e' come mai per uri si possono passare parametri semplici e array ma oggetti no... se io stanzio nella prima pagina un oggetto che mi contiene tutti i parametri creero' sul server un puntatore a questo oggetto. Passando alla pagina successiva dovrei poter passare il puntatore all'oggetto perche' in realtà e' ancora in memoria sul server... come un normale passaggio per puntatore in c++.
Quindi nella pagina seguende dovrei poter rifare un get dato il puntatore e riottenere il mio oggetto... invece anche su phpclasses non ho mai trovato alcun esempio su questo, al max passaggi di array.
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi archimede » 04/08/05 12:34

GAD ha scritto:Altra cosa che non mi e' chiara e' come mai per uri si possono passare parametri semplici e array ma oggetti no... se io stanzio nella prima pagina un oggetto che mi contiene tutti i parametri creero' sul server un puntatore a questo oggetto. Passando alla pagina successiva dovrei poter passare il puntatore all'oggetto perche' in realtà e' ancora in memoria sul server... come un normale passaggio per puntatore in c++.
Forse dimentichi che l'HTTP è stateless: non c'è alcuna garanzia che, alla richiesta della seconda pagina, ci sia ancora in memoria il puntatore creato nella prima. Anzi, non sei nemmeno sicuro che ti risponda lo stesso server!

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi GAD » 04/08/05 12:53

Esatto, ma queste sono casistiche che gestirà il programma interprete dello script sul server... es. se l'utente va misteriosamente giu' il server farà una flush dell'area di memoria utilizzata per tenere gli oggetti.
Cosa che credo avvenga gia' in automatico.
Per esempio ho fatto funzioi che data una cartella creano un array con dentro tutti i path alle immagini presenti in tal cartella e mi trascino sto array dietro per un po' di pagine via uri visualizzando solo 10 immagini alla volta per pagina (ok stupido a livello computazionale ma funziona e volve capire il meccanismo).
Quindi mi viene da pensare che sul server ci sia effettivamente un'area di memoria che contiene il mio array e passando di pagina in pagina non faccia altro che ripassarmi il puntatore alla stesa struttura allocata.
Nel caso in cui il client interrompesse la connessione credo che il server ripulirebbe l'area di memoria usata per tenere i dati relativi alla tal connessione no?
Forse interpreto male il comportamento, e' che pensando da programmatore la logica mi suggerisce che grosso modo la gestione avvenga cosi'.
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi archimede » 04/08/05 13:12

GAD ha scritto:...se l'utente va misteriosamente giu' il server farà una flush dell'area di memoria utilizzata per tenere gli oggetti.
...
Nel caso in cui il client interrompesse la connessione credo che il server ripulirebbe l'area di memoria usata per tenere i dati relativi alla tal connessione no?
Forse interpreto male il comportamento,
Temo di sì.

Il client (browser) fa una richiesta al server: nel momento in cui il server ha inviato la risposta i giochi sono fatti. La successiva richiesta, anche se proviene dallo stesso client, sarà trattata come una nuova richiesta. Questo è, credo, l'essenza fondamentale dello stateless: non ci sono aree di memoria "riservate" ad un utente specifico se non nel tempo necessario per soddisfare UNA richiesta.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Mone » 04/08/05 13:23

Mmmm.... ????

Alcune considerazioni:
1) Non c'è niente da fare, se la richiesta parte in GET arriva in GET, anche se il PHP ti consentisse di vederla come se fosse arrivata in POST non cambia nulla, il browser visualizzerà il link con tutti i parametri.
Sul get\post e' vero che dipende dalle richieste del browser ma e' sempre vero che essendo php un servizio che gira su server poteva benissimo essere implementata una funzione che reindirizzasse le richieste alla stregua di session_start a inizio script per rinfrescare i dati sessione.

Lo dici tu anche ch'è lato server, come può reindirizzare una richiesta lato client???
2)
andando a colmare lacune che ci sono nello standard http

L'HTTP è richiesta -> risposta, come vedresti la soluzione che non ho capito?
richiesta -> ???? -> risposta
Non ti seguo proprio
3)
Altra cosa che non mi e' chiara e' come mai per uri si possono passare parametri semplici e array ma oggetti no...

In realtà quando passi un array passi i parametri uno dietro l'altro, quindi in realtà puoi passare SOLO parametri! Puoi sempre salvare le variabili in sessione no?
4)Ma che ti ha fatto javascript?? Poi la mia non è una scappatoia, ma una soluzione ragionevole, sono meno di 20 righe di codice + i link da modificare.

CONCLUSIONE: se pretendi di avere il link così:
<a href="ciccio.php?azione=fai_qualcosa"> chiama ciccio</a>
e vuoi che appaia così "ciccio.php" nella barra indirizzi non hai speranze.
Non senza usare Javascript.
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi Mone » 04/08/05 13:24

[OT]Sono diventato utente senior!!!!:D 8) [/OT]
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi GAD » 04/08/05 13:25

Il client (browser) fa una richiesta al server: nel momento in cui il server ha inviato la risposta i giochi sono fatti

Normalmente si, ma se il server web lo prevede e gestisce la roba a modo suo la cosa e' fattibile. Io posso fare un server web che cacha tutto e lo identifica utilizzando il macaddress del lato client e poi svuota la memoria ogni 10 minuti se non ci sono altre connessioni con quel mac address, nessuno me lo proibisce.
By the way nello specifico del php per il passaggio di array interi per uri ci deve essere per forza una memoria persistente altrimenti le uniche spiegazione per il passaggio dell'array stesso sarebbero:
1) l'array viene salvato su file temporaneo e ricaricato in base a qualche identificativo che mi dice che il client e' il meesimo (pare dispendioso, tanto vale usare persistenza in memoria)
2) l'array viene passato al client dalla pagina 1, il server svuota la memoria allocata, il client quando accede alla pagina dopo reinvia tutto l'array al server che realloca e il loop riprende finche' il client scorre le pagine (anche questa mi pare troppo dispendiosa, rispedire roba via rete e riallocare ad ogni richiesta e' mille volte piu' pesante che gestire dati per persistenza sempre in memoria server)

Archimede nello specifico dell'esempio dell'array che viene trasportato attraverso piu' pagine php tu come la vedi? sto cercando di capire il meccanismo
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi archimede » 04/08/05 14:29

GAD ha scritto:Archimede nello specifico dell'esempio dell'array che viene trasportato attraverso piu' pagine php tu come la vedi? sto cercando di capire il meccanismo
Non conoscendo PHP, non la vedo nè male nè bene: posso solo ipotizzare che stiano nell'header della pagina o similia.

Nè, francamente, mi sono mai spinto più di tanto addentro a certi meccanismi.

Buona esplorazione.

Alessandro

PS:
Io posso fare un server web che cacha tutto e lo identifica utilizzando il macaddress del lato client e poi svuota la memoria ogni 10 minuti se non ci sono altre connessioni con quel mac address, nessuno me lo proibisce.
Naturalmente stai scherzando, vero? Perchè se mai ti dovesse capitare di installare siffatto Webserver su più macchine con load balancer, cache e compagnia cantante, sai che ridere?
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Mone » 04/08/05 18:45

...e se facessi un frameset con 2 frame, il primo che ha dimensione 100% conterrà il tuo sito, l'altro puoi lasciarlo anche vuoto, in questo modo nella barra in alto l'indirizzo rimmarrà sempre lo stesso.
che ne pensi?
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi GAD » 04/08/05 18:49

mone l'ultima e' buona come idea, provo anche quella.
Mi sta venendo quasi voglia di fregare il sistema... faccio un activex che passa tutto via winsock nel modo in cui voglio io ad un serverino che gira su altra porta oltre al webserver classico... rimedio estremo per decidere come e cosa passare
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi Mone » 04/08/05 19:12

faccio un activex
:evil: :lol:
che passa tutto via winsock

Non conosco ma credo si tratti di qualcosa per aprire socket da un browser?
Io piuttosto (ho un odio represso per gli Activex scusa...) farei così:
1)Secondo me l'idea del form creato al volo era buona e comporta l'aggiunta di pochissimo codice a quello già esistente, mentre IMMagino che un po' di roba in più la dovrai scrivere per fare un ActiveX (e poi su FF, Opera Safari etc. etc. non gira :P)
2)Ora le richieste senza associarle a una window le puoi fare anche in Javascript grazie a xmlHttp, guarda questi link:
http://jibbering.com/2002/4/httprequest.2004.html
http://www.microsoft-watch.com/article2 ... X1K0000535
(e poi ActiveX su FF, Opera Safari etc. etc. non gira :P )
Avatar utente
Mone
Utente Senior
 
Post: 343
Iscritto il: 21/10/03 19:44
Località: Zion

Postdi GAD » 04/08/05 20:31

mone dicevo per dire, la risolvo col metodo che hai detto e se piu' avanti quando avro' tempo la cosa prenderà piede vedro' di farmi una soluzione in stile ocx\webservice se proprio deve diventare na cosa sburra cosi' vedo di gestire la roba che mi serve nel modo che mi torna piu' comodo.
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
GAD
Moderatore
 
Post: 2184
Iscritto il: 22/09/02 14:36
Località: Nebbiosa

Postdi piercing » 04/08/05 23:49

non ho letto tutto... ma non capisco perchè andrebbe creato un form per ogni link... basta assolutamente un form solo...

per il resto il GET è il GET, e il POST è il POST e si passa da un form...
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma


Torna a Programmazione


Topic correlati a "PHP:passare variabili per url nascondendole come in $_POST":


Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti