entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Buen día, tengo un problema con una tabla dinámica que lleno mediante una base de datos... lo que necesito es que se pueda ordenar al hacer click en los encabezados, cosa que sí realiza pero sólamente cuando doy f5 a la página :/ al iniciar la página o mandar un criterio de agrupamiento y presionar el botón submit vuelve a congelarse la acción de poder ordenar la tabla ... adjunto parte del código:

<div id="Divini" style='display:none;'>
        <a href="#0" class="cd-btn">Menú</a>
                    <center>
    <form action="principal.php" method="post">         
            <LABEL FOR="CheckMpio">Municipio</LABEL>
            <input name="CheckMpio" ID="CheckMpio" type="checkbox" value="1" onclick="listMpioIni.style.visibility = (this.checked) ? 'visible' : 'hidden'">
                            <select onclick="this.style.width = ‘auto';" onblur="this.style.width = '200px';" style="width:200px;" name="listMpioIni" id="listMpioIni" style="visibility:hidden">
                                <option value="">Seleccione Municipio</option>
                                <?php
                                while($fila=mysqli_fetch_array($res)){
                                ?>
                                <option value="<?php echo $fila[0]; ?>"><?php echo utf8_encode($fila[1]); 
                                ?></option>
                            <?php } ?>

                            </select>
                            <?php
                                $con=conexion();
                                $res=mysqli_query($con,"SELECT `id_subs`,`clave_subs` FROM `subsistema`");
                            ?>

        <LABEL FOR="CheckSubs">Subsistema</LABEL>
        <input name="CheckSubs" ID="CheckSubs" type="checkbox" value="1" onclick="ListSubsIni.style.visibility = (this.checked) ? 'visible' : 'hidden'">
                            <select onclick="this.style.width = ‘auto';" onblur="this.style.width = '200px';" style="width:200px;" name="ListSubsIni" id="ListSubsIni" style="visibility:none">
                                <option value="">Seleccione Subsistema</option>
                                <?php
                                while($fila=mysqli_fetch_array($res)){
                                ?>
                                <option value="<?php echo $fila[0]; ?>"><?php echo utf8_encode($fila[1]); 
                                ?></option>
                            <?php } ?>

                            </select>
                            <br>
            <LABEL FOR="SlctOrden">Ordenar por:</LABEL>
            <select onclick="this.style.width = ‘auto';" onblur="this.style.width = '200px';" style="width:200px;" name="SlctOrden" id="SlctOrden" style="visibility:none">
                <option value="Q.ID_Q">Clave</option>
                <option value="Shortname">Nombre de Proyecto</option>   
                <option value=" Q.descripcion">Descripción</option> 
                <option value="mpio.nombre">Municipio</option>  
                <option value="Nvl.Clave_Nvl">Nivel</option>    
                <option value="subs.Clave_subs">Subistema</option>  
                <option value="Total">Total Asignado</option>   
                <option value="TotalEx">Total Ejercido</option> 
                <option value="saldo">Saldo</option>    
                <option value="semaforo">Semáforo</option>  
            </select>
            <LABEL FOR="slcmodo">Modo de ordenamiento:</LABEL>
            <select onclick="this.style.width = ‘auto';" onblur="this.style.width = '200px';" style="width:200px;" name="slcmodo" id="slcmodo">
                <option value="asc">Ascendente</option>
                <option value="desc">Descendente</option>   
            </select>
                <br>
                <input type="Submit" name="enviarSlc" value="Ok"></td>          
            </form>
        </div>
            <br><div id="divContenedor">
            <div id="divTabla">
                        <label for="txtBuscar">Buscar: </label>
                        <input type="search" id="txtBuscar" autofocus
                        placeholder="Digite el texto que desea encontrar y presione ENTER. Para cancelar la tecla ESCAPE.">
                     </center>
                        <?php 
                        $criterio='semaforo';
                        $modo='asc';
                        //Si se pulsa el botón de enviar
                        if (isset($_POST['enviarSlc']))
                        {
                           //Si el checkbox municipio tiene valor y es igual a 1
                           if (isset($_POST['CheckMpio']) && $_POST['CheckMpio'] == '1')
                           {
                                if (isset($_POST['CheckSubs']) && $_POST['CheckSubs'] == '1')
                                $query="sentencia a BD para regesar datos”;
                           }

                           else{
                             if (isset($_POST['CheckSubs']) && $_POST['CheckSubs'] == '1')
                             {
                                 $query="sentencia opción 2 ";
                             }
                                else
                                    $query="sentencia opción 3";
                            }
                            echo "<script></script>";
                        }

                        else
                            $query="sentencia opción 4 ";

                        if(isset($_POST['SlctOrden']))
                            $criterio=$_POST['SlctOrden'];
                        if(isset($_POST['slcmodo']))
                            $modo=$_POST['slcmodo'];
                        $query=$query.$criterio." ".$modo;

                        displayTable($query);
                        ?>
            </div>
        </div>
            <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
            <script type="text/javascript" src="js/buscar-en-tabla.js"></script>

    <?php

