Problema con Acentos en MySQL + PHP

Iniciado por Skeletron, 11 Marzo 2010, 06:01 AM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

Hola gente...
Resulta que hice un sistema de esos para seleccionar un pais, luego una region y luego una localidad de esta region.

La cuestion, es que cuando el usuario selecciona una region, la web recarga y debe aparecer la region que se ha seleccionado, como "SELECTED"
Hago un SELECT a la base de datos, donde traigo el NOMBRE de las regiones, y hago ésto para que aparezca SELECTADA la region seleccionada:

Código (php) [Seleccionar]
if($row['nombre']==$_SESSION['region']){
    echo '<option selected value="'.$row['nombre'].'">'.$row['nombre'].'</option>';
}else{
    echo '<option value="'.$row['nombre'].'">'.$row['nombre'].'</option>';
}


Como verán, en una variable de sesion, guardo el valor que seleccionó anteriormente..

La cuestion, es que esto funciona PERFECTAMENTE.. Pero para paises, regiones o localidades con acento, NO FUNCIONA..

Prueben entrar aqui: www.bropic.com
Arriaba a la izquierda de la web, le muestra las 3 varibales de session..
Seleccionen Argentina - Córdoba
Y veran que no funciona..
Pero si Seleccionan Argentina - Buenos Aires... Si funciona

Leí por ahí que es un problema del CHARSET de MySQL... es así?

Spider-Net

Yo como value utilizaría el identificador del país en lugar del nombre para evitarte este tipo de problemas. Y para que se muestre bien el nombre con acentos puedes usar htmlentities. De modo que quedaría algo así:

Código (php) [Seleccionar]
if($row['nombre']==$_SESSION['region']){
   echo '<option selected value="'.$row['idpais'].'">'.htmlentities($row['nombre']).'</option>';
}else{
   echo '<option value="'.$row['idpais'].'">'.htmlentities($row['nombre']).'</option>';
}

^Tifa^

Tiene una gran probabilidad de que sea asi  :rolleyes:

Que CHARSET tiene esa tabla donde buscas esa info????  Por lo general lo dejan en utf8

Haz un SHOW CREATE TABLE nombre_tabla;

Que charset tiene????

Puedes cambiarselo por latin1 por ejemplo:

ALTER TABLE nombre_tabla CHARSET = latin1;




Skeletron

El problema parece que no lo explique bien:

En ese codigo que pegué, en la sentencia: $row['nombre']==$_SESSION['region']

la comparacion no funciona bien.
Eso hace que, cuando se seleccione Córdoba, y el mysql_fetch_array devuelve la entrada Cordoba, lo que ahce, es imprimir el "Option" de HTML, pero SELECTADO.. así aparece ese como que fue el ultimo seleccionado.
Se entiende?

Sino, selecciona algun pais, mira que la web se recarga, y al recargarse, mira que aparece seleccionada la que seleccionaste... Eso se ahce con ese algoritmo.

El show create table dice:
CREATE TABLE `regiones` (
`id` smallint(4) unsigned NOT NULL auto_increment,
`id_pais` tinyint(3) unsigned NOT NULL default '0',
`nombre` varchar(150) NOT NULL,
PRIMARY KEY  (`id`,`id_pais`)
) ENGINE=MyISAM AUTO_INCREMENT=4230 DEFAULT CHARSET=latin1

^Tifa^

Ahhh eso es ya otro problemita amigo  :rolleyes:  y no tan relacionado con MySQL como tal (la tabla tiene el charset LATIN por lo que los registros deben tener acentos).

Es mas un problema entre PHP y programacion ;)

~ Yoya ~

#5
Bueno, tienes que usar el juego de caracter iso-8859-1, ejemplo:
Código (php) [Seleccionar]
<?php
header
('Content-Type: text/html; charset=iso-8859-1');
............
..........
.....
...
..
.
?>


O de esta forma:
Código (php) [Seleccionar]
<?php
header
('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
'
);
...........
.
.
?>


Recuerda que debes enviarlo al principio del code.


Info:
http://en.wikipedia.org/wiki/List_of_HTTP_headers
http://es.wikipedia.org/wiki/ISO_8859-1




Tambien puedes saber el juego de caracter predeterminado en tu Base de Datos, puedes usar este code que postee en Undersecurity...
Código (php) [Seleccionar]

<?php
//Conexion mysql
$conexionmysql_connect('localhost','root','pass');
echo 
"El juego de caracter en la base de dato es: ".mysql_client_encoding($conexion);
 
?>


Salida:
El juego de caracter en la base de dato es: latin1

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Skeletron

#6
Yo en el archivo INDEX.php tengo:
header('Content-Type: text/html; charset=UTF-8');

Y desde PHP hago un include a un php llamado: PREFERENCIA.php, donde en él esta éste codigo que da el problema.

Con tener ese HEADER en el index ya es basta?

~ Yoya ~

#7
Tienes que mandar el juego de caracter iso-8859-1 para que acepte las tildes, las ñ, etc...
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Skeletron

La sentencia que me dijiste que ejecute, dió el siguiente resultado:


El juego de caracter en la base de dato es: latin1

Skeletron

La solucion de HEADER que me propones, empeora las cosas..
Ahora empieza a mostrar textos así:

elige tu puntuación y verás la proxima