Foros del Web » Programando para Internet » PHP »

Problema con coma simple

Estas en el tema de Problema con coma simple en el foro de PHP en Foros del Web. Hola a todos. Os pido ayuda para tratar de resolver este problema. (No pongo todo el código porque´es muy largo y creo que no es ...
  #1 (permalink)  
Antiguo 14/04/2005, 14:17
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 10 meses
Puntos: 0
Problema con coma simple

Hola a todos.

Os pido ayuda para tratar de resolver este problema. (No pongo todo el código porque´es muy largo y creo que no es necesario).

En mi web un Usuario se da de alta.

Luego, puede insertar en una tabla de la BD, accediendo con contraseña y abriendo una sesión, una serie de informaciones vinculadas a su nombre de Usuario.

Si el Usuario se da de alta como Juan (por ejemplo) todo funciona bien.

Si se da de alta como Juan's (el tema es la coma) resulta que:

- En la tabla de usuarios queda registrado correctamente como Juan's

- Si recojo este valor como variable y hago
Código PHP:
echo $usuario
me devuelve Juan's. Es decir, va bien.

- Pero cuando esta variable la recojo como variable de sesión y este Usuario envía datos para grabarlos en una tabla y el script hace:
Código PHP:
include ("conexion.php");
$sql=mysql_query("INSERT INTO tabla (usuario,comentario,etc...)
values('$usuario','$comentario',etc...)"
);
mysql_close(); 
resulta que no inserta nada en la tabla.

El ploblema (lo he comprobado varias veces) es la coma de Juan's. En todos los demás casos (cuando no hay coma) funciona perfectamente.

El caso es que no puedo impedir que un Usuario ponga una coma en su nombre ya que es su nombre real (empresas).

Yo no domino el tratamiento de cadenas y por eso recurro a vosotros para ver cómo podría escapar esta coma pero que a la vez me la inserte en la tabla, ya que necesito el nombre real para mostrarlo en pantalla.

Os agradeceré mucho vuestras sugerencias, pues a mí no se me ocurre nada para solucionarlo.

Gracias.
  #2 (permalink)  
Antiguo 14/04/2005, 14:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Si usas "magic_quote_gpc" a ON . .por defecto PHP al propagar una variable en GET/POST o cookie .. le añadirá un "slash" (\) a las comillas simples .. dobles .. etc.

Pero .. si usas magic_quote_gpc a OFF y por seguridad en general .. usa: mysql_escape_string() ...

Código PHP:
$sql=mysql_query("INSERT INTO tabla (usuario,comentario,etc...) 
values('"
.mysql_escape_string($usuario)."','".mysql_escape_string($comentario)."',etc...)"); 
Cuando obtengas ese dato de "Juan's" tendrás que aplicar un stripslashes() para quitar el \ que vas a ver en \' (cuando tengas una comilla).

Un saludo,
  #3 (permalink)  
Antiguo 15/04/2005, 02:43
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 10 meses
Puntos: 0
Solucionado. Muchas gracias.

Verdaderamente, es muy de agradecer la utilidad de este foro y especialmente las soluciones que los usuarios dan (no personalizo, pero ...gracias).

Como sé que me saldrán más problemas con las cadenas, voy a estudiarlas todo lo que pueda para no tener (en lo posible) que volver a molestaros.

El problema se ha solucionado con mysql_escape_string.

El servidor tiene "magic_quote_gpc" a ON. Por tanto, si entiendo bien, añade un "slash" a cualquier tipo de coma que encuentra en la cadena si la variable es propagada en cualquier forma. Esto explica que si se pide directamente la variable a la tabla de la BD la muestre bien y que, en cambio, si esta variable es propagada y se la solicita para mostrarla, se añada \ a las comillas. ¿Es así?.

Si es así, hay que usar stripslashes() para quitar la \ .

Voy a ver en www.php.net esta función y la incorporaré al script, pues es cierto que ocurre lo que comentas.

Si no me decís nada, supondré que he interpretado bien la solución dada por Cluster. Si voy equivocado, agradecería vuestro comentario.

Gracias a todos de nuevo.
  #4 (permalink)  
Antiguo 15/04/2005, 03:11
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Simplemente recordar tambien que existe la directiva magic_quotes_runtime, que tambien añade los slashes cuando lees ficheros de texto o bases de datos.

saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 15/04/2005, 03:28
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 10 meses
Puntos: 0
Sí Josemi. Esta directiva la ví al comprobar el estado de las directivas.

El servidor la tiene en OFF. Por tanto, por ahí creo que no saldrán problemas en las consultas.

Lo que no sabía es lo que hace esta directiva. Gracias por decírmelo.

Saludos.
  #6 (permalink)  
Antiguo 15/04/2005, 07:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Como te comenté .. "gpc" afecta a todo dato que venga de GET, POST o sea de una COOKIE .. Es decir .. de datos que envias de un formulario (Por method GET o POST) o del URL (en GET) o sea una cookie que lees.

El "runtime" (aplicado a magic_quotes_xxxx) se refiere por ejemplo a lo que se lee al abrir un archivo por fopen() o similar.

No tiene nada que ver con respecto al uso que haces desde tus Base de datos, pero si que debes tener en cuenta como ingresastes esos datos a tu BD, tal vez pienses que la única forma sea desde un "formulario" que se piden esos datos .. pero podría ser perfectamente desde una "lectura" de un archivo y procesado.

Un saludo,
  #7 (permalink)  
Antiguo 15/04/2005, 10:38
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 10 meses
Puntos: 0
Hola:

Creo que todo queda bastante claro.

Ya he hecho pruebas con stripslashes() y muestra resultados correctos, aunque también sería cuestión de ver si interesa utilizar la contraria, addslashes(), en algunas partes para tener la máxima unificación en el formato de los datos.

Como también uso nl2br, creo que es cuestión de aclarar mis conceptos sobre tratamiento de cadenas e ir probando.

Gracias de nuevo y saludos a todos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:35.