PDA

Ver la versión completa : Lios con encoding (JQuery)



AJaramillo
26-02-2012, 20:56
Hola a Tod@s,

Antes que nada, Saludos Cordiales,

Disculpenme extenderme tanto en el tema pero son las pruebas que realizado sin exito....

Les planteo el problema que tengo

Al hacer una consulta a la base de datos las columnas que contienen el caracter Ñ no los retorna, es decir, deja la columna vacía (null).

Si hago SELECT nombre FRON tabla WHERE id='1234' el valor obtenido es null.

Al hacer la consulta por pgAdmin me retorna bien el dato, el nombre es PEDRO PIÑERES.

Este es el código de cómo lo estoy haciendo:



datos = "col="+col+"&posi="+posi+"&ced="+ced+"&nom="+nom+"&accion=consultar";
console.log(datos);
$.ajax({
type: "POST",
url: "pret_multiple.php",
//contentType: "application/json; charset=ISO-8859-1",
//contentType: "application/json; charset=utf-8",
dataType: "json",
data: datos,
success: function(json) {
console.log(json);
}
});



Al hacerlo de esta manera no obtengo ninguna clase de respuesta, es decir, el console.log(json) no se ejecuta.

Al quitar el parámetro contentType sí obtengo respuesta pero el dato que necesito llega en null

El código php que estoy haciendo es el siguiente



case "consultar":
extract($_POST);
if (strlen(trim($ced)) > 0) {
$sel_comp = "maestro.cedula = '$ced'";
}
if (strlen(trim($nom)) > 0) {
$nom = ereg_replace("\*","%",$nom);
$p = strpos($nom,"%");
if ($p == 0)
$nom .= "%";
$sel_comp = "maestro.nombre like '$nom'";
}
$sql = "SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE $sel_comp AND estado = 'A' ORDER BY 2 ";
$res = lee_todo($sql);
$suc = true;
echo json_encode(
array(
"success" => $suc,
"msg" => $sql,
"data" => $res
)
);
die;


El resultado del query que estoy haciendo lo envío a una ventana emergente para mostrarlo y ahí sí me está mostrando los datos como deben ser.
El encoding de la base de datos es LATIN1

Mi idea original es la siguiente:

Si el resultado del query es solo una fila, no veo la necesidad de abrir la ventana emergente y así paso el resultado tal cual como viene a la forma (JQuery). El lío es acá ya que no me retorna el nombre.

Si el resultado del query son varias filas, abro la ventana emergente (SIN JQUERY), muestro el resultado obtenido del query en una forma con checkbox en cada fila para pasar el que se quiere a la ventana papá. Esto me funciona perfecto. Pero acá es donde me quedo como entre loco y bobo :confused::eek: tratando de deducir el por qué en la ventana emergente sí muestra bien los datos teniendo en cuenta que con el console.log veo que el nombre lo retorna nulo....

hystd
27-02-2012, 00:33
Al hacer una consulta a la base de datos las columnas que contienen el caracter Ñ no los retorna, es decir, deja la columna vacía (null).

Si hago SELECT nombre FROM tabla WHERE id='1234' el valor obtenido es null.

Al hacer la consulta por pgAdmin me retorna bien el dato, el nombre es PEDRO PIÑERES.

Pero no lo he entendido bien... el problema es que no te devuelve resultados cuando el caracter de un campo es ñ?

Necesito saber qué hace la función "leer_todo($sql)" de tu código, para saber realmente qué está metiendo en "data", cuando codificas los valores en formato json, con json_encode().

Suponiendo que en "data" almacenas el valor final, ¿Cómo está codificado el texto en la base de datos? Si está codificado como un caracter plano, prueba en tu código PHP, codificar cada caracter "especial" a su caracter HTML, haciendo uso por ejemplo de un simple str_replace("ñ", "&ntilde", $texto);

Un saludo.

AJaramillo
27-02-2012, 14:54
Hola hystd
Gracias por responder.



Necesito saber qué hace la función "leer_todo($sql)" de tu código, para saber realmente qué está metiendo en "data", cuando codificas los valores en formato json, con json_encode().

La funcion lee_todo($sql) es la que hace la consulta a la base de datos y retorna el resultado en un array

