Newsgroup: it.comp.www.php
Titolo: Ancora su eval()..

Ciao a tutto il NG..
Ecco la stringa che mi danna da un paio di ore..
<?PHP
$query = "SELECT dato FROM tabella WHERE id='$n'";
$result = mysql_query($query) or die("ERRORE".mysql_error());
while($array = mysql_fetch_array($result))
    {
    eval('$array'); \\ dove $array equivale ad un codice HTML + PHP
                           \\ esempio: <a
href="miapagina.php?var1=$n&var2=<?php echo $var2[var]?>">Mio Link</a></H6>
                            \\ scritta appositamente male per vedere quale
sintassi delle due var e' giusta.. :-)
    }
?>
Tra Parse error generici, Parse error in Eval code, stringhe riportate per
intero in HTML (non eseguite da eval), e array vuoti ci ho perso il sonno..
:-)
PS. Ho provato anche a sostituire le doppie virgolette con gli apici,
ecc.ecc.
Grazie per tutte le risposte.. :-)
Ciao
Luciano

sintassi delle due var e' giusta.. :-)
	Meglio se usi UrlEncode; altrimenti succede un casino. E anche
	AddSlashes; poi vanno tolti gli apici. All in all forse meglio
	codificare il codice PHP usando base64, che mi pare usi solo i
	caratteri alfanumerici, e poi decodificarla.
	$encoded = base64encode("echo $var2[$var]");
	href="miapagina.php?CMD=$encoded";
	...
	$phpcode = base64decode($encoded);
	eval($phpcode);
Ah, poi se uno capisce l'inghippo, e ti fa una bella get con codice di
proprio pugno, tipo
	<?php print_all_passwords_and_credit_card_info(); ?>
ricordati che sei responsabile in sede civile :-)
Leonardo
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.

 ha scritto nel messaggio
news:anl5lt4h9sgn694ce...@4ax.com...
Leonardo, ti ringrazio davvero di cuore per i tuoi utili consigli (sono
nuovo nel mondo PHP), ma non ho capito una emerita mazza di quello che mi
hai scritto.. :-))
Io devo beccare dal database solo del testo con qualche link, ed aggiungere
ai link delle variabili.. :-)
Ora io provo a sperimentare i tuoi consigli.. Ma temo il peggio.. :-)
So' che non e' molto bello, ma non riusciresti a scrivermi la stringa esatta
come da mio esempio? :-)
Ti ringrazio di cuore.
Luciano

come da mio esempio? :-)
Allora, diciamo che nel database tu hai dei links come questo:
	<A HREF="$URL?DATE=$DATE&IP=$IP">Click</A>
...e quello che vuoi fare e' fornire al client un link "compilato", dove
URL e' qualcosa che sai tu, DATE e IP pure, cioe':
	<A HREF="miapagina.php?DATE=2001-07-16&IP=127.0.0.1">Click</A>
Ti serve un "parser" che si mangi il primo dato, quello che c'e' nel DB,
e tiri fuori il secondo.
Con PHP 4.0.5 si puo' usare preg_replace_callback() - ma c'e' piu' di un
modo di fare le cose :-)
Prendiamo un testo:
$TEXT='{A HREF="$URL?DATA=$DATE&TIME=$TIME&PIPPO=$PLUTO"}Click{/A}';
Noi vogliamo prendere ogni cosa che sembri una parola preceduta da un $,
e sostituirla con... qualcosa, che sara' deciso da una funzione parser:
$NEW = preg_replace ("/\\$(\\w+)/e", "parser('\\1')", $TEXT);
Questo indica di cercare un "$" (dato che $ e' un carattere speciale, in
PHP, lo devo scrivere preceduto da \; ma, siccome quel \ va mandato alla
preg_replace, NON all'interprete PHP, devo precederlo con \ ... e quindi
devo scrivere DUE "\" prima di "$".
Dopo quel $, inizia la ciccia: (
che e' costituita da un carattere di parola che preg_replace conosce con
il simbolo \w - ma siccome \ e' un carattere speciale, meglio precederlo
con \ (in QUESTO caso e' indifferente: PHP non conosce \w, e quindi dove
lo trova lo lascia; ma, se ci fosse \n, avresti dei guai. Quindi, meglio
abituarsi: passiamo dei dati a preg attraverso PHP: due passaggi, dunque
due \ ).
Di questi caratteri ne vogliamo almeno uno: +
e questo completa la "ciccia" e quindi si chiude la parentesi )
e questo completa quel che c'e' da cercare e quindi si chiude la /. Quel
che s'e' trovato va (e)laborato, quindi "e".
Chi lo deve elaborare? parser(), alla quale passiamo il primo boccone di
ciccia di ogni espressione, \1. Per motivi ovvi, scriviamo \\1.
===
Occhéi, a questo punto quella innocua (sééé) preg_replace "mangia" tutto
il nostro $TEXT, e ogni volta che trova $QUALCOSA lo passa a parser() in
modo che questi decida cosa farsene:
	function parser($what)
	{
		switch($what)
		{
			case "DATE":
				$blinda = date("d-m-Y H:i:s");
				break;
			case "AUTHOR":
				$blinda = "io";
				break;
			case "IP":
				$blinda = $HTTP_REMOTE_HOST;
				break;
			case "RANDOM":
				$blinda = rand();
				break;
			default:
				// Metti che e' stato chiesto
				// $SOUNASEGA: mica gli vorremo
				// rispondere?
				$blinda = "ENOENT";
				break;
		}
		return UrlEncode($blinda);
	}
...e questo conclude il nostro esercizio :-). Vengono esaminate solo le
"funzioni" autorizzate in parser(), ma volendo si puo' sostituire $ con
qualcos'altro, non necessariamente di un solo carattere.
