Foros del Web » Programando para Internet » PHP »

Insertar en bbdd caracteres especiales como acentos, etc

Estas en el tema de Insertar en bbdd caracteres especiales como acentos, etc en el foro de PHP en Foros del Web. Hola amigas y amigos, verán tengo un problema: Tengo un codigo que me permite insertar en bbdd, pero los caracteres especiales osea acentos etc me ...
  #1 (permalink)  
Antiguo 16/04/2016, 08:19
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Insertar en bbdd caracteres especiales como acentos, etc

Hola amigas y amigos, verán tengo un problema:

Tengo un codigo que me permite insertar en bbdd, pero los caracteres especiales osea acentos etc me los inserta en la bbdd con caracteres extraños. Y claro una vez insertados en la bbdd estos caracteres extraños a la hora de mostrarlos en mi pagina pues no son mostrados las vocales con sus acentos sino que se muestran en su lugar estos caracteres raros.

Si pudieran ayudarme les estaria agradecido.

Este es el codigo:

Código PHP:
Ver original
  1. public function ActualizarUsuario($tabla_usuarios, $nombre, $apellidos, $nick, $email, $movil, $password, $repassword,
  2.            
  3.             $sexo, $dia, $mes, $ano, $directorio_img_bbdd)
  4.            
  5.                 {  
  6.                     $encript_password = trim((hash('sha256', $password)));
  7.                     $encript_repassword = trim((hash('sha256', $repassword)));
  8.                        
  9.                     $sql = "UPDATE " . $tabla_usuarios . " SET nombre='$nombre', apellidos='$apellidos',
  10.                    
  11.                     nick='$nick', email='$email', movil='$movil', password='$encript_password', repassword='$encript_repassword', sexo='$sexo', dia='$dia', mes='$mes', ano='$ano',
  12.                    
  13.                     avatar='$directorio_img_bbdd'                  
  14.                    
  15.                     WHERE email='$email'";
  16.  
  17.  
  18.                    
  19.                     $con = new Conectar();             
  20.                     $link=$con->ConectarBbdd();
  21.                    
  22.                     mysqli_query($link,$sql) or die (mysqli_error($link)); 
  23.                 }


Y la conexion a bbdd es esta:

Código PHP:
Ver original
  1. class Conectar
  2.    
  3.         {
  4.  
  5.             public $servidor = 'localhost';
  6.             public $usuario = 'root';
  7.             public $pass = '';
  8.             public $basedatos = 'nombre_mi_bbdd';  
  9.        
  10.  
  11.            
  12.             public function ConectarBbdd()
  13.            
  14.             {
  15.                 $con = mysqli_connect($this->servidor, $this->usuario, $this->pass, $this->basedatos);             
  16.            
  17.                 if (mysqli_connect_errno($con))
  18.                
  19.                     {
  20.                         echo "Lo siento pero no conecta a la BBDD: " . mysqli_connect_error($con);
  21.                     }
  22.  
  23.                 return $con;       
  24.             }
  25.  
  26.         } //fin de Conectar



Navegando por internet encontre esto pero no se si es lo que necesito en caso afirmativo no se como implementarlo a mi codigo una ayudita please:

Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión:
mysql_query("SET NAMES 'utf8'");

Última edición por mensajeescrito; 16/04/2016 a las 08:30
  #2 (permalink)  
Antiguo 16/04/2016, 13:15
 
Fecha de Ingreso: septiembre-2012
Ubicación: Pontevedra
Mensajes: 48
Antigüedad: 11 años, 7 meses
Puntos: 2
Respuesta: Insertar en bbdd caracteres especiales como hacentos etc

El tema de la inserción de caracteres especiales en la bbdd tiene que ver con el chartset de la bbdd y el de la web.
Si tienes la web en UTF-8 y la base de datos en ISO lógicamente al insertarlo te va a meter algo raro.

Viendo tu código fuente además he de decirte, que algún desalmado podría hacerte putadas en la web con inyección SQL, ya que parece que metes los datos obtenidos de un formulario directamente sin pasarlos por ningún filtro. Eso quiere decir que si alguien en uno de tus campos hace un cierre de tu sentencia SQL (es decir añade de primer elemento un ") y después hace un CREATE table va a ejecutar un hermoso create table que me permitirá convertir tu web en su propio manda spam. Ten siempre cuidado con esas cosas.

Para lo de los acentos simplemente a cada variable hazle un htmlentities y listo es decir:

Código PHP:
$nombrehtmlentities$nombre); 
Esa función convierte los caracteres especiales en su correspondiente código html, así que cuando alguien escriba Ramón, htmlentities lo convertirá en Ramón. Así cuando recuperes los datos puedes imprimirlos directamente.

OJO! ten cuidado si haces eso con las búsquedas, porque si buscas Ramón y en la base de datos tienes Ramón no te lo va a encontrar, debes pasarle el htmlentities también a estas.

Espero haberte sido de ayuda.

Si no quieres molestarte la otra opción es hacer un utf8_encode($nombre) o utf8_decode($nombre) cuando recuperes los datos de la base de datos. Con eso también se imprimirá bien, pero la primera opción que te di también te ayuda a evitar la inyección SQL.

Un saludo!!
  #3 (permalink)  