Al hacerle un console.log del query a realizar obtengo esto


[21:47:11.225] ({success:false, msg:"Empleado inactivo o no existe Cedula ",
sql:"SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE maestro.nombre like 'RODRIGUEZ PE\xD1UELA DANIEL%' AND estado = 'A' ORDER BY 2 ",
data:[]
})

Como puedes ver el select sql:"SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE maestro.nombre like 'RODRIGUEZ PE\xD1UELA DANIEL%' AND estado = 'A' ORDER BY 2 " y en data retorno el resultado del query

El caracter Ñ lo reemplaza por \xD1

La base de datos esta codificada como LATIN1
El encoding de PHP esta en ISO-8859-1

Ahora, si la consulta la hago por cedula el resultado obtenido es el siguiente:


({success:true, msg:"SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE maestro.cedula = '1026251701' AND estado = 'A' ORDER BY 2 ", data:[{cedula:"1026251701", nombre:null}]})



Si el resultado del query son varias filas, abro la ventana emergente (SIN JQUERY), muestro el resultado obtenido del query en una forma con checkbox en cada fila para pasar el que se quiere a la ventana papá. Esto me funciona perfecto
Salvo que reemplaza el caracter Ñ por N

hystd
27-02-2012, 19:33
Si accedes con un gestor de base de datos, (por ejemplo con PhpMyadmin, Query Browser, etc...), y accedes a un registro que contenga una Ñ, ¿cómo se están mostrando las "Ñ"?.

El caracter \xD1 significa "codifica el valor hexadecimal D1", que si vas a una tabla ASCII, D1 = 209, que se corresponde con el caracter Ñ mayúscula.

AJaramillo
27-02-2012, 20:23
Hola hystd

Gracias por su interes en el tema,

El motor de base de datos es PostgresQL 8.4.1. Como gestor utilizo phpPgAdmin y al hacer las consultas por este medio visualiza estos caracteres correctamente.

Lo que tambien he detectado es que si no utilizo JQuery los resultados los muestra bien, es decir, muestra las Ñ's tal cual, no las convierte a caracter extraño.

Lo que se me ocurre es que json de alguna manera hace esa conversion.

AJaramillo
28-02-2012, 19:37
Hola de nuevo....

Juepucha, llevo como tres días con este cuento y no lo he podido resolver

Si alguien pudiera realizar una prueba con este código se lo agredecería


<?
session_start();

include_once("lee_base.php");
include_once("configuracion/abrirbd.php");

if (isset($_POST["accion"])) {
$ced = $_POST["ced"];
$sql = "SELECT trim(nombre) as nombre FROM maestro WHERE cedula='$ced'";
if ($res = lee_todo($sql)) { //lee_todo funcion que ejecuta el query y regresa el resultado
$content = array("data" => $res,
"sql" => $sql
);
}
else {
$content = array("sql" => $sql,
"msg" => "Error en query"
);
}
armaRespuesta($content);
die;
}
muestra_forma();
die;

function armaRespuesta($content) {
if ( !function_exists('json_encode') ){
function json_encode($content){
//require_once 'Services/JSON.php';
require_once 'JSON.php';
$json = new Services_JSON;
return $json->encode($content);
}
}
else
echo json_encode($content);
die;
}

function muestra_forma() {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=LATIN1" />
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
<script>
$(document).ready( function () {
$("#ced").change( function () {
ced = $("#ced").val();
datos = $("#prueba").serialize()+"&accion=envia";
$.ajax({
data: datos,
type: "post",
dataType: "json",
url: "c.php",
success: function(json) {
console.log(json);
$.each(json.data, function (clave, valor) {
$("#nom").val(valor.nombre);
});
}
});
});
return false;
});
</script>
</head>
<body>
<form action="<?= $PHP_SELF; ?>" name="prueba" id="prueba" method="post">
<input type="text" id="ced" name="ced" value="">
<input type="text" id="nom" name="nom" value="">
</form>
</body>
</html>
<?
} ?>

El encoding que tiene la base de datos es LATIN1
En la columna nombre hay caracter Ñ y al existir dicho caracter me retorna el campo vacío (null)

Mil Gracias por su ayuda