PHP, tratamiento de datos antes de guardarlos en la BBDD
Tema que he expuesto en otro foro... por eso copio y pego :P
Hola coleguillas!
Llevo bastante tiempo metido en el tema de la programación, con visual basic, asp, php...
Pero desde hace cosa de unos meses tengo una duda que no deja de rebotar x mi craneo.
Cuando monto un formulario, pongamos como ejemplo, para entrar noticias a una base de datos desde un CMS, a la hora de hacer el PHP para insertar dichos datos en la BBDD, que tratamiento dais a ese texto?
Yo hasta ahora, usaba la siguiente función:
<code>function controlChars($string){
$newString = $string;
if($string!="" && !is_array($string)){
$newString = htmlentities($string,ENT_QUOTES);
}
return $newString;
}</code>
pero me encuentro con que a veces me da errores en la codificación de caracteres, sobre todo acentos y algún que otro símbolo...
He llegado a la conclusión de que no hace falta, con que haga un replace de los códigos de apostrofe " ' " y mayor que ">" y menos que "<"..
no se...
También depende de si la página donde luego muestro dichos datos esta codificada en UTF-8 y/o ANSI... o si lo mando por email.
¿Cual sería la forma correcta de tratar estos datos para que diera los mínimos problemas sea el medio que sea en el que se muestren (email, web,..)?
Gracias compañeros!
Un saludo!
markshock
nadie se atreve con esto...?
cuando guardáis los datos en la base de datos, lo haces con los acentos y tildes transformados a código ascii o a su correspondiente código html...?
toy loco con esto..
sole
Ultimamente, base de datos con utf8, pagina con utf8, si voy a tener caracteres 'no espanyoles', o ya por costumbre, especialmente si voy a mezclar con datos de otros sitios (los feeds suelen estar en utf8).
Nada de convertir caracteres a codigo 'ascii' que dices tu.
markshock
entonces, los apostrofes " ' " ... los escapas con \?
si no recuerdo mal existe la función addslashes() de php.. para el tema...
lo del utf8 estoy contigo, ahora el proyecto este que estamos moviendo de la tienda online, todo en utf-8...
sole
Bueno, ultimamente estoy usando ADODB para acceder a las bases de datos. Tiene una funcion llamada 'escape' que se asegura de que los parametros que le envias a la BD no vayan a romper la query.
Puedes echarle un vistazo. Lo bueno es que al usar esta capa, ya ajusta al controlador que uses (mssql, mysql...).
Otra cosa que uso de adodb es el binding de parametros. Es decir, tu escribes algo tal que Execute("SELECT campo FROM tabla WHERE id=?", array($id));
Entonces ADODB ya se encarga de escapar $id y anyadirle comillas si es necesario, y sustituye el interrogante por el resultado.
Esto esta tambien muy bien porque cada controlador de base de datos tiene sus peculiaridades para escapar el texto. Por ejemplo, en mysql tiene que escapar los apostrofes con \', pero en mssql se hace con doble apostrofe: ''
markshock
si... en mysql hay algo parecido...
http://es2.php.net/manual/es/function.sprintf.php
y
http://www.php-es.com/function.mysql-real-escape-string.html
he puesto online unas muestras de los tipos de "escapamientos" que estoy barajando para usarlos antes de insertar en la base de datos...
de momento me quedo con el addslashes() y el stripslashes()..
poned cualquier frase con acentos, apostrofes y eñes y posteriormente mirad el código fuente...
http://www.gainmw.com/debug/escapar_caracteres.php
cual de ellas os parece mejor?
sole
A ver, es que cada cosa tiene su aplicacion. htmlentities es util si vas a meter texto en un textarea o input y no quieres que si te sale una " se rompa el input.
Las funciones que tu dices que tiene mysql son las que usa ADODB :-P, pero si usas ADODB en lugar de mysql a saco, te ahorras reescribir todo de nuevo si cambias a otra base de datos.
En general te ahorras mas cosas, pero eso es otro tema. Lo suyo es que incluso si no vas a usar mas que mysql, te escribas una pequenya clase o unas funciones y las uses siempre las mismas para filtrar y preparar las queries.
markshock
sole
En general te ahorras mas cosas, pero eso es otro tema. Lo suyo es que incluso si no vas a usar mas que mysql, te escribas una pequenya clase o unas funciones y las uses siempre las mismas para filtrar y preparar las queries.
A eso es a lo que voy jejeje a montarme unas mega funciones de la muerte para gestionar las querys antes de insertar en la bbdd...
de base nunca me encuentro con el problema de tener que migrar hacia otro sistema de bbdd.. todo lo que hacemos es para mysql.
el día que llegue, reutilizaremos y adaptaremos, pero de momento no hay a la vista ningún cambio. ^_^!
gracias sole!!!!!!!!
ventdaval
denuevo, se muy poquito de esto, pero he usado esto:
<code>str_replace('##','\#\#',mysql_escape_string($datos));</code>
para binarios, texto, etc... y nunca un error en 73 mil entradas ^^
markshock
Ventd'Aval
denuevo, se muy poquito de esto, pero he usado esto:
<code>str_replace('##','\#\#',mysql_escape_string($datos));</code>
para binarios, texto, etc... y nunca un error en 73 mil entradas ^^
si, si al final esa va a ser la solución, lo que pasa que yo pretendía limpiarlo antes de tener que usar una función que va ligada a la conexión como pasa con mysql_escape_string().
pero estoy viendo que es la solución mas sensata y efectiva ^_^
ojo vent...
<fieldset>4.3.0 Esta función se convirtió en obsoleta, no use esta función. En su lugar, use mysql_real_escape_string().</fieldset>
ventdaval
vaya, gracias!... aunque mientras funcione, prefiero no meterle mano ^^
Por cierto, esta no requiere la conexion, no? :P
Aunque si le veo mas logica que escape de acuerdo al juego de caracteres de la conexion...
markshock
Ventd'Aval
vaya, gracias!... aunque mientras funcione, prefiero no meterle mano ^^
Por cierto, esta no requiere la conexion, no? :P
Aunque si le veo mas logica que escape de acuerdo al juego de caracteres de la conexion...
pen en la doc...
<fieldset>Esta función es idéntica a mysql_real_escape_string() con la excepción de que mysql_real_escape_string() recibe un gestor de conexión y escapa la cadena de acuerdo al juego de caracteres actual. mysql_escape_string() no recibe un argumento de conexión, y no hace caso al valor actual del juego de caracteres.</fieldset>
http://www.php-es.com/function.mysql-escape-string.html
ventdaval
markshock
lo que pasa que yo pretendía limpiarlo antes de tener que usar una función que va ligada a la conexión como pasa con mysql_escape_string().
pues eso, que mysql_escape_string() no necesita de conexion... acabo de revisar y lo tengo puesto antes del mysql_connect ^^
markshock
pues si, según la docu, mysql_escape_string() no requiere de conexión abierta, pero mysql_real_escape_string() si que la precisa, lo he comprobado ;)