Per alcune codifiche rare, come GBk - sì.
Ma non dovresti ripristinarlo per questo motivo. Le virgolette magiche dovrebbero comunque essere disattivate (e saranno nella prossima versione di PHP). Quindi, mysql_real_escape_string() è l'unica funzione di escape rimasta. Si noti che non è una funzione di prevenzione dell'iniezione di sql. Molte persone non capiscono questo punto:è solo una parte della sintassi. Deve essere utilizzato non per "proteggere" nulla, ma per assemblare query SQL sintatticamente corrette. E deve essere utilizzato ogni volta che crei la tua query, indipendentemente dalla provenienza dei dati. Sicuramente ti proteggerà anche dalle iniezioni SQL, come effetto collaterale.
Certo, mysql_real_escape_string()
funziona solo all'interno di stringhe tra virgolette. Quindi, se lo fai
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
Non proteggerà nulla. Se hai intenzione di utilizzare numeri senza virgolette, deve essere cast al tipo corretto obbligatorio, in questo modo:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- Tieni presente che mo make
mysql_real_escape_string()
funziona come previsto, è necessario impostare la codifica client corretta ed è possibile solo conmysql_set_charset()
funzione, la query SET NAMES non lo imposterà.
Se vuoi eliminare tutte queste complessità, puoi utilizzare dichiarazioni preparate , anche se dovrai cambiare il tuo driver mysql in mysqli o PDO.
Tieni presente che nessuna sintassi corretta o istruzioni preparate non ti aiuterebbero con parti di query diverse dai letterali. Non puoi sfuggire a identificatori o operatori. Se ti capita di utilizzare queste parti in modo dinamico, devono essere codificate nel tuo script, in questo modo (per la clausola ORDER BY):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
o questa (clausola WHERE)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";