Immagazzinare uno specifico valore di $_GET

Ciao a tutti,

Ho un piccolo problema, sicuramente é banale ma non riesco a risolverlo.

Ho bisogno di immagazzinare due valore dell'array GET che passo insieme al messaggio d' inserimento record analogo all'esempio della vs lezione n.5  "inserimento effettuato con successo (id=$id_inserito)"; quindi ho creato una struttura analoga (inserisci_record - mostra_form).

Ho provato ad immagazzinare i due valori passati in questo modo:

$id_production_unit_p = $_GET['id_production_unit_p'];
$id_bank_account_p = $_GET['id_bank_account_p'];
$id_production_unit_p2 = $id_production_unit_p;
$id_bank_account_p2 = $id_bank_account_p;

credento che $id_production_unit_p2, $id_bank_account_p2 mantenessero i due valori fino al prossimo inserimento, ma non é cosi'.

Purtroppo nel proseguo della funzione mostra_form ho anche due select sincronizzate con un sistema javascript/GET  quindi appena le attivo perdo il valori di $id_production_unit_p2 e $id_bank_account_p2.

Quindi volevo chiedervi:

Che sistema potrei usare per mantenere questi due valori  di $_GET fino alla fine della funzione mostra_form, per poi essere aggiornati al prossimo inserimento?

Ciao a tutti e grazie in anticipo.

Amos

inviato 9 anni fa
amosse
X 0 X

Tutte le variabili PHP vengono perse al termine dell'esecuzione di uno script. Per conservarne il valore si utilizzano diverse tecniche e stratagemmi, tra cui la memorizzazione in sessione. Se hai tempo leggi qui:

http://www.phpnews.it/articoli/php/il-passaggio-delle-variabili-e-la-gestione-dello-stato/

http://www.phpnews.it/articoli/php/le-sessioni/

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ciao

Grazie della risposta.

Approfitto un attimo della tua disponibilità per chiarire un paio di concetti importanti per un principiante come me:

Quando dici che le variabili PHP vengono perse al termine dell'esecuzione di uno script, intendi dire alla chiusura cioé quando scrivo ?>    ??

No perché nel mio caso specifico io perdo i valori di GET durante l'esecuzione del mio script, avendolo strutturato in questo modo:

<?php
if($_POST) {
   insert_fin_record();
}
else {
   show_fin_records();
}

function insert_fin_record()
{
............................................
}
function show_records()
{
// mostro un eventuale messaggio
if(isset($_GET['msg']))
echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';

$id_production_unit_p = $_GET['id_production_unit_p'];
$id_bank_account_p = $_GET['id_bank_account_p'];
$id_production_unit_p2 = $id_production_unit_p;
$id_bank_account_p2 = $id_bank_account_p;

echo ('il valore di $id_production_unit_p2='.$id_production_unit_p2);
echo '<br>';
echo ('il valore di $id_bank_account_p2='.$id_bank_account_p2);

............................................
}
?>
<SCRIPT language=JavaScript>
function reload(form){
var val=form.id_production_unit.options[form.id_production_unit.options.selectedIndex].value;
self.location='insert_fin_records3.php?id_production_unit=' + val ;
}
</script>

Per capire come funziona $_GET come vedi  ho messo degli echo subito dopo il recupero delle query string passate via GET (header) tramite la function insert_record, per vedere quando andavano persi durante la lettura della funzione show_records .

Allora, questi valori si perdono quando passo ulteriori valori all'array GET , cioé quando aziono le select sincronizzate che interagiscono con  javascript via GET (all'interno della funzione show_record)

Allora per capire, quanto dici che Tutte le variabili PHP vengono perse al termine dell'esecuzione di uno script intendi dire non solo quando chiudi la connessione ?>, ma anche quando passi ulteriori valori (all' interno dello stesso script) all'array GET (come nel mio caso delle select sincro)?

Ti chiedo questo perché mi sembra di aver letto da qualche parte che l'array GET puoi settarlo sia in modo che i valori passati cancellano i precedenti, sia in modo da farli accodare ai precedenti.

Perché allora se questo é vero io potrei provare a usare la seconda opzione di settaggio e la cosa in teoria dovrebbe funzionare??

Forse ho detto uno sfondone, tu che dici?

Scusami ancora se approfitto della tua disponibilità.

Ciao

Amos

risposto 9 anni fa
amosse
X 0 X

Credo che quando ricarichi il form tramite il javascript le variabili si perdano, inoltre vorrei sapere quanto è lunga la stringa uri che passi, non si può oltrepassare un limite di caratteri con le get.

Anzi, io direi che a parte qualche piccolo valore numerico non conviene mai usare le get per il seguente motivo: se non sai quanto sarà lunga la stringa get, considera sempre che oltre a ciò che passi tu, ci può essere rappresentato anche il valore di sessione; se un utente non usa o comunque non carica i cookie di sessione entrando nel sito, questa viene mantenuta con una stringa passata via get.

