Guardar datos con acentos y ñ en mysql desde php

publicado por: Anonymous

Tengo una función en PHP para guardar datos en BD. Los datos contienen ñ y acentos y esos datos son extraídos de una página de terceros. He intentado muchas formas y no funciona.

Ésta es la función que tengo:

public function agregarProduct($name,$brand,$price){

  $sql ="CALL spAddProduct('$name','$brand',$precio);";

    $result= $this->_BD->query($sql);

    $resultado->close();
    $this->_BD->next_result();
}

Lo que he intentado es:

  • Colocar header en el archivo indicando utf-8.
  • He usado $name = utf8_encode($name);.
  • Tambien he utilizado la funcion mb_convert_encoding.
  • Otra que utilice fue iconv(mb_detect_encoding($name, mb_detect_order(), true), "UTF-8", $name).
  • He intentado cambiando la collation de la BD a utf8_general_ci, utf8_spanish_ci, uft8_default collation.
  • Tambien en mi conexion he usando $BD->query("SET NAMES 'utf8'"); y $BD->set_charset("utf8");

Nada de lo anterior me funcionó en la base de datos. Ya que por ejemplo si en el argumento $name viene Maíz, en la base de datos se guarda como Maíz, pero si lo imprimo en pantalla aparece bien (Maíz).

Hice un intento colocando por default un valor a $name de la forma $name = "Maíz"; de esta forma se agrega correctamente a la base de datos.

Una diferencia que encontré es la siguiente:

echo mb_detect_encoding($name = 'Maíz');
//esto devuelve UTF-8 y se ingresa correctamente a la BD
echo mb_detect_encoding($name); //$name viene como argumento de la funcion.
//esto devuelve ASCII y se ingresa con los caracteres raros

Con esta observación quise ver que devolvía esta misma función al cambiar la variable con las funciones utf8_encode, mb_convert_encoding y iconv, el resultado para todos fue ASCII.

¿De qué otra forma podría solucionar esta situación?;

solución

Problema

Es muy bueno que hayas revisado todas las codificaciones de caracteres (encoding en la base de datos, PHP, todo) antes de hacer la pregunta y que estés usando UTF-8. Así, fue más sencillo ver que estás recibiendo los datos con entidades HTML como á, í, etc. directamente del HTML, y que no es un error en la codificación. Además, seguramente lo estás viendo bien en pantalla porque el propio navegador te lo muestra como corresponde.


Solución

Para decodificar (llevar al caracter que corresponde) las entidades HTML usamos la función html_entity_decode.

html_entity_decode ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") ]] )

html_entity_decode() es el opuesto de htmlentities() en el sentido de
que convierte todas las entidades HTML del string a sus caracteres
correspondientes.
Para ser más precisos, esta función decodifica todas las entidades (incluyendo todas las entidades numéricas)


Código

De esta forma, lo podemos usar para todos los datos que recibas del server. En tu ejemplo para $name:

$name = html_entity_decode($name, ENT_QUOTES | ENT_HTML401, "UTF-8");

Nota de Seguridad: El código que estás usando tiene serios problemas de seguridad. Por favor lee cómo utilizar Sentencias Preparadas para armar un query, y siempre usando mysqli, la extensión MySQL mejorada.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.