Resultados 1 al 6 de 6

Lios con encoding (JQuery)

  1. #1 Lios con encoding (JQuery) 
    Iniciado
    Fecha de ingreso
    Feb 2012
    Mensajes
    15
    Descargas
    0
    Uploads
    0
    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:

    Código:
            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

    Código:
            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 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....
    Citar  
     

  2. #2  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    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.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  3. #3  
    Iniciado
    Fecha de ingreso
    Feb 2012
    Mensajes
    15
    Descargas
    0
    Uploads
    0
    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
    Última edición por AJaramillo; 27-02-2012 a las 16:00
    Citar  
     

  4. #4  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    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.
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  5. #5  
    Iniciado
    Fecha de ingreso
    Feb 2012
    Mensajes
    15
    Descargas
    0
    Uploads
    0
    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.
    Citar  
     

  6. #6  
    Iniciado
    Fecha de ingreso
    Feb 2012
    Mensajes
    15
    Descargas
    0
    Uploads
    0
    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
    Código PHP:
    <?
    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
    Citar  
     

Marcadores

Marcadores