Как включить нумерацию страниц в функцию, которая отображает таблицу из mysql?

#php #html #mysql #html-table #pagination

#php #HTML #mysql #html-таблица #разбивка на страницы

Вопрос:

У меня есть эта функция, которая отображает информацию из таблицы mysql, и она отлично работает, когда я ее вызываю.

Однако у меня возникли проблемы с пониманием того, как изменить его так, чтобы он включал разбивку на страницы и не отображал все в таблице.

Вот код функции:

 function tabla_presupuestos() {
    $conexion_bd = conectar();

    $consulta = "
    SELECT d.idPre
         , em.nombre as doctor
         , pac.nombre as paciente
         , d.diagnostico
         , DATE_FORMAT(d.fechaEmision, '%M %e %Y') as fechaEmision
         , DATE_FORMAT(d.fechaVencimiento, '%M %e %Y') as DiasRestantes 
      FROM empleado em
         , paciente pac
         , presupuestodental d 
     WHERE em.idEmpleado = d.idEmpleado 
       AND pac.idPaciente = d.idPaciente 
     ORDER 
        BY fechaEmision
    ";

     $resultados_consulta = $conexion_bd->query($consulta);
     $resultado = '<div style="width:auto; margin:0 auto;"><table class="table table-striped">';
     $resultado .= '<thead bgcolor="lightblue"><tr><th scope="col">Doctor</th><th  scope="col">Paciente</th><th scope="col">Diagnostico</th><th scope="col">Fecha de Emisión</th><th scope="col">Vencimiento</th><th scope="col"> </th><tr></thead>';

     while ($row = mysqli_fetch_array($resultados_consulta, MYSQLI_ASSOC)) {

        $resultado .= '<tbody><tr>';
        $resultado .= '<td>'.$row["doctor"].'</td>';
        $resultado .= '<td>'.$row["paciente"].'</td>';
        $resultado .= '<td><a href="editardiagnostico.php?idPre='.$row["idPre"].'">'.$row["diagnostico"].'</td>';
        $resultado .= '<td>'.$row["fechaEmision"].'</td>';
        $resultado .= '<td>'.$row["DiasRestantes"].'</td>';
        $resultado .= '<td><a href="borrar_presupuesto.php?idPre='.$row["idPre"].'"><button class="btn btn-danger">Ocultar</button></a></td>';
        $resultado .= '</tr>';
     }
        $resultado .= '</tbody></table></div>';
        desconectar($conexion_bd);
        return $resultado;
}
 

Комментарии:

1. Итак, вам нужно предложение LIMIT в запросе и некоторые предыдущие кнопки / ссылки, независимо от того, что отслеживает следующий пакет, который вы хотите.

Ответ №1:

Вам нужно сделать три вещи:

  1. Добавление LIMIT и OFFSET в запрос.
  2. Получение общего количества строк.
  3. Кнопка добавления разбивки на страницы.

Чтобы добавить разбивку на страницы, вам нужно ограничить отображение данных, и лучше получать ограниченные данные из базы данных, поэтому я добавил LIMIT and OFFSET к вашему запросу:

 SELECT d.idPre,
    em.nombre as doctor,
    pac.nombre as paciente,
    d.diagnostico,
    DATE_FORMAT(d.fechaEmision, '%M %e %Y') as fechaEmision,
    DATE_FORMAT(d.fechaVencimiento, '%M %e %Y') as DiasRestantes
FROM empleado em, paciente pac, presupuestodental d 
WHERE 
    em.idEmpleado=d.idEmpleado AND 
    pac.idPaciente=d.idPaciente 
ORDER BY fechaEmision
LIMIT ? OFFSET?
 

Затем вам нужно получить общее количество строк, которые являются презентабельными, и разделить его на строки, отображаемые каждый раз, чтобы получить общее количество страниц. Итак, это запрос для этого (возможно, вам потребуется изменить его, чтобы получить правильное количество строк):

 SELECT COUNT(*)
FROM empleado em, paciente pac, presupuestodental d 
WHERE 
    em.idEmpleado=d.idEmpleado AND 
    pac.idPaciente=d.idPaciente
 

А теперь, чтобы добавить разбивку на страницы, давайте завершим вашу функцию. Я немного изменил ваши коды, чтобы очистить его:

 /*
    Counting all rows
*/
function rowCount($db) {
    $query = "
        SELECT COUNT(*)
        FROM empleado em, paciente pac, presupuestodental d 
        WHERE 
            em.idEmpleado=d.idEmpleado AND 
            pac.idPaciente=d.idPaciente";
        
    $stmt = $db->query($query);
    return $stmt->fetch();
}

/*
    Creating pagintaion links
*/
function pagination($currentPage, $totalPages) {
    $html = '
    <ul>';
    
    for ($page = 0; $page < $totalPages;$page  )
        if ($page == $currentPage)
            $html .= '
        <li>' . $page . '</li>';
        else
            $html .= '
        <li>
            <a href="{the table page link}/' . $page . '>' . $page . '</a>
        </li>';
        
    $html .= '
    </ul>';
    
    return $html;
}

/*
    The page which should be displayed will be taken as a parameter
*/
function tabla_presupuestos($page = 0) {
    // This is the number if row you want to display
    $rowsPerPage = 10;
    $totalPages = rowCount($conexion_bd)/$rowsPerPage;

    $conexion_bd = conectar();

    $consulta = "
        SELECT d.idPre,
            em.nombre as doctor,
            pac.nombre as paciente,
            d.diagnostico,
            DATE_FORMAT(d.fechaEmision, '%M %e %Y') as fechaEmision,
            DATE_FORMAT(d.fechaVencimiento, '%M %e %Y') as DiasRestantes
        FROM empleado em, paciente pac, presupuestodental d 
        WHERE 
            em.idEmpleado=d.idEmpleado AND 
            pac.idPaciente=d.idPaciente
        ORDER BY fechaEmision
        LIMIT ? OFFSET ?";

    $stmt = $conexion_bd->prepare($consulta);
    
    // binding LIMIT and OFFSET to the query
    $stmt->bind_param($rowsPerPage, $rowsPerPage*$page);
    
    // executing statement and getting the result
    $stmt->execute();
    $result = $stmt->get_result();
    
    $resultado = '
    <div>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th scope="col">Doctor</th>
                    <th  scope="col">Paciente</th>
                    <th scope="col">Diagnostico</th>
                    <th scope="col">Fecha de Emisión</th>
                    <th scope="col">Vencimiento</th>
                <tr>
            </thead>';

     while ($row = $result->fetch_array(MYSQLI_ASSOC)) {

        $resultado .= '
            <tbody>
                <tr>
                    <td>' . $row["doctor"] . '</td>
                    <td>' . $row["paciente"] . '</td>
                    <td><a href="editardiagnostico.php?idPre=' . $row["idPre"] . '">' . $row["diagnostico"] . '</td>
                    <td>' . $row["fechaEmision"] . '</td>
                    <td>' . $row["DiasRestantes"] . '</td>
                    <td>
                        <a href="borrar_presupuesto.php?idPre=' . $row["idPre"] . '">
                            <button class="btn btn-danger">Ocultar</button>
                        </a>
                    </td>
                </tr>';
     }
        $resultado .= '
            </tbody>
        </table>
        ' . pagination($page, $totalPages) . '
    </div>';
    
    desconectar($conexion_bd);
    return $resultado;
}