Как происходит разбивка на страницы?

Можете помочь мне правильно реализовать разбивку страниц с навигацией вперед и назад? <br/> <br/> <pre><code>$NotBd = mysql_result(
mysql_query(
"
SELECT 
COUNT(*) 
FROM posts 
WHERE 
city_id='".mysql_real_escape_string($CityBdID['id'])."' AND 
category_id='".mysql_real_escape_string($BdCat['id'])."'
"
),0);

//
if ($NotBd == 0) {

echo '&lt;div class="ad2 card card-block"&gt;
В данном разделе пусто:( Будь первым опубликуй поскорее свой &lt;a href="'. $site.'/AddPost"&gt;первый пост&lt;/a&gt; &amp;#9825&lt;/div&gt;';

}


// количество записей, выводимых на странице
$per_page = 1;



// получаем номер страницы
if (isset($_GET['page'])) $page = ($_GET['page']-1); else $page = 0;

// вычисляем первый оператор для LIMIT
$start = abs($page*$per_page);

// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$sql = mysql_query(
"
SELECT * 
FROM posts 
WHERE 
city_id='".mysql_real_escape_string($CityBdID['id'])."' AND 
category_id='".mysql_real_escape_string($BdCat['id'])."'
ORDER BY 
internal_id 
LIMIT $start,$per_page
" 
);


while($row = mysql_fetch_array($sql)) {
	
	require __DIR__ . '/../post.php';

}

// дальше выводим ссылки на страницы:
$sql = "
SELECT 
COUNT(*) 
FROM posts 
WHERE 
city_id='".mysql_real_escape_string($CityBdID['id'])."' AND 
category_id='".mysql_real_escape_string($BdCat['id'])."'
";

$res = mysql_query($sql);
$row = mysql_fetch_row($res);
$total_rows = $row[0];

$num_pages = ceil($total_rows/$per_page);

?&gt;

&lt;/div&gt;

&lt;div&gt;
&lt;ul class="pagination" role="navigation"&gt;

&lt;li class="page-item disabled" aria-disabled="true" aria-label="« Назад"&gt;
&lt;span class="page-link" aria-hidden="true"&gt;‹&lt;/span&gt;
  • 17 апреля 2025 г. 18:15
Ответы на вопрос 2
Ваша реализация разбивки на страницы в целом выглядит правильно, однако давайте рассмотрим некоторые аспекты и добавим недостающие части кода, чтобы сделать его полным. 

Кроме того, следует отметить, что использование `mysql_*` функций устарело и рекомендуется перейти на `mysqli` или `PDO` для работы с базами данных в новых проектах. 

### Полная реализация разбивки на страницы

1. Подсчёт общего количества записей.
2. Получение текущей страницы и вычисление `LIMIT`.
3. Запрос данных для указанной страницы.
4. Вывод данных.
5. Формирование навигации по страницам.

Вот улучшенный пример:

```php
<?php
// Подключение к базе данных
// $connection = mysqli_connect("localhost", "username", "password", "database");
// Убедитесь, что вы подключаетесь к базе данных

$NotBd = mysqli_query($connection, "
    SELECT COUNT(*) 
    FROM posts 
    WHERE 
    city_id='" . mysqli_real_escape_string($connection, $CityBdID['id']) . "' AND 
    category_id='" . mysqli_real_escape_string($connection, $BdCat['id']) . "'
");
$NotBd = mysqli_fetch_row($NotBd)[0];

if ($NotBd == 0) {
    echo '<div class="ad2 card card-block">
    В данном разделе пусто:( Будь первым опубликуй поскорее свой <a href="'. $site.'/AddPost">первый пост</a> &amp;#9825</div>';
    exit; // Выйти, если нет записей
}

// количество записей, выводимых на странице
$per_page = 1;

// получаем номер страницы
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page = max(1, $page); // Убедимся, что номер страницы не меньше 1

// вычисляем первый оператор для LIMIT
$start = ($page - 1) * $per_page;

// Получаем записи для текущей страницы
$sql = mysqli_query($connection, "
    SELECT * 
    FROM posts 
    WHERE 
    city_id='" . mysqli_real_escape_string($connection, $CityBdID['id']) . "' AND 
    category_id='" . mysqli_real_escape_string($connection, $BdCat['id']) . "'
    ORDER BY internal_id 
    LIMIT $start, $per_page
");

while ($row = mysqli_fetch_array($sql)) {
    require __DIR__ . '/../post.php';
}

// Получаем общее количество записей для навигации
$res = mysqli_query($connection, "
    SELECT COUNT(*) 
    FROM posts 
    WHERE 
    city_id='" . mysqli_real_escape_string($connection, $CityBdID['id']) . "' AND 
    category_id='" . mysqli_real_escape_string($connection, $BdCat['id']) . "'
");
$total_rows = mysqli_fetch_row($res)[0];

// Количество страниц
$num_pages = ceil($total_rows / $per_page);
?>

<div class="pagination">
    <?php if ($page > 1): ?>
        <a href="?page=<?php echo $page - 1; ?>" class="page-item">‹ Назад</a>
    <?php else: ?>
        <span class="page-item disabled">‹ Назад</span>
    <?php endif; ?>

    <?php for ($i = 1; $i <= $num_pages; $i++): ?>
        <?php if ($i == $page): ?>
            <span class="page-item active"><?php echo $i; ?></span>
        <?php else: ?>
            <a href="?page=<?php echo $i; ?>" class="page-item"><?php echo $i; ?></a>
        <?php endif; ?>
    <?php endfor; ?>

    <?php if ($page < $num_pages): ?>
        <a href="?page=<?php echo $page + 1; ?>" class="page-item">Вперед ›</a>
    <?php else: ?>
        <span class="page-item disabled">Вперед ›</span>
    <?php endif; ?>
</div>
```

### Объяснения:
- Мы используем `mysqli_*` функции для взаимодействия с базой данных.
- Мы обрабатываем `$_GET['page']`, чтобы избежать ошибок и обеспечить, что номер страницы всегда будет положительным.
- Мы выводим навигацию, обеспечивая возможность перехода на следующую и предыдущую страницы, а также связь по номерам страниц.
- Убедитесь, что вы добавили соответствующую стилизацию и класс `page-item` к вашим ссылкам для визуального отделения.

Таким образом, этот код предоставляет
Чтобы ограничить количество выводимых страниц требуется знание арифметики в пределах начальной школы. <br/> Чтобы вместо 1 и $num_pages использовать заранее рассчитанные значения, укладывающиеся в определённый интервал. Например 10 страниц. <br/> То есть надо всего лишь определить начальную и конечную цифры, которые подставлять в for вместо 1 и $num_pages. <br/> Например, если мы хотим выводить только 10 страниц, а текущую выводить посередине то для получения первой цифры надо отнять от текущей 4. Затем к ней надо прибавить 9 - так мы получим второе число. <br/> При этом, разумеется, надо проверить, чтобы первое не было меньше 1, а последнее - больше $num_pages. <br/> А дальше просто подставить их в for. Вот и всё.
Похожие вопросы