#php
#php
Вопрос:
Итак, я пытаюсь разбить свою страницу на страницы после 10 сообщений на форуме. Кнопки разбивки на страницы отображаются и функционируют, а переменный URL работает корректно, однако на первой странице отображаются все записи в базе данных, а не только 10, а на второй странице отображается то же самое (все записи).
Я уверен, что это что-то простое, чего я просто не вижу…
Код для моей главной страницы форума такой:
$conn = mysql_connect("$host", "$username", "$password");
if(!$conn) die("Failed to connect to database!");
$status = mysql_select_db("$db_name", $conn);
if(!$status) die("Failed to select database!");
$sql="SELECT * FROM $tbl_name ORDER BY id DESC";
// OREDER BY id DESC is order result by descending
$result=mysql_query($sql);
include ('pagination.php');
?>
<?php
$pager = new PS_Pagination($conn, $sql, 10, 5, "param1=valu1amp;param2=value2");
/*
* Enable debugging if you want o view query errors
*/
$pager->setDebug(true);
/*
* The paginate() function returns a mysql result set
* or false if no rows are returned by the query
*/
$rs = $pager->paginate();
if(!$rs) die(mysql_error());
while($rows=mysql_fetch_array($result)){ // Start looping table row
?>
<tr>
<td bgcolor="#FFFFFF"><? echo $rows['id']; ?></td>
<td bgcolor="#FFFFFF"><font size="3"><a href="view_topic.php?id=<? echo $rows['id']; ?>"><? echo $rows['topic']; ?></a></font><BR></td>
<td align="center" bgcolor="#FFFFFF"><? echo $rows['view']; ?></td>
<td align="center" bgcolor="#FFFFFF"><? echo $rows['reply']; ?></td>
<td align="center" bgcolor="#FFFFFF"><? echo $rows['datetime']; ?></td>
</tr>
<?php
// Exit looping and close connection
}
mysql_close();
?>
<tr>
<td colspan="5" align="right" bgcolor="#E6E6E6"><a href="create_topic.php"><strong>Create New Topic</strong> </a></td>
</tr>
</table>
<br />
<center><?php echo $pager->renderFullNav();
?></center>
Тогда код для моего файла разбивки на страницы выглядит следующим образом:
<?php
class PS_Pagination {
var $php_self;
var $rows_per_page = 10; //Number of records to display per page
var $total_rows = 0; //Total number of rows returned by the query
var $links_per_page = 5; //Number of links to display per page
var $append = ""; //Paremeters to append to pagination links
var $sql = "";
var $debug = false;
var $conn = false;
var $page = 1;
var $max_pages = 0;
var $offset = 0;
/**
* Constructor
*
* @param resource $connection Mysql connection link
* @param string $sql SQL query to paginate. Example : SELECT * FROM users
* @param integer $rows_per_page Number of records to display per page. Defaults to 10
* @param integer $links_per_page Number of links to display per page. Defaults to 5
* @param string $append Parameters to be appended to pagination links
*/
function PS_Pagination($connection, $sql, $rows_per_page = 10, $links_per_page = 5, $append = "") {
$this->conn = $connection;
$this->sql = $sql;
$this->rows_per_page = (int)$rows_per_page;
if (intval($links_per_page ) > 0) {
$this->links_per_page = (int)$links_per_page;
} else {
$this->links_per_page = 5;
}
$this->append = $append;
$this->php_self = htmlspecialchars($_SERVER['PHP_SELF'] );
if (isset($_GET['page'] )) {
$this->page = intval($_GET['page'] );
}
}
/**
* Executes the SQL query and initializes internal variables
*
* @access public
* @return resource
*/
function paginate() {
//Check for valid mysql connection
if (! $this->conn || ! is_resource($this->conn )) {
if ($this->debug)
echo "MySQL connection missing<br />";
return false;
}
//Find total number of rows
$all_rs = @mysql_query($this->sql );
if (! $all_rs) {
if ($this->debug)
echo "SQL query failed. Check your query.<br /><br />Error Returned: " . mysql_error();
return false;
}
$this->total_rows = mysql_num_rows($all_rs );
@mysql_close($all_rs );
//Return FALSE if no rows found
if ($this->total_rows == 0) {
if ($this->debug)
echo "Query returned zero rows.";
return FALSE;
}
//Max number of pages
$this->max_pages = ceil($this->total_rows / $this->rows_per_page );
if ($this->links_per_page > $this->max_pages) {
$this->links_per_page = $this->max_pages;
}
//Check the page value just in case someone is trying to input an aribitrary value
if ($this->page > $this->max_pages || $this->page <= 0) {
$this->page = 1;
}
//Calculate Offset
$this->offset = $this->rows_per_page * ($this->page - 1);
//Fetch the required result set
$rs = @mysql_query($this->sql . " LIMIT {$this->offset}, {$this->rows_per_page}" );
if (! $rs) {
if ($this->debug)
echo "Pagination query failed. Check your query.<br /><br />Error Returned: " . mysql_error();
return false;
}
return $rs;
}
/**
* Display the link to the first page
*
* @access public
* @param string $tag Text string to be displayed as the link. Defaults to 'First'
* @return string
*/
function renderFirst($tag = 'First') {
if ($this->total_rows == 0)
return FALSE;
if ($this->page == 1) {
return "$tag ";
} else {
return '<a href="' . $this->php_self . '?page=1amp;' . $this->append . '">' . $tag . '</a> ';
}
}
/**
* Display the link to the last page
*
* @access public
* @param string $tag Text string to be displayed as the link. Defaults to 'Last'
* @return string
*/
function renderLast($tag = 'Last') {
if ($this->total_rows == 0)
return FALSE;
if ($this->page == $this->max_pages) {
return $tag;
} else {
return ' <a href="' . $this->php_self . '?page=' . $this->max_pages . 'amp;' . $this->append . '">' . $tag . '</a>';
}
}
/**
* Display the next link
*
* @access public
* @param string $tag Text string to be displayed as the link. Defaults to '>>'
* @return string
*/
function renderNext($tag = 'amp;>amp;>') {
if ($this->total_rows == 0)
return FALSE;
if ($this->page < $this->max_pages) {
return '<a href="' . $this->php_self . '?page=' . ($this->page 1) . 'amp;' . $this->append . '">' . $tag . '</a>';
} else {
return $tag;
}
}
/**
* Display the previous link
*
* @access public
* @param string $tag Text string to be displayed as the link. Defaults to '<<'
* @return string
*/
function renderPrev($tag = 'amp;<amp;<') {
if ($this->total_rows == 0)
return FALSE;
if ($this->page > 1) {
return ' <a href="' . $this->php_self . '?page=' . ($this->page - 1) . 'amp;' . $this->append . '">' . $tag . '</a>';
} else {
return " $tag";
}
}
/**
* Display the page links
*
* @access public
* @return string
*/
function renderNav($prefix = '<span class="page_link">', $suffix = '</span>') {
if ($this->total_rows == 0)
return FALSE;
$batch = ceil($this->page / $this->links_per_page );
$end = $batch * $this->links_per_page;
if ($end == $this->page) {
//$end = $end $this->links_per_page - 1;
//$end = $end ceil($this->links_per_page/2);
}
if ($end > $this->max_pages) {
$end = $this->max_pages;
}
$start = $end - $this->links_per_page 1;
$links = '';
for($i = $start; $i <= $end; $i ) {
if ($i == $this->page) {
$links .= $prefix . " $i " . $suffix;
} else {
$links .= ' ' . $prefix . '<a href="' . $this->php_self . '?page=' . $i . 'amp;' . $this->append . '">' . $i . '</a>' . $suffix . ' ';
}
}
return $links;
}
/**
* Display full pagination navigation
*
* @access public
* @return string
*/
function renderFullNav() {
return $this->renderFirst() . 'amp;nbsp;' . $this->renderPrev() . 'amp;nbsp;' . $this->renderNav() . 'amp;nbsp;' . $this->renderNext() . 'amp;nbsp;' . $this->renderLast();
}
/**
* Set debug mode
*
* @access public
* @param bool $debug Set to TRUE to enable debug messages
* @return void
*/
function setDebug($debug) {
$this->debug = $debug;
}
}
?>
Ответ №1:
Вы выполняете два запроса. Тот, который используется для отображения всего, и тот, который находится на пейджере, который вы просто игнорируете:
$result=mysql_query($sql); <-- the query you're actually using in the output portion
$rs = $pager->paginate(); <-- the second query you're utterly ignoring.
if(!$rs) die(mysql_error());
while($rows=mysql_fetch_array($result)) <--fetching/displaying the first query's results
Вы должны выполнять выборку на $rs
, а не $result
.
Комментарии:
1. Ты абсолютная легенда! Это сделало это! Спасибо!
Ответ №2:
SELECT * FROM $tbl_name ORDER BY id DESC";
должно быть: SELECT * FROM $tbl_name ORDER BY id DESC LIMIT 10";
Вам также необходимо указать ваше смещение.
SELECT * FROM $tbl_name ORDER BY id DESC LIMIT 10,10"; // for page 2
сначала получите общее количество записей:
SELECT COUNT(*) as total FROM $tbl_name;
это даст вам общее значение, и вы можете использовать его для своего класса разбивки на страницы, чтобы сгенерировать правильное смещение,
смысл здесь в том, чтобы использовать вашу разбивку на страницы для вычисления смещения каждой страницы, чтобы вы могли получить правильные данные для своей страницы
$offset = $pagination->offset(); // what ever the correct method for calculating the offset
$limit = 10;
$sql="SELECT * FROM $tbl_name ORDER BY id DESC LIMIT $offset,$limit";