2011-01-19 11 views
9

Sto usando mysql_real_escape_string per uscire da una stringa prima di inserirla nel mio database mysql.mysql_real_escape_string e '

Tutto funziona correttamente, tranne che il carattere viene perso e trasformato in ’ da mysql.

Cosa posso fare per risolvere il problema? Dovrei usare una funzione migliore per sfuggire alla stringa?

Sono anche preoccupato che altri personaggi potrebbero essere persi e essere trasformati allo stesso modo in sciocchezze!

Si prega di aiuto!

Grazie :)

risposta

16

Il carattere "non viene perso, è semplicemente un carattere che non viene utilizzato da mysql per racchiudere le stringhe e non deve essere sfuggito.

Il motivo per cui si sta trasformando in quella strana stringa è perché è un carattere a più byte e lo si inserisce in un campo di un singolo byte.

+8

per chiarire, c'è una differenza tra 'e' – dqhendricks

+2

+1 Potrebbe anche essere un problema di codifica client/server (es .: 'SET NAMES'). – netcoder

+0

grazie. quindi impostare la codifica del campo su utf-8 dovrebbe risolvere problemi come questo? – significance

4

si dovrebbe utilizzare istruzioni preparate con le variabili di bind invece: http://php.net/manual/en/pdo.prepared-statements.php In questo modo non c'è bisogno di preoccuparsi di sfuggire nulla. I vantaggi sono menzionati nella documentazione a cui mi sono collegato.

+0

Questo sembra ovviamente meglio di qualsiasi quantità di quoting, sono sbalordito che il team di PHP non abbia rimosso 'mysql_real_escape_string()' come un primo tentativo sciocco. – sarnold

2

mysql_real_escape_string() semplicemente sfugge a una manciata di caratteri (utilizzando \) per renderli "sicuri" da inserire nella query. Sembra che tu abbia una mancata corrispondenza della codifica con i tuoi dati (la citazione stilata) e il tipo di codifica della colonna. mysql_real_escape_string non risolverà mai questo tipo di problema.

+0

non nella query ma nella stringa delimitata da virgolette nella query. senti la differenza –

1

È una citazione di fantasia? Se è così, probabilmente sembra senza senso nel tuo database a causa delle differenze di codifica dei caratteri. Ogni tabella ha una codifica dei caratteri associata e la connessione ha una propria codifica.

Provare a eseguire "SET NAMES utf8" prima della query. Questo imposterà la codifica della connessione a UTF-8. Ovviamente, se stai cercando di memorizzare caratteri UTF-8 in, ad esempio una tabella latin1, non otterrai il risultato che ti aspetti.

0

Questo è un carattere speciale per questo è necessario utilizzare UTF codifica

posto questa linea nella parte superiore della pagina in cui si sta inserendo i dati nel database

header ('Content-type: text/html; charset=utf-8'); 

Speranza che funziona

-1
mysql_real_escape_string(utf8_encode($data)); 

Spero che funzioni.

-1
<?php 
    if(isset($_GET['submit'])) 
    { 
     mysql_connect('localhost','root',''); 
     mysql_select_db('test'); 
     $var=mysql_real_escape_string($_GET['asd']); 
     $sql="INSERT INTO `test`.`asd` (`id` ,`name` ,`desc`)VALUES ('', '$var', 'knkk');"; 
     echo $sql."<br />"; 
     $res=mysql_query($sql) or die('error'); 
     echo $res; 
    } 
?> 

<html> 
<body> 
    <form name="f1" method="get"> 
     <input type="text" name="asd"> 
     <input type="submit" name="submit"> 
    </form> 
</body> 
</html> 

uscita:

INSERT INTO test.asd (id, name, desc) VALORI ('', 'asd \' lgh ',' knkk ');

enter image description here

0

Essa opererà nel caso in cui si era stabilita la connessione MySQL con: mysql_query ("SET 'utf8' NOMI");

In altre parole, se SET NAMES 'utf8' non è impostato, utf8_encode non è necessario.

Problemi correlati