Newsgroup: it.comp.www.php
Titolo: COMPLICATO - parametri di una query passati dentro una funzione php e mysql_real_escape

Salve a tutti...
vorrei costruire una funzione php che mi risparmi la scrittura di un po' 
di codice che devo ripetere spesso...
vi spiego la situazione...
Partiamo da questa query:
mysql_query("select userid from users where 
username='".$_GET['username']."'");
per motivi di sicurezza faccio
mysql_query("select userid from users where 
username='".mysql_real_escape($_GET['username'])."'");
e fin qui tutto bene.
Vorrei però crearmi una funzione molto generica che mi permetta di 
trovare il valore di un campo di una tabella corrispondente ad una 
precisa condizione.
tipo: function cerca($table,$field,$condition)
in questo caso farei:
cerca('users','userid',"username='".mysql_real_escape($_POST['user_id'])."'")
e potrei fare anche
cerca('users','userid',"username='".$_POST['user_id']."' and userstate=1")
senza dover usare mysql_real_escape quando chiamo la funzione (per 
evitare distrazioni!).
Se faccio il mysql_real_escape dentro la funzione (sulla variabile 
$condition) mi ritrovo che vengono aggiunte delle slashes anche davanti 
alle ' che circondano i valori di $_POST ... cioè viene fuori
username=\'mario\' e questo falsa i risultati.
Secondo voi... esiste un modo comodo e funzionare di risolvere il problema?

> Secondo voi... esiste un modo comodo e funzionare di risolvere il problema?
Se esistesse, sarebbe universalmente accettato, e l'inventore si 
sarebbe comprato una casa a Montecarlo! :)
Come presto ti accorgerai facendo alcune prove, più vuoi rendere 
"generale" la funzione, meno riuscirai a fare ciò che chiedi.
D'altra parte, più rendi "specifica" la funzione, meno essa diventa 
utile per gestire svariate situazioni.
Guarda, io in genere non uso una funzione ad hoc (per i motivi che ti 
ho descritto prima).
Valide soluzioni sono:
- l'uso di una sprintf; e a questo punto potresti anche usarla in una 
funzione, ma appunto presto ti accorgeresti che con una funzione 
specifica, riesci a gestire casi specifici, e con una funzione 
generica, non riesci a gestire nulla. :)
- molto meglio, passi al PDO, e con le funzioni apposta (tipo 
prepare(), bindParam(), execute(), ecc) risolvi alla grandissima il 
problema! Queste tecniche sono relativamente "nuove", ma prima o poi 
prenderanno piede con sempre maggior rilevanza.
-- 
rob4you

 piede con sempre maggior rilevanza.
sorry??? what's PDO?

 ha scritto:

Esiste Google -- una ricerca di "php pdo" mi restituisce, in PRIMA posizione:
http://www.php.net/pdo
Saluti,
David
-- 
 . ''`.  Debian maintainer | 
http://snipurl.com/qa_page/
 : :'  :  Linuxer #334216  |  
http://www.hanskalabs.net/
 `. `'`    GPG: 1392B174   | 
http://www.debianizzati.org/
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

Secondo voi... esiste un modo comodo e funzionare di risolvere il problema?
No. Pero' ti ci puoi avvicinare :-)
Leonardo
-- 
 What do you make, so fair and bright;
 What do you build with sails for flight;
 What do you weave with wool so white?

 	));
E' una delle cose a cui avevo pensato... però se le condizioni non sono 
di uguaglianza ma di differenza? e se ci sono delle condizioni and, or, 
ecc..?




E' per quello che ho messo l'operatore nella parte sinistra dell'array.
	'status!='	=> 'active',
	'date>'		=> $_POST['date'],
e cosi' via.
Se vuoi anche le condizioni OR, eccetera, ti allontani dalla semplicita'.
A quel punto ti conviene affrontare il problema dalla parte opposta, i.e.
scrivere
	MySafeQuery('SELECT * FROM tabella WHERE
username=$_REQUEST[user_id];');
(nota l'uso di apici singoli!)
e poi parsare la query con preg_replace.


 
io uso qualcosa del genere per costruirmi la query:
function crea_select($table,$select,$where,&$query,$complexSQL='') {
 
	if(is_array($where)){
		$size = sizeof($where);
		foreach ($where as $campo=>$val){
			$whereString.= "$campo  = '$val' ";
			if(--$size != 0)
			$whereString.= " AND ";
		}//end foreach
		$query="SELECT $select FROM $table WHERE $whereString $complexSQL;";
	}else// Nel caso la condizione where non c'è
	$query="SELECT $select FROM $table WHERE 1 $complexSQL;";
 
}// end function
crea_Select("tabellaCerca",'oggetto',array("autore"=>$author),$query);
Vincenzo M.
www.fantasyfootball.it

 tipo: function cerca($table,$field,$condition)
Dai un'occhiata allo Zend Framework. E` grande e grosso per avere solo 
questa funzione, ma l'appetito vien mangiando, e potrebbero 
interessarti anche le altre funzioni che ha.
Per il tuo problema, puoi usare:
$select = new Zend_Db_Select($db)
          ->from("tabella", "campo")
          ->where("condizione = ?", $campo);
$stmt = $select->query();
$results = $stmt->fetchAll();
Ti fa automaticamente l'escaping in modo indipendente dal database ($db 
e` un oggetto Zend_Db che devi creare precedentemente, al posto del 
classico mysq_connect() )
Inoltre e` molto piu` potente di una funzione che fa solo quello, 
perche` puoi specificare un array di tabelle, le condizioni di join, 
piu` campi da recuperare, diverse condizioni in and o in or, ecc.
Bye.