2011-01-19 22 views
9

Estoy usando mysql_real_escape_string para escapar de una cadena antes de insertarla en mi base de datos mysql.mysql_real_escape_string y '

Todo funciona bien, excepto que el carácter se está perdiendo y se convirtió en ’ por mysql.

¿Qué puedo hacer para resolver el problema? ¿Debo usar una mejor función para escapar de la cadena?

¡También me preocupa que otros charachters puedan ser extraviados y que se conviertan de manera similar en tonterías!

Por favor ayuda!

Gracias :)

Respuesta

16

No se puede perder el carácter ', simplemente es un carácter que mysql no utiliza para encadenar cadenas, y no necesita ser escapado.

La razón por la que se está convirtiendo en esa cadena extraña es porque es un carácter de varios bytes, y lo está colocando en un campo de bytes único.

+8

para aclarar, existe una diferencia entre 'y' – dqhendricks

+2

+1 También podría ser un problema de codificación cliente/servidor (es decir, 'SET NAMES'). – netcoder

+0

gracias. así que configurar la codificación de campo a utf-8 debería solucionar cualquier problema como este? – significance

4

usted debe utilizar declaraciones preparadas con las variables se unen en su lugar: http://php.net/manual/en/pdo.prepared-statements.php De esta manera usted no tiene que preocuparse de escapar nada. Las ventajas se mencionan en la documentación a la que me he vinculado.

+0

Esto parece tan obviamente mejor que cualquier cantidad de cotización, estoy sorprendido de que el equipo de PHP no haya eliminado 'mysql_real_escape_string()' como un primer intento tonto. – sarnold

2

mysql_real_escape_string() simplemente se escapa un puñado de caracteres (usando \) para que sean "seguros" para meter en su consulta. Parece que tiene una falta de coincidencia de codificación con sus datos (la cita con estilo) y el tipo de codificación de columna. mysql_real_escape_string nunca resolverá ese tipo de problema.

+0

no en consulta sino en cadena delimitada por comillas en la consulta. Siente la diferencia –

1

¿Es eso una cita elegante? Si es así, probablemente parezca un galimatías en su base de datos debido a las diferencias de codificación de caracteres. Cada tabla tiene una codificación de caracteres asociada, y la conexión tiene su propia codificación.

Intente ejecutar "ESTABLECER NOMBRES utf8" antes de su consulta. Eso establecerá la codificación de la conexión a UTF-8. Por supuesto, si intenta almacenar caracteres UTF-8, digamos una tabla latin1, no obtendrá el resultado esperado.

0

Eso es un carácter especial para ello, tiene que utilizar la codificación UTF

Coloque esta línea en la parte superior de la página donde se va a insertar los datos en la base de datos

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

esperar que funcione

-1
mysql_real_escape_string(utf8_encode($data)); 

Espero que esto funcione.

-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> 

Salida:

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

enter image description here

0

Se trabajará en caso de que se había establecido la conexión con MySQL: mysql_query ("SET 'UTF-8' nombres");

En otras palabras, si SET NAMES 'utf8' no está configurado, utf8_encode no es necesario.

Cuestiones relacionadas