Foros del Web » Programando para Internet » PHP »

Fallo con caracteres

Estas en el tema de Fallo con caracteres en el foro de PHP en Foros del Web. Hola a todos, Tengo un problema y quiero ver si alguien sabe como solucionarlo. Tengo un formulario que ingresa datos en una base MySql. En ...
  #1 (permalink)  
Antiguo 16/01/2013, 10:15
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Pregunta Fallo con caracteres

Hola a todos,

Tengo un problema y quiero ver si alguien sabe como solucionarlo.
Tengo un formulario que ingresa datos en una base MySql.
En un panel de control en PHP donde recupero los campos.
Los campos en la BD son del tipo VARCHAR, Null, utf8_unicode_ci

El problema esta cuando alguien en el formulario ingresa algo como " don't " o "T & T"
Al enviar el formulario da error en la comillas simple ' y en el & .

Como puedo hacer para que se ingrese cualquier dato o caracter que el usuario quiera sin que de este error?

Desde ya muchas gracias por el tiempo prestado
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..
  #2 (permalink)  
Antiguo 16/01/2013, 10:18
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Fallo con caracteres

La forma correcta es bindear los datos, y no harcodearlos en la consulta.

Tambien pueden sugerirte hacer algun encode de los datos antes de insertarlos, pero esto no es una muy buena idea, te creara problemas al querer hacer busquedas por ejemplo..
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 16/01/2013, 10:31
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Fallo con caracteres

Hola h2swider,

Gracias por tu respuesta, pero realmente no entiendo "bindear" y "harcodearlos".
"bindear" vendrá de "bin"? sistema binario?
"harcodearlos", ahi si me mataste, probablemente de "hardcodeing".

Como sea, si tienes algún ejemplo al respecto sería de mucha mas ayuda.

Gracias por tu tiempo.
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..
  #4 (permalink)  
Antiguo 16/01/2013, 10:40
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Fallo con caracteres

Cuando hablo de "bindear" me estoy refiriendo a algo como esto (Ejemplo con mysqli)
Código PHP:
Ver original
  1. $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
  2. $stmt->bind_param('sssd', $code, $language, $official, $percent);

Cuando hablo de datos "harcodeados" en la query
me refiero a algo como esto
Código PHP:
Ver original
  1. $sql = "INSERT INTO CountryLanguage VALUES ('$valor1', '$valor2', '$valor3', '$valor4')"

Espero que se entienda
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #5 (permalink)  
Antiguo 16/01/2013, 10:49
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Fallo con caracteres

OK, ahora si lo entiendo aunque nunca he trabajado con eso.

lo que yo hago es esto:

Código PHP:
Ver original
  1. //4. Insertar campos en la Base de Datos
  2. $insertar = mysql_query("INSERT INTO datos (make, model, pickup, dropoff, shipping_date, weight, kglbs, item, company_name, country, first_name, last_name, phone, cell, email, contact_by, comments, estimate, date) VALUES ('{$make}', '{$model}', '{$pickup}', '{$dropoff}', '{$shipping_date}', '{$weight}', '{$kglbs}', '{$item}', '{$company_name}', '{$country}', '{$first_name}', '{$last_name}', '{$phone}', '{$cell}', '{$email}', '{$contact_by}', '{$comments}', '{$estimate}', '{$date}')", $conexion);
  3. if (!$insertar) {
  4. die("Error inserting data in db: " . mysql_error());
  5. }

es algo así como entre medias de las dos cosas que tu me propones.

Lo correcto entonces sería:

