使用类循环访问PDO statment fetch(PDO :: FETCH_OBJ)

时间:2015-10-21 02:40:27

标签: php oop pdo

我在一个单独的文件中有一个名为posts的类:

<?php

class POSTS {
    //Start of class properties:
    private $db_connection;

    public $post_id;
    public $section_id;
    public $user_id;
    public $post_title;
    public $post_details;
    public $post_date;
    public $post_category;
    public $post_display;

    public $num_of_rows;

    public function getRelatedPosts($section_name, $category, $display) {
        $stm = $this->db_connection->prepare("SELECT * FROM posts WHERE section_name!=:Section_name AND category=:Category AND display=:Display ORDER BY id DESC");
        $stm->bindParam(":Section_name", $section_name);
        $stm->bindParam(":Category", $category);
        $stm->bindParam(":Display", $display);
        $stm->execute();

        $this->num_of_rows = $stm->rowCount();
        if ($this->num_of_rows >= 1) {
            $post_data = $stm->fetch(PDO::FETCH_OBJ);

            $this->post_id = $post_data->id;
            $this->section_id = $post_data->section_id;
            $this->user_id = $post_data->user_id;
            $this->post_title = $post_data->title;
            $this->post_details = $post_data->details;
            $this->post_date = $post_data->date;
            $this->post_category = $post_data->category;
            $this->post_display = $post_data->display;

        }
    }

}

?>

然后我想循环索引文件中的结果:

                    $section_name = 'PHP';

                    $display = 'yes';

                    $POSTS->getRelatedPosts($section_name, $category $display);
                    $num_of_rows = $POSTS->num_of_rows;

                     if ($num_of_rows >= 1) {
                        for ($m=1; $m<=$num_of_rows; $m++) {

                            $post_id = $POSTS->post_id;
                            $section_id = $POSTS->section_id;
                            $user_id = $POSTS->user_id;

                            $post_title = $POSTS->post_title;
                            $post_details = $POSTS->post_details;
                            $post_date = $POSTS->post_date;

                        ?>
                        <div id="related_post">
                            <h4><a href=""><?php echo $post_title;?></a></h4>
                            <p><?php echo $post_details;?></p>
                        </div>
                        <?php
                        }
                    } else {
                        echo 'Sorry no related posts now!';
                    }

不幸的是,结果只有一条记录重复,与$ num_of_rows变量相同。 我尝试了一些不同的方法,如: fetchAll()和其他样式,但结果总是错误或只重复一个记录。

请有人帮我处理我的代码。

3 个答案:

答案 0 :(得分:0)

如果你想循环,尝试循环你的方法:

public function getRelatedPosts($section_name, $category, $display)
{
    $stm = $this->db_connection->prepare("SELECT * FROM posts WHERE section_name!=:Section_name AND category=:Category AND display=:Display ORDER BY id DESC");
    $stm->bindParam(":Section_name", $section_name);
    $stm->bindParam(":Category", $category);
    $stm->bindParam(":Display", $display);
    $stm->execute();

    $this->num_of_rows = $stm->rowCount();
    if ($this->num_of_rows >= 1) {
        while($post_data = $stm->fetch(PDO::FETCH_OBJ)) {
            $this->post_id[] = $post_data->id;
            $this->section_id[] = $post_data->section_id;
            $this->user_id[] = $post_data->user_id;
            $this->post_title[] = $post_data->title;
            $this->post_details[] = $post_data->details;
            $this->post_date[] = $post_data->date;
            $this->post_category[] = $post_data->category;
            $this->post_display[] = $post_data->display;
       }
    }
}

您的循环可能类似于:

for ($m=1; $m<=$num_of_rows; $m++) {
    $post_id = $POSTS->post_id[$m];
    $section_id = $POSTS->section_id[$m];
    $user_id = $POSTS->user_id[$m];
    $post_title = $POSTS->post_title[$m];
    $post_details = $POSTS->post_details[$m];
    $post_date = $POSTS->post_date[$m];
?>
    <div id="related_post">
        <h4><a href=""><?php echo $post_title;?></a></h4>
        <p><?php echo $post_details;?></p>
    </div>
<?php
    }

答案 1 :(得分:0)

在我的课堂上,我应该使用以下代替当前的代码:

$results = $stm->fetchAll(PDO::FETCH_OBJ);

我不会获得当前类属性的任何优势。 在我的索引文件中,我将使用$results循环遍历foreach,如下所示:

foreach($results as $post){
  $post_title = $post->title;
  $post_details = $post->details;
}

依旧......

答案 2 :(得分:0)

我正在尝试使用PDO,我对PDO :: FETCH_OBJ也有同样的问题

我在xampp 5.6.30中使用PHP 5.6

不用说了 - DB名称是动物 - 它只有三列:animal_id,animal_type,animal_name

以下测试代码正常工作并输出所有记录(在我的测试数据库中只有11个)

$stmt = $dbh->prepare("SELECT * FROM animals");
$stmt->execute();

if($stmt->rowCount() > 0) {
    while($obj = $stmt->fetch(PDO::FETCH_OBJ)) {
        echo $obj->animal_type . " " . $obj->animal_name . "<br>";
    }
}

也许您可以在循环中插入计数器,或者更好的是,使查询正确地限制范围。

无论如何,上面的代码,按预期输出后面的内容

kookaburra bruce
emu bruce
goanna bruce
dingo bruce
kangaroo bruce
wallaby bruce
wombat bruce
koala bruce
kiwi cambiato
pippo zollo
pippz zoll2