//Función para mostrar la tabla, obtiene la opción de sentencia SQL deseada.
 function displayTable($sql){
       //Creamos la conexión
     $con=conexion();  
       //generamos la consulta
       if(!$result = mysqli_query($con, $sql)) die();
       $rawdata = array();
       //guardamos en un array multidimensional todos los datos de la consulta
       $i=0;
       while($row = mysqli_fetch_array($result))
       {
           $rawdata[$i] = $row;
           $i++;
       }
        mysqli_free_result($result);
       $close = mysqli_close($con);
       //DIBUJAMOS LA TABLA
       echo "<table id=\"ReportesEspecificos\" class=\"sortable-theme-slick\" data-sortable>";
       if(count($rawdata)>0)
       {
       $columnas = count($rawdata[0])/2;
       //echo $columnas;
       $filas = count($rawdata);
       //echo "<br>".$filas."<br>";

       //Añadimos los titulos
      echo "<thead><tr>";
       for($i=1;$i<count($rawdata[0]);$i=$i+2){
          next($rawdata[0]);
          echo "<th>".key($rawdata[0])."</th>";
          next($rawdata[0]);
       }
       echo "<th>Ver Detalle</th>";
       echo "</tr></thead><tbody>";

       for($i=0;$i<$filas;$i++){
          echo "<tr>";
          for($j=0;$j<$columnas;$j++){
             echo "<td>".utf8_encode($rawdata[$i][$j])."</td>";
         }      
         echo "<td><a href='rptQesp.php?q=".utf8_encode($rawdata[$i][0])."' target='_blank'><img height=50px src='./sources/detalle.png'>";
          echo "</tr>";
       }

       echo "</tbody></table>";

        }
        else
        {
            echo "<script>alert('No existen registros que coincidan con el agrupamiento')
                    window.location='principal.php';
                </script>";
        }
    }
    ?>

    </div><!--Fin div inicio-->

2 Respuestas

1voto

Leonardo-Tadei Puntos227320

Hola @daneelo,

el comportamiento que obtenés ahora está dado por el órden del código. Una script PHP es ejecutado por el servidor, el resultado es devuelto al navegador y se desconecta.

Una nueva petición implica volver a empezar todo el proceso, con lo que los resultados de las variables se pierden.

Lo que de debe estar pasando es que, al tener el proceso de los datos al final del script en vez de al principio, estás generando la salida correspondiente antes de procesarlos, con lo que da la sensación de que todo funciona como si estuvieras en el click anterior.

Pasá todo el procesamiento de las variables y la generación de la query al principio del script y debería solucionarse.

Hay también un poco de JavaScript inconsistente como la llamada a window.location o la generación del script vacío, que no estaría de más revisar.

Saludos!

0voto

Kyrios Puntos340

No estoy del todo seguro pero una posible solucion podria ser el uso de datatables de jquery, de ese modo los datos se obtienen y se muestran en la tabla y para el ordenamiento se hace del lado del cliente, ya no del servidor, de ese modo se evita abrir y cerrar conexiones.
Datatables

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta