1

En este procedimiento solo devuelve valores numérico si existe es decir si existe devuelve un valor true + 1 fila, pero no devuelve los datos registrados de la base a datos a ajax.

Código fetch.php:

 if(isset($_POST["employee_id"]))  {
    $stmt = $con->prepare("SELECT name,address,gender,designation,age FROM tbl_employee WHERE id = '".$_POST["employee_id"]."' ");
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($name,$address,$gender,$designation,$age);

    while ($row = $stmt->fetch()) {

        echo json_encode($row);
    }

 }

Resultado:

introducir la descripción de la imagen aquí

Cómo se observa no devuelve ningún dato del usuario

En cambio con este procedimiento devuelve los datos registrados de la base de datos.

Código fetch.php:

 if(isset($_POST["employee_id"]))  { 
      $query = "SELECT * FROM tbl_employee WHERE id = '".$_POST["employee_id"]."'";  
      $result = mysqli_query($connect, $query);  
      $row = mysqli_fetch_array($result);  
      echo json_encode($row);  
 }  

Resultado:

introducir la descripción de la imagen aquí


Realizo el var_dump al código de la respuesta de A. Cedano.

var_dump($arrResultado);

Resultado del var_dump

[{"name":"1","address":"1","gender":"Male","designation":"1"‌​,"age":1}]array(1) { [0]=> array(5) { ["name"]=> &string(1) "1" ["address"]=> &string(1) "1" ["gender"]=> &string(4) "Male" ["designation"]=> &string(1) "1" ["age"]=> &int(1) } }
Pedro
  • 337
  • 3
  • 13
  • ¿Y cuál es el problema? – A. Cedano Jan 01 '18 at 10:09
  • Hola @A.Cedano ¡Feliz Año nuevo 2018! Edite mi pregunta, el problema es que con el procedimiento orientado a objetos este no devuelve datos del usuario me muestra todos los campos en blanco, en cambio en mysqli normal en el código anterior si muestra los datos. – Pedro Jan 01 '18 at 11:53

2 Answers2

2

Nota: Voy a dar mi respuesta, esperando un debate en caso de que mi respuesta no este correcta sobre el tema del driver mysqlnd o si no esta en un correcto uso el procedimiento orientado a objetos / sentencias preparadas.

Ya lo habia mencionado @A.Cedano, sobre el problema del driver mysqlnd aquella extensión mysqlnd (controlador nativo de MySQL) no esta siempre disponible en otros equipos.

Pero si ese problema no fuera problema, se podría hacer eso con bastante facilidad, simplemente no puedes hacerlo con el mysqli_stmt objeto, tienes que extraer el subyacente mysqli_result, y hacerlo simplemente llamando mysqli_stmt::get_result().

Más información en la siguiente fuente de PHP

También puedes observar más información en SO ingles, puedes observar algunas ventajas y desventajas.

Cómo lo dije anteriormente si el driver mysqlnd no sería un problema, la solución sería la siguiente:

  if(isset($_POST["employee_id"]))  {
    $id=$_POST["employee_id"];
    $stmt = $con->prepare("SELECT * FROM tbl_employee WHERE id = ?");
    //$stmt = $con->prepare("SELECT name,address,gender,designation,age FROM tbl_employee WHERE id = '".$_POST["employee_id"]."' ");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    //$stmt->store_result();
    //$stmt->bind_result($name,$address,$gender,$designation,$age);

    $result = $stmt->get_result();

    while ($data = $result->fetch_assoc()){

    //while ($row = $stmt->fetch()) {

        echo json_encode($data);
    }

 }

Otro tema referencial a la solución de A. Cedano en la siguiente fuente una function similar a la misma.

De lo contrario, puede consultar los elementos de la matriz directamente en bind_result(), en lugar de usar variables separadas.

  if(isset($_POST["employee_id"]))  {
    $id=$_POST["employee_id"];
    $stmt = $con->prepare("SELECT name,address,gender,designation,age FROM tbl_employee WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();

    $member = array();
    $stmt->bind_result($member['name'], $member['address'], $member['gender'], $member['designation'], $member['age']);

    while ($stmt->fetch()) {
        echo json_encode($member);
    }

 }
Publisere.com
  • 2,384
  • 5
  • 14
  • Creo que se requiere obtener los resultados en una sola variable que sería retornada con `json_encode` para luego leerla en el `success` de Ajax. Si la lees en el código PHP dentro del `while`, va a haber problemas en caso de que la consulta devuelva más de una fila... si se tratase por ejemplo de llenar una tabla con varias filas obtenidas de la consulta, en el `success` tendrás al final solamente una fila... En cuanto a llenar el array con `bind_result`... ok, pero cuando haya que manejar 1 consulta con muchas columnas tendrías que poner cada columna a mano. La idea del método es simplificar – A. Cedano Jan 01 '18 at 16:02
  • @A.Cedano Bueno en ese caso tienes razón, el `get_result` es ideal a la hora de simplificar las cosas, ahora para evitar más de una fila de resultados podemos solucionarlos mediante un `LIMIT 1` para evitar ese problema en caso de haber más de una fila, pero el diseño de la estructura del código del SO se observa que son resultados de una sola fila, pero bueno en caso de columnas pequeñas se puede optar por esta solución, una otra alternativa tanto en `get_result` de su respuesta y una sobre el uso de `bind_result` – Publisere.com Jan 01 '18 at 16:09
  • Es correcto. Pero cuando necesites más de una fila ya ese código no te servirá... en cambio, la solución propuesta serviría para cualquier código. De ese modo, no tienes que mantener dos estilos de código diferentes y la única **pequeña** diferencia sería modificar la forma de leer la respuesta en el `success`, ya que el método `get_result` tratado en la respuesta de más abajo devuelve un Array JSON en vez de un objeto JSON, por tanto en el `success` habría que leerlo en un bucle o accediendo a los índices del array. – A. Cedano Jan 01 '18 at 16:15
  • @A.Cedano Pueden ayudarme a solucionar las peticiones de ajax, con la nueva versión jQuery realizando cambios en el código para poder adaptar sus respuestas a mis peticiones ajax por favor este es mi pregunta del código ajax jquery https://es.stackoverflow.com/questions/127249/cómo-actualizar-código-jquery-a-la-nueva-versión-y-solucionar-error-en-ver-edi – Pedro Jan 01 '18 at 16:35
  • @Pedro voy a crear un fiddle con un ejemplo completo, que te sirva para leer una o varias filas indistintamente. El problema está en la lectura que haces de la respuesta en el `success` de Ajax. – A. Cedano Jan 01 '18 at 16:39
  • @A.Cedano Podría basarse al código de esta [pregunta ajax](https://es.stackoverflow.com/questions/127249/cómo-actualizar-código-jquery-a-la-nueva-versión-y-solucionar-error-en-ver-edi) ya que el sistema funciona en ver, editar y agregar datos desde un popup modal box jQuery usando ajax y PHP – Pedro Jan 01 '18 at 16:41
  • @Pedro Yo te ayudaría pero no estoy tan profundizado en ese tema, y unas de las preguntas que quizás yo preguntaría aquí sería de ese tema... Pero A.Cedano va ayudarte, esperemos ver su respuesta y así la veo para aprender un poco, Saludos! – Publisere.com Jan 01 '18 at 16:55
1

Ahora entiendo.

Quiero comentarte algunas cosas sobre tu código, por orden de importancia.

1. Tu código es vulnerable

Habrás escuchado hablar de la Inyección SQL. La cual se evita usando consultas preparadas. Pero sucede que tú en realidad no preparas nada al escribir la consulta así:

$stmt = $con->prepare("SELECT name,address,gender,designation,age FROM tbl_employee WHERE id = '".$_POST["employee_id"]."' ");

Pues el hecho de pasar este valor directamente en la consulta $_POST["employee_id"] es la vulnerabilidad real del código, ya que ese valor puede ser cambiado por un usuario mal intencionado y tendrás la inyección.

Corregiremos esa vulnerabilidad en la propuesta de código final.

Si quieres conocer más sobre el riesgo que supone la Inyección SQL puedes leer las siguientes preguntas y sus respuestas:


2. El problema de obtener un array asociativo con mysqli y consultas preparadas

La extensión MySQLi tiene sus limitaciones. Y una de ellas es que para obtener un arreglo asociativo cuando usas consultas preparadas puede convertirse en un verdadero dolor de cabeza, cuando no tienes el driver llamado mysqlnd. Y, aunque lo tengas en tu máquina actual y escribes código basado en ese driver, dicho código no te funcionará si lo ejecutas en otro equipo que no tenga el driver instalado.

Yo plantée ese proble aquí: ¿Cómo obtener un arreglo asociativo usando consultas preparadas con mysqli?, y la respuesta aceptada permitió implementar una función en nuestro código que nos permitirá hacer lo que queremos, sin tener que recurrir a un driver que podrá estar instalado en algunos equipos y en otros no. Es una solución mejor, porque así el código no fallará. Si es un procedimiento que vas a hacer con mucha frecuencia, puedes incorporar esa función a una clase utilitaria para usarla con más facilidad, creando instancias de esa clase.


3. Solución propuesta

Tomando en cuenta lo dicho antes, propongo esta solución:

if(isset($_POST["employee_id"]))  {
    $id=$_POST["employee_id"];
    $stmt = $con->prepare("SELECT name,address,gender,designation,age FROM tbl_employee WHERE id = ?");

    /*Verificamos que la preparación fue correcta*/
    if ($stmt) {
        /*Si el campo id es VARCHAR cambias la "i" por una "s" en bind_param*/
        $stmt->bind_param("i", $id);
        $stmt->execute();
        /*Aquí pasamos $stmt a nuestra función para que cree el arreglo asocitativo*/
        $arrResultado = get_result($stmt);      
    }else{
        $arrResultado=array("error"=>$stmt->error);
    }
    echo json_encode($arrResultado);
} 


/*Esta es la función que menciono en el punto 2*/
function get_result( $Statement ) {
    $RESULT = array();
    $Statement->store_result();
    for ( $i = 0; $i < $Statement->num_rows; $i++ ) {
        $Metadata = $Statement->result_metadata();
        $PARAMS = array();
        while ( $Field = $Metadata->fetch_field() ) {
            $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
        }
        call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS );
        $Statement->fetch();
    }
    return $RESULT;
} 

4. Ejemplo basado en un escenario real

Te comparto aquí un demo que he hecho.

El código está suficientemente comentado por si hay algo que no entiendes.

A. Código HTML/JAVASCRIPT

Notarás que:

  1. en el formulario, yo he dado inteligentemente un id a cada elemento que es igual a los nombres de columna de los mismos en la tabla. De ese modo, al leer la respuesta de Ajax, podré hacer referencia a cada elemento leyendo el valor del key del JSON, para así establecer su valor.

  2. existe un div dedicado a presentar los posibles errores que ocurran. (Esto es opcional, aunque es muy útil a nivel informativo).

  3. he mejorado el código de la petición Ajax, haciéndolo más claro, usando done, dado que success es obsoleto desde jQuery 3 e incorporando también una función fail para controlar posibles errores en la petición.

Todo lo demás está comentado en el código.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>
            Llenar un  formulario  con  datos del  servidor mediante Ajax: https://es.stackoverflow.com/q/128118/29967
        </title>
        <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <style type="text/css">
        </style>
    </head>
    <body>
        <div style="margin: 50px 10%;">
            <form id="myForm">
                <label for="actor_id">Id:</label>
                <input id="actor_id" type="text">
                <br />
                <label for="actor_nombre">Nombre:</label>
                <input id="actor_nombre" type="text">
                <br />
                <label for="actor_apellido">Apellido:</label>
                <input id="actor_apellido" type="text">
                <br />
                <label for="actor_sexo">Sexo:</label>
                <input id="actor_sexo" type="text">
                <br />
                <label for="last_update">Fecha:</label>
                <input id="last_update" type="text">
            </form>
            <hr />
            Escriba un id para buscar:<input id="id_criterio" type="number" value=1>
            <br />
            <button id="btnLlenar" type="button">Click para llenar Formulario</button>
        </div>
        <div id="error">
        </div>


        <script type="text/javascript"> 
            $("#btnLlenar").click(function() {
                /*Esta es mi URL  y datos de prueba*/
                var myurl = "http://main.xfiddle.com/<?php echo pf_file('bvfj-j197'); ?>";
                var id_criterio=$('#id_criterio').val();
                var data={id:id_criterio};
                var request = $.ajax
                ({
                    url: myurl,
                    method: 'GET',
                    data: data  
                    //dataType:  'json' se recibirá un array que se parseará con parseJSON
                }
                );
                request.done(function( data ) 
                {
                    var data = $.parseJSON(data);
                    $.each(data, function(key, value)
                    {
                        /*Mostramos posibles  errores*/
                        if(value.hasOwnProperty('error')){
                            $('#error').text(value["error"]);
                        }else{
                            $.each(value, function(key, value){
                                $('#'+key).val(value);
                            });
                        }
                     });
                });

                request.fail(function( jqXHR, textStatus ) 
                {
                   alert( "Request failed: " + textStatus );
                });
            });
        </script>
        <?php
        ?>
    </body>
</html>

B. Código PHP

El código PHP utiliza la función de la que he hablado en mi respuesta para consultar a la base de datos. También, va controlando cualquier eventualidad que ocurra y la introduce en un array. Cuando ocurre cualquier error, dicho array tendrá una clave llamada error y un mensaje con el motivo del error (verás que luego en la respuesta de Ajax se busca si existe alguna clave llamada error y si se encuentra se imprime el mensaje correspondiente en un div dedicado exclusivamente a esos fines.

<?php

/* OBJETO CONEXIÓN */
$mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port);

/*
        * Escribiremos un código controlado, que vaya evaluando las variables
        * Nunca podemos dar por hecho que las cosas funcionarán porque sí
*/

/*
        *1ª evaluación: ¿la conexión está activa?
        *Este sería el primer paso antes de lanzar cualquier código
        *relativo a la base de datos
*/
if (isset($_GET["id"])){

    if ($mysqli){

    /*
            *CONSULTA PARA PREPARAR
            *En estas consultas en vez de los valores pone el signo ?
            *Habrá tantos signos ?  como valores externos se requieran
            *Aquí sólo se usa uno, pero pueden ser más
    */
    $sql = "SELECT * FROM actor_20171002 WHERE actor_id = ?";

    /*
            *VALORES
            *Generalmente los valores son recuperados por $_POST o $_GET
            *Aquí asignamos a la variable $id el valor recuperado con $_GET
    */
    $id=$_GET["id"];


    /*
            *PREPARAR LA CONSULTA
    */
    $stmt=$mysqli->prepare($sql);
    /*
            *2ª evaluación: ¿La consulta se preparó bien?
            *Dado que el método prepare invocado antes devuelve FALSE
            *si hay algún error, podemos preguntar si $stmt es TRUE
            *Si no lo es, significa que hubo un error en la consulta
    */

    if ($stmt) {
        /*
              * Si la consulta se preparó bien, ahora le pasamos aparte los valores
              * Este es el núcleo de las consultas preparadas
              * Se usa aquí bind_param para pasar los valores
              * IMPORTANTE: Aquí se pasan tantos valores como signos de ? haya en la instrucción $sql
              * como la instrucción tenía un sólo ?, pasamos un solo valor
              * cuando hay más valores, estos deben pasarse en el orden en que aparecen en $sql
              * La "i"  indica el tipo de dato de esa columna en la base de datos
              * en este caso es un dato numérico, si fuese cadena, en vez de "i" habría "s"
              * si fuese uno numérico y otro cadena entonces tendríamos "is", y así por el estilo...
        */

        $stmt->bind_param("i", $id);
        $stmt->execute();

        /*
                * ALMACENAR LOS RESULTADOS
                * mysqli tiene un problema cuando se trata de almacenar los resultados
                * en arrays asociativos usando consultas preparadas
                * por eso es invocado aquí el método get_result hecho a mano
                * ya que éste sólo funciona en servidores con mysqlnd instalado
                * el método get_result puede ser guardado en una clase utilitaria
                * y llamarlo mediante una nueva instancia de esa clase cuando lo necesitemos
                * o, si hacemos muchas operaciones de este tipo, recomiendo pasar de mysqli a PDO
        */
        $arrDatos=myget_result($stmt);
        if(!$arrDatos){
            $arrDatos=array(array("error"=>"La consulta no  arrojó  datos"));         
        }
              $arrResultado=$arrDatos;

        /* Cerramos el $stmt */
        $stmt->close();

    }else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */
        $arrResultado=array(array("error"=>"Hubo un fallo en la consulta: ".$mysqli->error));
    }    

    /* Cerramos la conexión */   
    $mysqli->close();

}else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */
    $arrResultado=array(array("error"=>"La conexión es nula: ".$mysqli->error));
}
}else{

    $arrResultado=array(array("error"=>"No se enviaron criterios en el POST"));

}
/*
    *Imprimimos el resultado final
*/
print_r(json_encode($arrResultado));


/*
    * FUNCION QUE EMULA EL FETCH_ASSOC DE PDO
    * Esta función nos permite crear un array asociativo 
    * con los resultados. Así accedemos fácimente a su valor
    * por el nombre de columna en la base de datos
*/

function myget_result( $Statement ) {
    $RESULT = array();
    $Statement->store_result();
    for ( $i = 0; $i < $Statement->num_rows; $i++ ) {
        $Metadata = $Statement->result_metadata();
        $PARAMS = array();
        while ( $Field = $Metadata->fetch_field() ) {
            $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
        }
        call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS );
        $Statement->fetch();
    }
    return $RESULT;
}   

?>

Resultado

El resultado del lado del servidor es un arreglo JSON parecido a este:

[{
    "actor_id":1,
    "actor_nombre":"Jack",
    "actor_apellido":"Nicholson",
    "actor_sexo":"M",
    "last_update":"2017-10-23 10:08:02"
}]

Los corchetes de apertura y de cierre significa que se trata de un Array JSON, que no es lo mismo que un Objeto JSON. Por eso en la respuesta de Ajax no he puesto el dataType: "json", tengo que recibir el array y convertirlo a objeto JSON usando parseJSON.

El formulario se llenará más o menos así al hacer clic en el botón:

introducir la descripción de la imagen aquí

