我似乎无法理解为什么这个与PHP& amp;按下按钮后,MySQL不会将数据切换到下一页,即使在标题上它也会转到下一页,例如:site.com/index.php?page = 2
postClass {
//the __construct is on the class as well, just showing what isn't working under it.
private $perPage = 8;
private $startPage = 0;
public function latestPosts(){
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$sth = $this->db->prepare("SELECT * FROM posts ORDER BY id DESC LIMIT ?, ?");
$sth->execute(array($this->startPage, $this->perPage));
$data = $sth->fetchAll();
return $data;
}
public function getPerPage(){
return $this->perPage;
}
public function getStartPage(){
return $this->startPage;
}
}
在另一个php文件中,我使用以下内容来显示数据
$startPage = $postClass->getStartPage();
$perPage = $postClass->getPerPage();
if(!isset($_GET['page']))
{
$page = 1;
} else {
$page = $_GET['page'];
}
if($page <= 1)
{
$startPage = 0;
} else {
$startPage = $page * $perPage - $perPage;
}
foreach($latestPosts as $post)
{
$title = $post['title'];
echo ''.$title.'';
}
$prev = $page-1;
$next = $page+1;
echo "<a href='?page=$prev'>previous</a> <a href='?page=$next'>next</a>";
我试过print_r&amp; var_dump看看它打印的内容但似乎工作正常,只是数据似乎没有传递到if(页面)语句,从我能想到的,但我不是专家,否则它会工作。
这是print_r&amp; amp; var_dump显示。
var_dump($perPage) = int 8
print_r($perPage) = 8
var_dump($startPage) = int 0
print_r($startPage) = 0
我不明白为什么一旦我按下下一个按钮,数据(第一个结果为8)就不会切换到接下来的8个结果。
我也尝试了这个,我认为可以工作,但我无法将变量传递给其他函数..
public function latestPosts(){
$perPage = 8;
$startPage = 0;
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$sth = $this->db->prepare("SELECT * FROM articles ORDER BY article_uid DESC LIMIT ?, ?");
$sth->execute(array($startPage, $perPage));
$data = $sth->fetchAll();
return $data;
}
public function getPerPage(){
eturn $this->latestPosts($perPage);
}
public function getStartPage(){
return $this->latestPosts($startPage);
}
然后在index.php
页面上做了同样的事情,但错误在于我无法弄清楚如何传递这些变量。
答案 0 :(得分:0)
基本上当你转到第2页时,你想要选择“下一步”8条记录,但你的sql查询SELECT * FROM posts ORDER BY id DESC LIMIT ?
将始终选择相同的记录。
你需要的是OFFSET
:
SELECT * FROM posts ORDER BY id DESC LIMIT ? OFFSET ?
Offset告诉sql在选择之前应该跳过多少行。例如,对于第2页,它应该是8(offset = (current_page - 1)*per_page
)
在这里你可以找到基本的分页教程: http://www.phpfreaks.com/tutorial/basic-pagination
答案 1 :(得分:0)
您从未设置postClass::$startPage
和postClass::$perPage
。那些字段没有指针。
您认为这会改变字段:
$startPage = $postClass->getStartPage();
$perPage = $postClass->getPerPage();
if(!isset($_GET['page']))
{
$page = 1;
} else {
$page = $_GET['page'];
}
没有。 PHP对基元的每个值起作用(除非您明确使用&
)。只需实现setter并与它们一起工作:
class postClass {
public function setStartPage($page) {
$this->startPage = $page;
}
}
if (! isset($_GET['page'])) {
$postClass->setStartPage(1);
}
BTW详细介绍了PSR代码约定,特别是PSR-1。
答案 2 :(得分:0)
也许像
//PostManager class
public function getLatestPosts($startPage=0, $perPage = 8){
$this->startPage = $startPage;
$this->perPage = 9;
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$sth = $this->db->prepare("SELECT * FROM articles ORDER BY article_uid DESC LIMIT ?, ?");
$sth->execute(array($startPage, $perPage));
$data = $sth->fetchAll();
return $data;
}
//main page
$posts = getLatestPosts($start, $perPage); //however you define $start and $perPage
foreach($posts as $post) { /* ... */ }
$next = $page+1; $prev = ($page > 1) ? $page-1 : 0; //if we are not in the beginning