Antiguo 17/04/2016, 01:58
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Insertar en bbdd caracteres especiales como hacentos etc

Lo recomendable o ideal es que revises todas tus codificaciones. Tanto en la base de datos,en las tablas, en los archivos, conexiones, como en el código html que generes y cualquier otra parte que pueda estar implicada. Todas deberían de estar funcionando bajo la misma codificación de caracteres. Para evitar este tipo de errores entre otros.

En cuanto a estableces la codificación en ut8 de la conexión si es esta la que utilizas, se puede hacer con la sentencia que mostrabas, en tu caso utilizando la librería adecuada

Código PHP:
Ver original
  1. mysqli_query("SET NAMES 'utf8'");

Prueba asi, me he tomado la libertad de hacer unos pequeños cambios a la calse
Código PHP:
class Conectar {
     
    protected 
$_servidor 'localhost';
    protected 
$_usuario 'root';
    protected 
$_pass '';
    protected 
$_basedatos 'nombre_mi_bbdd';   
                
    public function 
ConectarBbdd(){
        
$con mysqli_connect($this->_servidor$this->_usuario$this->_pass$this->_basedatos);
        if (
mysqli_connect_errno($con)){
            echo 
"Lo siento pero no conecta a la BBDD: " mysqli_connect_error($con);
            return;
        }
        if (!
mysqli_set_charset($con"utf8")) {
            
printf("Error al establecer el conjunto de caracteres utf8: %s\n"mysqli_error($link));
            return;
        }
        return 
$con;
    }
     
//fin de Conectar 
si aun asi sigues sin poder estblecer el conjunto de caracteres en utf8
prueba asi
Código PHP:
class Conectar {
     
    protected 
$_servidor 'localhost';
    protected 
$_usuario 'root';
    protected 
$_pass '';
    protected 
$_basedatos 'nombre_mi_bbdd';   
                
    public function 
ConectarBbdd(){
        
$con mysqli_connect($this->_servidor$this->_usuario$this->_pass$this->_basedatos);
        if (
mysqli_connect_errno($con)){
            echo 
"Lo siento pero no conecta a la BBDD: " mysqli_connect_error($con);
            return;
        }
        if (!
mysqli_set_charset($con"utf8")) {
            
printf("Error al establecer el conjunto de caracteres utf8: %s\n"mysqli_error($link));
            return;
        }
        
mysqli_query($con'SET NAMES utf8') or die(mysql_error());
        
mysqli_query($con'SET CHARACTER SET utf8') or die(mysql_error());
        
mysqli_query($con'SET COLLATION_CONNECTION="utf8_general_ci" ') or die(mysql_error());
        return 
$con;
    }
     
//fin de Conectar 
__________________
Unset($vida['malRollo']);
  #4 (permalink)  
Antiguo 18/04/2016, 04:57
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Insertar en bbdd caracteres especiales como acentos, etc

A ver por partes:

Babel; efectivamente he implementado lo de

Código PHP:
Ver original
  1. $nombre= htmlentities( $nombre);

Y me inserta en la bbdd los acentos en forma ejemplo "á"

Mi pregunta es: ¿Se podría insertar en la bbdd directamente la vocal con su acento en vez de á o no es posible?.

Por otra parte si se guarda asi : á efectivamente cuando quiera realizar busquedas en la bbdd , tambien tendré que utilizar htmlentities

y es genial que se eviten las inyecciones con htmlentities.

Pero a modo de saber si que me gustaria conocer si existe alguna manera de como he dicho antes insertar en bbdd directamente la vocal con su acento.


xerifandtomas:

Gracias por mejorar el codigo de mi conexion con bbdd, lo he implementado y va perfecto, muchas gracias a ti también por la ayuda.
  #5 (permalink)  
Antiguo 18/04/2016, 06:25
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Insertar en bbdd caracteres especiales como acentos, etc

A ver, htmlentitie no evita injeccion sql.
No es adecuado guardar las tildes como entidades de html en la base de datos, es una chapuza

Lo correcto es que revises todas las codificaciones y las normalices, para que el conjunto trabaje bien.

Revisa que en tu base de datos todo tenga la misma codificación.
En cuanto a la conexión de desde php, con los ajuste anteriores debería de ser suficiente.
En tu archivos php donde vas a mostrar datos en el navegador establece la codificación mediante header.
Y en los html generados más de lo mismo, establece la codificación mediante la etiqueta correspondiente.

En cuanto a los registros que ya tengas insertados de forma irregular, si son pocos, puedes volver a crearlos de forma adecuada, o editarlos directamente desde phpmyadmin por ejemplo.
Si son muchos, puedes intentar crear una función que te automatice el proceso.

Pero ten en cuenta que no se van a corregir solos por arte de magia, o por que hagas las cosas bien a partir de ahora.

Si creas un registro nuevo y accedes a la base de datos, se debe de ver tal cual, nada de caracteres raros, entidades html o lo que sea.

Si ingreso, áãéəëįîíóòôúü, en la bd se tiene que ver igual áãéəëįîíóòôúü.
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 19/04/2016 a las 06:05

Etiquetas: bbdd, caracteres, especiales, mysql, sql, tabla, usuarios
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 06:25.