一旦按下“下一步”按钮,如何获取MySQL数据更新?

时间:2014-01-12 12:49:58

标签: php mysql pagination

我似乎无法理解为什么这个与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页面上做了同样的事情,但错误在于我无法弄清楚如何传递这些变量。

3 个答案:

答案 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::$startPagepostClass::$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