Ora la stringa di sessione è lunga (se non ricordo male) 16 caratteri, più i nomi delle variabili che usi, più i valori portati dalle variabili, più l'uri vero e proprio del tuo host, che se sommati superano tutti assieme il valore di 256 caratteri perdi tutto.

Tu hai usato nomi di variabile enormemente lunghi che mal si conciliano con una get e già qui ti mangi parte dello spazio dell'uri.

Ora non so quanto sarà lunga la tua uri e probabilmente nemmeno è questo il motivo per cui ti perdi le get, ammetto che ho dato un'occhiata frettolosa al tuo script, ma quando ho visto quei nomi lunghi per una get .... orrore!

Meglio se non vuoi perdere il senso delle variabili che fai due cose: uno usi la notazione a "gobba di cammello" così risparmi caratteri togliendo l'underscore, e poi usi il POST che ti permette di passare valori lunghi, specialmente con i messaggi di errore.

Infine, ma è solo una questione di sicurezza, ti conviene memorizzare in un array i vari messaggi di errore e non passarli via get o post, e identificarli solo tramite un valore numerico, ne guadagni in sicurezza, altrimenti chiunque al posto del tuo messaggio di avviso può inserire un piccolo script realizzando così, una code injection.

risposto 9 anni fa
Marco Grazia
X 0 X

Ciao grazie della risposta.

Ti rispondo con molto piacere, se dico sfondoni correggimi pure.

Allora:

la stringa che passo via GET é questa:

http://localhost/amos-marzuoli.it/fr/insert_fin_records3.php?msg=Inserimento+effettuato+con+successo+%28ID%3D118%29&id_bank_account_p=12&id_production_unit_p=2

159 caratteri, quindi il problema non é la lunghezza,

le variabile che perdo mentre aziono il java script sono id_bank_account_p=12&id_production_unit_p=2

Per passarle via POST non saprei come fare perché ne ho bisogno all'interno della funzione show_fin_records, e queste arrivano invece nella funzione insert_fin_record?

Ti volevo chiedere, a titolo informativo:

Il valore di sessione é per caso %28ID%3D118%29, oppure quale?

E' possibile vedere se "un utente non usa o comunque non carica i cookie di sessione"?

Mi potresti segnalare un esempio (anche una disussione all'interno del forum) per vedere la gestione dei messaggi con l'array?

Cos'e' la notazione a gobba di cammello, mi potresti segnalare un esempio?

E visto che menzionate spesso l'utilizzo delle sessione, ho letto la documentazione di Gianni, non avreste degli esempi da segnalarmi (anche una disussione all'interno del forum)?

La cosa che dicevo sopra di settare l'array GET non é giusto, volevo dire che nella guida PHP della funzione header si parla dell'argomento opzionale replace, ma credo che non c'entri nulla.

Non saprei, se avete un suggerimento?

Ciao

Amos

risposto 9 anni fa
amosse
X 0 X

troppa carne al fuoco!!!

Partiamo dalle variabili di PHP: fatta eccezione per le variabili di sessione, tutte le altre nascono e muoiono all'interno della SINGOLA esecuzione di uno script. Per singola esecuzione intendo il processo che parte dalla richiesta fatta dal browser verso il server e si conclude con la visualizzazione della pagina richiesta nel browser.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ciao grazie della risposta.

Ti rispondo con molto piacere, se dico sfondoni correggimi pure.

Allora:

la stringa che passo via GET é questa:

http://localhost/amos-marzuoli.it/fr/insert_fin_records3.php?msg=Inserimento+effettuato+con+successo+%28ID%3D118%29&id_bank_account_p=12&id_production_unit_p=2

159 caratteri, quindi il problema non é la lunghezza,

Bene, ma comunque ti consiglio di non usare via get nomi di variabili lunghi, principalmente per due motivi: il primo te l'ho già detto prima, il secondo è relativo alla sicurezza di uno script, ovvero se usi variabili dal significato ambiguo o anonimo, per quanti possa sembrare strano, in realtà aumenti e di molto la sicurezza di uno script.

Ad esempio se via get passi un nome di variabile come ID (fantasioso nevvero?) e poi lo riprendi come id_bank_account_p = $_get['id'] comunque non dai indicazione ad un eventuale malintenzionato sul senso di quel nome.

Ho visto script che usavano get per passare variabili dal nome password o account, d'accordo non è il tuo caso, ma hai compreso immagino cosa volevo dire.

le variabile che perdo mentre aziono il java script sono id_bank_account_p=12&id_production_unit_p=2

L'avevo capito, ma credo che Gianni ti abbia già risposto per questo, quando esegui lo script, ovvero quando richiami la pagina attraverso il browser i get agiscono nell'ambito di quella chiamata, quando aggiorni la pagina, anche via javascript, tutti i valori passati si perdono, dato che non fai altro che richiamare di nuovo la pagina, come se fosse una nuova chiamata al server.

Per passarle via POST non saprei come fare perché ne ho bisogno all'interno della funzione show_fin_records, e queste arrivano invece nella funzione insert_fin_record?

O be non è difficile, nel form al posto di get usi la parola post (action='post') :) poi le variabili le riprendi con $_POST[] o mi sono perso qualche cosa?

