Newsgroup: it.comp.www.php
Titolo: Variabili globali e carattere &

Salve a tutti,
ho un problema che spero sia banale.
ho del codice php di questo tipo:
[PHP CODE]
$lastData = "vuoto";
function uno() {
  echo $lastData;
}
function due(){
 $lastData = "pippo&pluto"
}
[/PHP CODE]
il mio problema è che la funzione "uno" stampa soltanto "pluto". Come
se tutto ciò che precede la & venisse ignorato. Mi succede con più
stringe, tutte diverse e di diversa lunghezza, ma sempre in presenza
del carattere &.
Spero ci sia qualcosa che mi sfugge!
Ciao
e grazie in anticipo.
Franco

ho scordato nel mio esempio di dichiarare *ovviamente* :
global $lastData; 
in ogni funzione.

 il mio problema è che la funzione "uno" stampa soltanto "pluto".
prima di aver richiamato due(), ciò è normale. non trovi? :)
Ciao.
Tristan


Non sarebbe normale nemmeno prima di aver richiamato due :)
Comunque adesso mi spiego meglio.
Le due funzioni sono quelle in cima con tanto di global.
Durante l'esecuzione dello script, prima viene *sicuramente* richiamata
"due" che mi setta la variabile globale al valore "xxx&000;yyy". Se
all'interno di quella funzione echo la variabile globale, è corretta!
Più avanti richiamo "uno" che però stampa in maniera errata!
Grazie e scusate per la mancata chiarezza :)

 
Guarda, ho provato il tutto su shell, quindi usando la versione cli di
PHP... che non dovrebbe differire granché dalle versioni SAPI né dalla CGI.
Lo script è:
<?php
$tmp = "vuoto\n";
function uno() {
        global $tmp;
        echo $tmp;
}
function due() {
        global $tmp;
        $tmp = "pippo&pluto\n";
}
due();
uno();
?>
Quello che ottengo è:
neo@matrix:~$ php -f test.php
pippo&pluto
neo@matrix:~$
Quindi, "it works as expected".
Commentando la chiamata a due(), ovviamente, dovrebbe stampare "vuoto".
Ed è quello che fa:
neo@matrix:~$ php -f test.php
vuoto
neo@matrix:~$
Quindi: il codice è corretto (questa ne è la prova empirica :P). Se hai
un errore, vuol dire che il codice _non_ è questo. Per favore, posta (se
puoi) il codice _originale_ dello script che dà questo comportamento.
Saluti,
David
-- 
         Linux Registered User #334216
Get FireFox! >> 
http://snipurl.com/gofoxygo/
 <<
Blog         >>  
http://www.hanskalabs.net/
  <<
Staff        >> 
http://www.debianizzati.org/
 <<

David Paleino ha scritto:

Hai ragione, l'errore non è questo, ma adesso l'ho risolto. Per
correttezza vi posto il codice.
Comunque il fatto è che la funzione "due" era la funzione "cData" di
un parser XML, che (a mia insaputa) veniva richiamata 3 volte nelle
stringhe contenenti &.
Prima chiamata settava $lastData a "xxx"
seconda a "&"
terza a "#000;yyy"
ho risolto con un concatenamento nel caso necessario di questo genere.
function dataHandler($parser, $data){
global $lastXmlData;
global $currentNode;  // viene settato quando il parser incontra un tag
di apertura o chiusura
global $prevNode;  // viene settato solo da questa funzione (infondo)
 	if($currentNode == $prevNode)  // quindi se l'ultimo tag aperto è
uguale al precedente
	   $lastXmlData .= $data;         // faccio il concatenamento
	 else
	   $lastXmlData = $data;
$prevNode = $currentNode;
}
Purtroppo stavo cercando l'errore nelle global invece che nel parsing!
Grazie per la collaborazione!
Franco