Código PHP:
Ver original
  1. //4. Insertar campos en la Base de Datos
  2. $insertar = mysql_query("INSERT INTO datos  VALUES (make, model, pickup, dropoff, shipping_date, weight, kglbs, item, company_name, country, first_name, last_name, phone, cell, email, contact_by, comments, estimate, date);
  3. $insertar = bin_param ('$make', '$model', '$pickup', '$dropoff', '$shipping_date', '$weight', '$kglbs', '$item', '$company_name', '$country', '$first_name', '$last_name', '$phone', '$cell', '$email', '$contact_by', '$comments', '$estimate', '$date')", $conexion);
  4. if (!$insertar) {
  5. die("Error inserting data in db: " . mysql_error());
  6. }

Es correcto?

Gracias
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..
  #6 (permalink)  
Antiguo 16/01/2013, 11:03
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Fallo con caracteres

Mmm no del todo, la idea casi la tienes pero no es como se usa.

Primero que nada este es el enlace al manual http://php.net/manual/es/mysqli-stmt.bind-param.php

basicamente el bind_param, se encarga de cambiar los ? por el valor correspondiente. Al mismo tiempo impide inyecciones sql, y evita muchos errores en los datos, como por ejemplo tu problema con los '

Ahi tenes un ejemplo completo de como usar la funcion.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #7 (permalink)  
Antiguo 17/01/2013, 09:24
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Fallo con caracteres

Hola h2swider,

he estado trabajando con esto pero no me sale. Una pregunta, que seguramente es muy tonta pero no lo se, como tampoco conocia mysqli estoy leyendo, pero necesito solucionar esto lo mas rapido posible.

Si utilizo mysqli tengo que cambiar algo en la base de datos, o puedo mezclar sentencias entre mysql y mysqli?

he modificado mi codigo de esta manera, pero me da error

Código PHP:
Ver original
  1. $link = mysqli_connect('localhost', 'user', 'pass', 'db');
  2.  
  3. /* verificar conexión */
  4. if (!$link) {
  5.     printf("Error de conexión: %s\n", mysqli_connect_error());
  6.     exit();
  7. }
  8.  
  9. //4. Insertar campos en la Base de Datos (No inserto el id_empleado ya que se genera automaticamente)
  10. $stmt = mysqli_prepare($link, "INSERT INTO datos (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
  11. mysqli_stmt_bind_param($stmt, 'sssd', $make, $model, $pickup, $dropoff, $shipping_date, $weight, $kglbs, $item, $company_name, $country, $first_name, $last_name, $phone, $cell, $email, $contact_by, $comments, $estimate, $date);

Aunque leo y se que en un tiempo lo voy a poder manejar el problema es que el sistema esta funcionando y necesito solucionar esto urgente.

Gracias por tu tiempo
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..
  #8 (permalink)  
Antiguo 17/01/2013, 09:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Fallo con caracteres

No, no puedes cambiar sentencias entre mysql_ y mysqli_ son dos extensiones independientes, ambas trabajan con MySQL, y ambas usan SQL, pero no puedes intercambiarlas.

Respecto al punto que pones ¿que error te marca?.

Saludos.
  #9 (permalink)  
Antiguo 17/01/2013, 09:33
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Fallo con caracteres

Hola GatorV

El tema es que tengo todo un sistema echo en mysql funcionando perfectamente excepto por el fallo que si alguien ingresa una " ' " (comilla simple) me da error y no se envia el formulario, eso es lo que necesito solucionar. El compañero me dio la solución con mysqli que no conozco y aunque estoy dispuesto a estudiarlo tengo que encontrar una solución rápida para este problema mientras tanto.

El fallo que me da es el siguiente:

Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in /home/laura/public_html/heavyequipmenttransport.us/validarpopup_test.php on line 171

Warning: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in /home/laura/public_html/heavyequipmenttransport.us/validarpopup_test.php on line 194

Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in /home/laura/public_html/heavyequipmenttransport.us/validarpopup_test.php on line 197

Gracias por tu tiempo
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..
  #10 (permalink)  
Antiguo 17/01/2013, 09:44
 
Fecha de Ingreso: agosto-2008
Ubicación: Miami, FL
Mensajes: 210
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Fallo con caracteres

gracias compañeros, buscando en el foro encontre un tema antiguo de donde he sacado la solución.

Muchas gracias por el tiempo prestado.

El fallo estaba al ingresar comillas simple en un formulario y no ser aceptadas por mysql.

lo que yo hacia era:

$dato = $_POST['dato'];

lo reemplacé por:

$dato = mysql_real_escape_string($_POST['dato']);



Gracias
__________________
Se invierte mas dinero en cirugía de pechos y viagra que en la cura del Alzheimer. En unos años tendremos viejas con grandes tetas y viejos con erecciones pero que no recordarán para que sirven..

Etiquetas: php+mssql
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 13:21.