Ti volevo chiedere, a titolo informativo:

Il valore di sessione é per caso %28ID%3D118%29, oppure quale?

No, non lo, quello è qualche cosa relativo alla codifica del'url, ma non so cosa.

E' possibile vedere se "un utente non usa o comunque non carica i cookie di sessione"?

Purtroppo no, d'altronde non ne hai bisogno, dato che il sistema passa in via del tutto trasparente i valori di sessione via url.

Mi potresti segnalare un esempio (anche una disussione all'interno del forum) per vedere la gestione dei messaggi con l'array?

Ah difficile :) i metodi sono moltissimi; tramite array:

$messaggi = array('vai a casa!', 'ci fai o ci sei?', 'hai sbagliato, riprova');
echo $messaggi[$_GET['msg']];

ovviamente l'esempio non tiene conto di eventuali errori o injection via url, è solo un esempio, ma la variabile numerica msg passata via url se ha valori compresi tra 0 e 2 emette a video il valore dell'array desiderato, provare per credere.

Oppure:

switch ($_GET['msg']) {
'0': echo 'vai a casa!'; break;
'1': echo 'ci fai o ci sei?'; break;
'2': echo 'hai sbagliato, riprova'; break;
default: echo 'bravo!';
}

stessa cosa come sopra ma senza usare un array e prevede anche il caso che la variabile msg non sia presente nell'url (default).

Cos'e' la notazione a gobba di cammello, mi potresti segnalare un esempio?

La spiegazione sulla notazione dei nomi di variabile o di funzione è comunque lunghissima e negli anni ci sono stati moltissimi esempi, con tante varianti; tu ne hai usato un tipo abbastanza buono, perché a colpo d'occhio fa subito notare le parti che identificano il nome: id_bank_account_p, non devo essere necessariamente te per capire cosa significa, almeno spero :)

A gobba di cammello diverrebbe così: idBankAccountP che come vedi è abbastanza esplicativo delle sue parti, ma nel complesso utilizza meno caratteri.

Java e Javascript sono due linguaggi che utilizzano estesamente la notazione a gobba di cammello per i nomi di funzione interna: getElementById() è solo un esempio, tanto per citare. Ovviamente ci sono molti altri tipi di notazione, io la preferisco ma non necessariamente è la migliore sia chiaro.

E visto che menzionate spesso l'utilizzo delle sessione, ho letto la documentazione di Gianni, non avreste degli esempi da segnalarmi (anche una disussione all'interno del forum)?

La cosa che dicevo sopra di settare l'array GET non é giusto, volevo dire che nella guida PHP della funzione header si parla dell'argomento opzionale replace, ma credo che non c'entri nulla.

Non saprei, se avete un suggerimento?

Ciao

Amos

 

Al momento no, ma tieni conto che come ti ha detto Gianni, c'è troppa carne al fuoco e come da regolamento nel forum si fa una domanda per volta, anche perché così chi legge può facilmente raggiungere le risposte o cercare la domanda a cui rispondere o leggere.

 :bye:

PS che versione di PHP stai usando o prevedi di usare sul server?

risposto 9 anni fa
Marco Grazia
X 0 X

Ciao

Grazie mille per le vs risposte, e scusate se mi dilungo un po' troppo negli argomenti più svariati.

Niente che dire..., le risposte sono molto chiare e soprattutto é chiaro che e bene iniziare a fare qualche prova con l'utilizzo delle sessioni.

L'unica cosa ritorno su la risposta di Marcolino, quando dici perché non usi al posto di GET il metodo POST?

Le variabili che perdo le ricevo dopo con il redirect del messaggio di avvenuto caricamento posto al termine della funzione di inserimento, non so.. come potrei fare con il POST? Non ho una form con cui caricare i dati all'interno della funzione di inserimento.

Comunque per il momento ho risolto semplicemente reinviando via GET le variabili che perdevo nella parte di script relativo alle impaginazioni (che funzionano con GET, e che mi creava i problemi più grossi),  e poi per la parte del javascript vedrò di modificarlo in modo da far reinviare sulla qry string anche le variabili in questione.

Ciao e grazie di nuovo. :D

Amos

risposto 9 anni fa
amosse
X 0 X

Ovviamente per passare i valori via post ci vuole un form (si può fare in un altro modo, ma non è cosa banalissima da fare).

Il get è comodo come hai scoperto pure tu, perché basta inserirlo in un url e poi lanciarlo o tramite una'ncora o tramite la funzione header del php.

Però non arrampicarti sugli specchi per fare una cosa che si fa normalmente con le sessioni :)

Ovvero all'inizio di ogni tuo script inserisci la funzione per il controllo delle sessoni:

session_start();

e poi puoi usare le sessioni subito subito. Ad esempio:

$_SESSION['id_bank_account_p'] = 12;
$_SESSION['d_production_unit_p'] = 2;

per riprendere i valori ti basta invertire i termini:

$d_production_unit_p = $_SESSION['d_production_unit_p'];

ovviamente il discorso sulle sessioni non si esaurisce qui.

risposto 9 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda