Я пытаюсь создать несколько страниц из моего запроса. Если у меня есть 100 результатов, и я хочу 10 результатов на страницу, я бы хотел, чтобы было создано десять страниц, причем каждая страница показывала другой запрос. Вот как мой запрос настроен:
$sql ="SELECT * FROM Post WHERE (active ='1') ORDER BY PostID DESC "; $result = mysql_query($sql,$db); $numrows = mysql_num_rows($result); while(($post = mysql_fetch_assoc($result))) { $posts[] = $post; } <?php if (!$numrows){ echo $errormessage;} else{ foreach($posts as $post): ?> echo stripslashes($post['text']); <?php endforeach; }?>
Это вытаскивает каждую «запись» из базы данных и выводит все из них.
Я хотел бы сделать что-то вроде этого:
$results = mysql_num_rows($result); $numpages = 10/$results; //gives the number of pages while($numpages<$results) { //run code from above\\ }
в$results = mysql_num_rows($result); $numpages = 10/$results; //gives the number of pages while($numpages<$results) { //run code from above\\ }
Каков наилучший способ сделать это с помощью метода, который я использую? Я ценю ваше мнение, потому что я нахожусь на одном из тех этапов, когда я потерял свою логику. Спасибо!
Большинство примеров разбивки на страницы не соответствуют реальным требованиям. Например, пользовательская строка запроса.
Итак, вот полный, но краткий пример:
<? per_page=10; // Let's put FROM and WHERE parts of the query into variable $from_where="FROM Post WHERE active ='1'"; // and get total number of records $sql = "SELECT count(*) ".$from_where; $res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql); $row = mysql_fetch_row($res); $total_rows = $row[0]; //let's get page number from the query string if (isset($_GET['page'])) $CUR_PAGE = intval($_GET['page']); else $CUR_PAGE=1; //and calculate $start variable for the LIMIT clause $start = abs(($CUR_PAGE-1)*$per_page); //Let's query database for the actual data $sql = "SELECT * $from_where ORDER BY PostID DESC LIMIT $start,$per_page"; $res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql); // and fill an array while ($row=mysql_fetch_array($res)) $DATA[++$start]=$row; //now let's form new query string without page variable $uri = strtok($_SERVER['REQUEST_URI'],"?")."?"; $tmpget = $_GET; unset($tmpget['page']); if ($tmpget) { $uri .= http_build_query($tmpget)."&"; } //now we're getting total pages number and fill an array of links $num_pages=ceil($total_rows/$per_page); for($i=1;$i<=$num_pages;$i++) $PAGES[$i]=$uri.'page='.$i; //and, finally, starting output in the template. ?> Found rows: <b><?=$total_rows?></b><br><br> <? foreach ($DATA as $i => $row): ?> <?=$i?>. <a href="?id=<?=$row['id']?>"><?=$row['title']?></a><br> <? endforeach ?> <br> Pages: <? foreach ($PAGES as $i => $link): ?> <? if ($i == $CUR_PAGE): ?> <b><?=$i?></b> <? else: ?> <a href="<?=$link?>"><?=$i?></a> <? endif ?> <? endforeach ?>
с<? per_page=10; // Let's put FROM and WHERE parts of the query into variable $from_where="FROM Post WHERE active ='1'"; // and get total number of records $sql = "SELECT count(*) ".$from_where; $res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql); $row = mysql_fetch_row($res); $total_rows = $row[0]; //let's get page number from the query string if (isset($_GET['page'])) $CUR_PAGE = intval($_GET['page']); else $CUR_PAGE=1; //and calculate $start variable for the LIMIT clause $start = abs(($CUR_PAGE-1)*$per_page); //Let's query database for the actual data $sql = "SELECT * $from_where ORDER BY PostID DESC LIMIT $start,$per_page"; $res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql); // and fill an array while ($row=mysql_fetch_array($res)) $DATA[++$start]=$row; //now let's form new query string without page variable $uri = strtok($_SERVER['REQUEST_URI'],"?")."?"; $tmpget = $_GET; unset($tmpget['page']); if ($tmpget) { $uri .= http_build_query($tmpget)."&"; } //now we're getting total pages number and fill an array of links $num_pages=ceil($total_rows/$per_page); for($i=1;$i<=$num_pages;$i++) $PAGES[$i]=$uri.'page='.$i; //and, finally, starting output in the template. ?> Found rows: <b><?=$total_rows?></b><br><br> <? foreach ($DATA as $i => $row): ?> <?=$i?>. <a href="?id=<?=$row['id']?>"><?=$row['title']?></a><br> <? endforeach ?> <br> Pages: <? foreach ($PAGES as $i => $link): ?> <? if ($i == $CUR_PAGE): ?> <b><?=$i?></b> <? else: ?> <a href="<?=$link?>"><?=$i?></a> <? endif ?> <? endforeach ?>
Было бы отвратительно извлекать все данные из базы данных и управлять им с PHP. Это убьет RAM и сеть.
Используйте предложение LIMIT
для подкачки.
Во-первых, вам нужно увидеть общее количество записей. использование
$query = 'SELECT count(1) as cnt FROM Post WHERE active =1';
тогда,
$result = mysql_query($query, $db); $row = mysql_fetch_assoc($result); $count = $row['cnt']; $pages = ceil($count/10.0); //used to display page links. It's the total number of pages. $page = 3; //get it from somewhere else, it's the page number.
Затем извлеките данные
$query = 'SELECT count(1) as cnt FROM Post WHERE active =1 LIMIT '.$page*10.', 10'; $result = mysql_query($query, $db); while($row = mysql_fetch_assoc($result)) { //display your row }
Затем выведите данные.
Я использую этот код для этого:
$data = mysql_query("SELECT * FROM `table`"); $total_data = mysql_num_rows($data); $step = 30; $from = $_GET['p']; $data = mysql_query("SELECT * FROM `table` LIMIT '.$from.','.$step.'"
Этот код получает полные строки
и что для создания ссылок:
$p=1; for ($j = 0 ; $j <= $total_data+$step; $j+=$step) { echo ' <a href="page.php?p='.$j.'">'.$p.'</a> '; $p++; } ?>
Вы также можете прочитать: разбиение на страницы