Ciao sto realizzando una classe per la gestione di mysql e ho questo dubbio:
Premesso che i magic_quotes sono impostati a off in php.ini i metodi sono i seguenti:
DBCheck() // aggiunge i caratteri di escape ove necessario
Codice PHP:
public function DBCheck($data) {
// Se magic_quotes è settato a off non striplashes
// non viene usata
if (!get_magic_quotes_gpc()) {
if (!$data = stripslashes(trim($data))) {
throw new Exception($this->DBError());
}
}
// Se il tipo di dato non è numerico viene usata la funzione
// mysql_real_escape_string
if (!is_numeric($data)) {
if (!$data = mysql_real_escape_string($data)) {
throw new Exception($this->DBError());
}
}
return $data;
} // end method DBCheck
DBQuery // sottopone la query al database
Codice PHP:
public function DBQuery($sql_query) {
if (!$query = mysql_query ($sql_query)) {
throw new Exception($this->DBError());
}
} // end method DBQuery
Assumendo di dover inserire nome e cognome nei campi dbnome e dbcognome l'inserimento viene fatto in questo modo:
Codice PHP:
require ( 'configuration.php' );
require ( 'dblayer_class.php' );
try {
// Instanzio la classe
$db = new DBLayer ();
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
// Preparo la query
$sql_query = sprintf ("INSERT INTO anagrafica (dbnome, dbcognome) VALUES ('%s', '%s')",
$nome = $db->DBCheck($nome),
$cognome = $db->DBCheck($cognome));
// Stampo la query
echo $sql_query;
// Inserisco i dati nel database
$db->DBQuery($sql_query);
}
catch (Exception $e) {
$e->getMessage();
}
Il punto è questo:
Se stampo la query e o nel campo nome o nel campo cognome c'è un apostrofo questo viene fatto precedere da un carattarre di escape:
Ipotizzando che io mi chiami Marco D'Ambrosi questo è ciò che viene stampato con echo
INSERT INTO anagrafica (dbnome, dbcognome) VALUES ('Marco', 'D\'Ambrosi')
P.S. Nel quote riportato qua sopra il backslash non si vede ma c'è
al contrario se vado a vedere i dati effettivamente inseriti nel database trovo:
Marco D'Ambrosi \\ senza il carattere di escape
La domanda finale è: E' corretto tutto questo o sto sbagliando qualcosa ? Si puiò fare di meglio o sono sulla strada sbagliata ?
Grazie a tutti