Newsgroup: it.comp.www.php
Titolo: foreach non va proprio...

Salve a tutti, questi giorni ho provato a portare a casa qualche bello 
script che avevo fato a lavoro, e come classico che sia mi stanno dando 
problemi. Secondo voi per quale motivo sul pc di casa non va questo codice?
Da pagina html passo i dati con form metodo POST, la pagina che riceve č 
cosě:
foreach($_REQUEST as $chiave => $valore){
    $chiave = $valore;
}
mi restituisce:
Notice: Undefined variable: titolo in C:\Program Files\Apache Software 
Foundation\Apache2.2\htdocs\vh3\newsMod.php on line 39
Notice: Undefined variable: descrizione in C:\Program Files\Apache Software 
Foundation\Apache2.2\htdocs\vh3\newsMod.php on line 39
praticamente non mi setta le variabili. L'unica cosa che mi viene in mente 
potrebbe dipendere dal register_globals disattivato? perchč al lavoro č 
attivo. Se si in che modo posso variare il codice?
grazie 1000 

 lavoro è attivo. Se si in che modo posso variare il codice?
register_globals va SEMPRE disattivato.
Disattivalo anche al lavoro.
Poi usa $_POST e $_GET per le variabili, non cercare scorciatoie per 
simulare register_globals.
Bye.

 attivo. Se si in che modo posso variare il codice?
No, dipende sempre dalle impostazioni del php.ini, ma in ambito di 
segnalazioni di errore: a casa hai evidentemente la direttiva
error_reporting = E_ALL
mentre al lavoro quella
error_reporting = E_ALL & ~E_NOTICE
Il "peccato veniale" di cui il sistema ti sta avvisando è che nomini 
una variabile all'interno di un ciclo senza averla inizializzata.
A rigore sarebbe meglio lasciare l'impostazione del php.ini su E_ALL, 
ma in effetti poi diventa piuttosto noioso, mi scusino i puristi... fai 
tu
-- 
Raffaele Masi
www.webmasterfirenze.it

 variabile all'interno di un ciclo senza averla inizializzata.
Il probema è che i dati non arrivano nelle variabili giuste con i nomi
campi, cioè la variabile titolo dovrebbe contenere il titolo invece resta
vuota. 

 vuota.
io 'sta variabile "titolo" nel tuo codice proprio non riesco a vederla
sicuro che la linea 39 sia tre quelle postate?
-- 
Web marketing & community management:
http://www.insistema.com/

 Foundation\Apache2.2\htdocs\vh3\newsMod.php on line 39
domanda, non è che nei nomi delle variabili che passi ci sono degli spazi?



Prova con:
foreach($_REQUEST as $chiave => $valore){
     $$chiave = $valore;
}
Cmq ti sconsiglio di utilizzare questa tecnica che compromette la sicurezza
della tua applicazione.

 domanda, non č che nei nomi delle variabili che passi ci sono degli spazi?
no nessuno spazio č semplicemente "user" e "pass".
vi posto la risposta che ricevo mettendo degli echo in questo modo:
foreach($_POST as $chiave => $valore){
 echo 'Chiave: '.$chiave.'  Valore: '.$valore.'<br />';
 $chiave = $valore;
}
echo 'User: '.$user.'<br />';
echo 'Pass: '.$pass;
exit;
OUTPUT:
Chiave: user     Valore: marco    <-- Come si puo vedere il valore arriva, 
ma non viene inserito nella variabile (chiave)
Chiave: pass     Valore: etst
Chiave: button  Valore: Accedi
Notice: Undefined variable: user in C:\Program.....
User: <-- Se stampo $user non restituisce nulla...
Notice: Undefined variable: pass in C:\Program.....
Pass: <-- idem con $pass
apero di essere stato piů chiaro.. thx

 della tua applicazione.
E come mi consigli di fare? C'è un altro modo? Non dirmi di assegnare una 
variabile allla volta...pls 

 }
evvaiiiiiiiiiiiiii cosi va!!!! ma cosa cambia con doppio $??? 
grazieeeeeeeeeeeeeeeeeeeee 

 C:\Program..... Pass: <-- idem con $pass
non vedi che la variabile $user non la hai mai valorizzata?
come speri di poterla avere disponibile?
hai le idee totalmente confuse!
ti consiglio di arti un bel po' di tutorial perchè ti mancano proprio le
basi (non tanto di php quanto di programmazione in generale):
1 - su come si assegnano dei valori alle variabili, che siano array o meno
2 - sui cicli
 
ti do la soluzione a QUESTO problema, ma non è la soluzione al TUO
	problema:
foreach($_POST as $chiave => $valore){
 
if($chiave =='user'){$user=$valore;}
if($chiave =='pass'){$pass=$valore;}
}
echo 'User: '.$user.'<br />';
echo 'Pass: '.$pass;
-- 


Grey ha scritto:

Se $chiave vale 'user', allora viene creata la variabile $user a cui 
viene assegnato il contenuto di $valore.

 idee molto confuse...
non mi sembra che tu abbia pienamente ragione Red, se hai fatto caso alle 
altre risposte il metodo c'č e come se c'č, ed č presente anche nel manuale 
del php. dai un occhiata... il tuo modo di risolvere il problema non va 
bene, perche se passo 50 variabili come faccio con il tuo sistema? le elenco 
tutte?? lo posso fare ma ci metto 1 anno!! 

 ha scritto nel messaggio