Aquí tienes un demo del código que ejecuta la petición Ajax.

Te toca a ti adaptarlo, si quieres optar por esa vía de solución.

Espero te sirva.

Nota: Cabe destacar que gran parte de la solución a tu problema parece complicada debido al problema planteado en el punto 2 de la respuesta. Si estuviéramos usando PDO por ejemplo, éste cuenta con métodos adecuados para convertir nuestros resultados en un array asociativo que sería convertido posteriormente a JSON sin mayores complicaciones.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Gracias por aclarar cada tema amigo, pero por alguna razón aún los datos los recibo en blanco? – Pedro Jan 01 '18 at 12:31
  • ¿Podrías hacer un `var_dump($arrResultado);` para ver lo que hay dentro y verificar si el código está funcionando? Revisa bien, no sea que hayas cometido un mínimo error que impide que funcione. – A. Cedano Jan 01 '18 at 12:37
  • tuve que hacerlo manualmente para poder realizar el `var_dump` y me imprime el siguiente resultado `[{"name":"1","address":"1","gender":"Male","designation":"1","age":1}]array(1) { [0]=> array(5) { ["name"]=> &string(1) "1" ["address"]=> &string(1) "1" ["gender"]=> &string(4) "Male" ["designation"]=> &string(1) "1" ["age"]=> &int(1) } }` – Pedro Jan 01 '18 at 12:41
  • Algún error de manipulación debe haber en el código porque está como creando dos arrays con los resultados. ¿Podrías editar tu pregunta agregando al final el código completo modificado? No sustituyas nada de lo que hay ahora, agrega simplemente al final el nuevo código. No entiendo a qué te refieres cuando dices *tuve que hacerlo manualmente...* – A. Cedano Jan 01 '18 at 12:45
  • He puesto el mismo código de su respuesta, para ver ese resultado lo hice de esta manera: https://ideone.com/liqBOO tuve que hacerlo directo en el archivo pero manualmente porque yo estoy llamando el resultado por medio de ajax https://ideone.com/b8xS8h – Pedro Jan 01 '18 at 12:49
  • Tengo limitaciones para revisar el código desde el móvil. ¿Si te funciona bien poniendo el valor del id manualmente no será problema del valor recibido en el POST? ¿Algún espacio en blanco en el dato o algún id que no existe? – A. Cedano Jan 01 '18 at 13:20
  • Añadido el código a la pregunta, actualice la pregunta nuevamente... Pero en el código simple de mysqli muestra los datos de cada uno de los usuarios... ***Pero en mi procedimiento realizado, y en el procedimiento de su respuesta sigo recibiendo datos vacíos*** – Pedro Jan 01 '18 at 13:29
  • @Pedro en realidad no recibes datos vacíos, sino que el código crea un Array JSON, y no un objeto JSON (son ligeramente diferentes). Si en el `success` tú cambias la forma de leer `data` por algo como esto por ejemplo: `$('#name').val(data[0].name);` debería funcionar. O sea, habría que acceder por el índice 0 a los elementos del JSON array o bien recorrerlo dentro de un bucle. – A. Cedano Jan 01 '18 at 13:50
  • @A.Cedano un +1 por el gran aporte sobre todo por la explicación bien detallada. – Publisere.com Jan 01 '18 at 16:37
  • @Pedro he editado la respuesta, poniendo un ejemplo de código funcional el cual podrás adaptar a tus necesidades. – A. Cedano Jan 01 '18 at 19:41
  • @A.Cedano Amigo yo probe el código de IniDesing y funciona tambien, pero su código el fallo estaba en el ajax como lo decías pero no sería mejor que me diera una respuesta del código javascript ajax que has realizado a esta pregunta ya que al tener dos códigos distintos estaría nuevamente en las nubes esta es el código ajax que estoy usando de esta pregunta: https://es.stackoverflow.com/questions/127249/cómo-actualizar-código-jquery-a-la-nueva-versión-y-solucionar-error-en-ver-edi – Pedro Jan 01 '18 at 19:52
  • @Pedro leyendo tu otra pregunta, no entiendo bien el problema que planteas en ella y además me parece algo amplia tal y como la tienes planteada ahora. Ahora mismo no tendría tiempo de detenerme a analizar aquel problema para darte una respuesta adecuada. Ya he invertido aquí un tiempo considerable tratando de responder al problema que planteas en **esta** pregunta. La idea aquí es dar una respuesta que funcione tanto si quieres presentar un solo dato como si quieres presentar varios (una tabla con varias filas por ejemplo). – A. Cedano Jan 01 '18 at 20:03
  • Para mi las claves son dos en este tipo de problemas: en el PHP crear una respuesta organizada y controlada y en el Ajax saber leer esa respuesta adecuadamente. Es lo que he intentando explicar aquí. De ese modo, el código funcionará tanto si recibes una sola fila de resultados, como si recibes varias filas. – A. Cedano Jan 01 '18 at 20:05
  • @A.Cedano Bueno amigo te he marcado la respuesta como solucionada por el tiempo dedicado, pero no me va ayudar de mucho el mayor esfuerzos que has realizado en esta edición debido a que yo estoy editando, agregando, y actualizando datos de un usuario desde un popup modal box jQuery, y el código completo de la aplicación es el que te había comentado... – Pedro Jan 01 '18 at 20:24
  • @Pedro las respuestas se marcan como soluciones cuando realmente lo son, no porque se dedique más o menos tiempo a ellas. Si consideras que mi respuesta no responde a lo que planteas aquí, no la marques. No obstante, creo que la respuesta responde con bastante amplitud a **esta** pregunta (se trataba de una respuesta JSON que llene el formulario usando consultas preparadas) y si la analizas bien, te podría ayudar incluso en el problema global que tienes y que planteas en la otra pregunta... – A. Cedano Jan 01 '18 at 20:29
  • @A.Cedano jeje si amigo el tema fue solucionado a la base de mi pregunta... solo que no hemos salido del tema por eso igual la marco... Pero aún sigo teniendo problemas voy actualizar la pregunta de jQuery – Pedro Jan 01 '18 at 20:30