Проблема установки PHP-переменной в операторе if - PullRequest
1 голос
/ 22 августа 2011

У меня есть вызов Ajax для создания галереи изображений.Существует поле со списком для установки количества изображений на странице и нумерация страниц для навигации по страницам.Работает нормально, за исключением того, что если человек находится на последней странице и увеличивает количество изображений на странице, он перезагружается до номера текущей страницы.Это проблема, потому что теперь стало меньше страниц, и поэтому страница пуста.Другими словами, в итоге вы получите, например, page 7 of 5.

Я считаю, что проблема в PHP, поскольку именно здесь вычисляется количество страниц.Я придумал заявление if, чтобы справиться с этим:

if ($page > $no_of_paginations) {
 $page = $no_of_paginations;
}

Однако я не знаю, где это разместить.Причина в том, что $page необходимо определить до запроса mysql_, но $no_of_paginations определяется после запроса.

Любые мысли о том, как я могу сделатьэтот функционал?

Я выложу соответствующий код ниже:

<?php
$page = 0;
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
}
$cur_page = $page;
$page -= 1;
if((int) $_GET['imgs'] > 0){ 
    $per_page = (int) $_GET['imgs']; 
} else { 
    $per_page = 16; 
}
$start = $per_page * $page;

include"db.php";

$query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` ".
"ORDER BY `imgDate` DESC LIMIT $start, $per_page";

$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());

echo "<ul class='new_arrivals_gallery'>";
while($row = mysql_fetch_assoc($result_pag_data)) { 
    echo "<li><a target='_blank' href='new_arrivals_img/".$row['imgURL']."' class='gallery' title='".$row['imgTitle']."'><img src='new_arrivals_img/thumbnails/".$row['imgURL']."'></a></li>";
  }
echo "</ul>";   


/* --------------------------------------------- */
$query_pag_num = "SELECT COUNT(*) AS count FROM images";
$result_pag_num = mysql_query($query_pag_num);
$row = mysql_fetch_array($result_pag_num);
$count = $row['count'];
$no_of_paginations = ceil($count / $per_page);
?>

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

Поскольку вы в настоящее время делаете это, не будет проблем с перемещением последнего раздела выше основного запроса.

Лучший способ найти общее количество записей в MySQL - это использовать SQL_CALC_FOUND_ROWS ключевое слово в вашем основном запросе (так что здесь оно SELECT SQL_CALC_FOUND_ROWS imgURL, imgTitle FROM images WHERE etc), тогда вы можете запросить SELECT FOUND_ROWS() и просто получить количество записей, найденных в последнем запросе.Помимо того, что это быстрее и эффективнее, это позволяет избежать условия гонки, когда записи добавляются между двумя запросами.

Однако в этом случае вам, вероятно, следует просто выполнить два текущих запроса в обратном порядке, как ваш единственныйДругой вариант - проверить в конце и повторить при необходимости.

1 голос
/ 22 августа 2011

Вы должны использовать запрос:

$query_pag_data = "SELECT SQL_CALC_FOUND_ROWS `imgURL`,`imgTitle` FROM `images` ".
"ORDER BY `imgDate` DESC LIMIT $start, $per_page";

И вместо

$query_pag_num = "SELECT COUNT(*) AS count FROM images";

использовать

$query_pag_num = "SELECT FOUND_ROWS()";
0 голосов
/ 22 августа 2011

Иногда вам просто нужно прикусить пулю и сделать запрос дважды. Примите предоставленное пользователем значение «Я хочу страницу X» и попробуйте получить эту конкретную страницу. Если это заканчивается после окончания доступных данных, вы можете либо сказать «эй, подождите ... это не так» и прервать выполнение, либо повторить цикл и вернуться к последней доступной странице по умолчанию.

while(true) {
     $sql = "select sql_calc_found_rows .... limit $X,$Y";
     $result = mysql_query($sql) or die(mysql_error());

     $sql = "select found_rows();"; // retrieve the sql_calc_found_rows_value
     $res2 = mysql_query($sql);

     $row = mysql_fetch_array($res2);
     $total_rows = $row[0];

     if ($total_rows < $requested_row) {
        ... redo the loop and request last possible page ...
     } else {
        break;
     }
}

подробности о функции found_rows () здесь .

0 голосов
/ 22 августа 2011

Если вы выполните запрос «SELECT COUNT (*) ...» ранее в скрипте (по крайней мере, перед другим запросом), у вас будет $ no_of_pagination ранее, и вы можете использовать его для привязки $ страницы к правильному диапазону .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...