news:48ecccb7$0$1085$4faf...@reader2.news.tin.it...

La risposta giusta è proprio quella di disattivare il register_global e di
prendere a mano le singole variabili che servono dal $_GET o dal $_POST.
Il vantaggio di disattivare il register_globals consiste nella possibilità
di richiamare una variabile dal $_GET o dal $_POST soltanto se ti serve
(cioè se è previsto cha alla pagina PHP sia stata passata quella variabile)
e soltanto quando ti serve, cioè in quelle porzioni di codice che hanno
bisogno di quella variabile.
Cmq, al limite se conosci il nome delle variabili che ti sono state inviate
in POST (in GET è la stessa cosa...)
puoi fare così:
$arrayVar = array("user", "password");
foreach ($arrayVar as $var) {
    $$var = null;
    if (!empty($_POST[$var])) {
        $$var = $_POST[$var];
    }
}
L'arraty $arrayVar contiene i nomi delle variabili che vuoi prendere dal
$_POST (in questo caso ho supposto che siano "user" e "password").
Il ciclo foreach serve per ciclare su questo array. Dopo aver settato a
"null" (o a vuoto "" se più ti piace)
ogni variabile, controlli se è presente nel POST e se lo è assegni il valore
preso dal POST alla vartiabile
creata con $$var.
PS: $$var indica la variabile che si chiama come la stringa contenuta in
$var.

 elenco tutte?? lo posso fare ma ci metto 1 anno!!
Lo so, si chiama "fare le cose per bene", e da sempre richiede tempo.




Stai simulando il register_globals. Tanto vale che lo attivi, a questo 
punto, nel php.ini, e ti tieni tutti i buchi di sicurezza che stai aprendo.
Buona fortuna.
Bye.

 punto, nel php.ini, e ti tieni tutti i buchi di sicurezza che stai aprendo.
Alessandro ha pienamente ragione. E poi proprio non riesco a capire
perché quel ciclo for per ricrearti le variabili prese da una REQUEST,
quando poi alle righe successive vai a scrivere:
echo $user;
echo $pass;
Dico io, così come queste righe te le scrivi a mano, potresti
risparmiare tempo evitando di scrivere il ciclo for (e di farlo
eseguire) e passare direttamente a scrivere:
echo $_POST['user'];
echo $_POST['pass'];
Nell'ottica di quello che vuoi fare tu davvero non riesco a capire il
senso di ciò che vuoi fare. Se hai come dici tu un form con 50
variabili, sicuramente dovrai sapere come utilizzare ciascuna di queste
50 variabili. A quel punto evita il for per ottenere $$chiave, e usa
direttamente $_POST['chiave'], e fai le validazioni ad hoc.
-- 
rob4you

[cut]
prova a dare un'occhiata alla funzione extract() che forse č un po' meglio
di quel ciclo che fai...

 direttamente $_POST['chiave'], e fai le validazioni ad hoc.
dici direttamente nel codice? e se le devo inserire all'iterno di una query 
pensi che potrebbe darmi problemi scrivere direttamente $_POST['nome'] del 
tipo "WHERE id=$_POST['id']" ?
thx 

 di quel ciclo che fai...
nel manuale php ufficiale viene sconsigliato di utilizzare la funzione 
extract() con GET, POST proprio per motivi di sicurezza.
http://www.php.net/extract
 

 tipo "WHERE id=$_POST['id']" ?
Attenzione, _mai_ fare una cosa simile. Ma se è per questo, mai fare
nemmeno una cosa come quella che hai fatto tu. Non cambia nulla ai fini
della sicurezza usare la variabile $id nel modo in cui lo usi tu,
oppure l'array superglobale $_POST['id'] direttamente.
Validare l'input non vuol dire banalmente questo:
$id = $_POST['id'];
Validare l'input vuol dire controllare che il dato ricevuto sia
corretto, ed eventualmente forzare la sua correzione.
Ad esempio, essendo l'id un dato genericamente numerico intero, una
validazione sufficiente e rapida di sicurezza sarebbe:
$id = intval($_POST['id']);
In questo modo qualsiasi cosa c'è in quella variabile POST è convertita
a numero intero, di conseguenza alla fine $id sarà un numero intero.
In questo modo eviti problemi di SQL injection, e non ti serve nemmeno
fare il quoting della variabile.
Ma attenzione, questo è solo un caso particolare. Non è detto che tutti
i dati vanno trattati come questo. Ad esempio, tu potresti volere che
se l'utente inserisce un 'id' non numerico, avvisi l'utente
dell'errore, e non converti automaticamente il dato a intero.
Discorsi simili vanno fatti per qualsiasi tipo di dato.
La regola generale è: filtrare ogni cosa proveniente dall'utente.
A questo proposito potrebbe esserti utile la classe di data filtering
di php 5. Questo è il link:
http://it.php.net/manual/it/book.filter.php
.
Spero di esserti stato utile.
-- 
rob4you

 Spero di esserti stato utile.
decisamente si grazie! Vado a vedere il link.
ciao e grazie ancora