php和mysql foreach只显示第一条记录四次

时间:2013-12-12 14:08:55

标签: php mysql loops foreach while-loop

我构建了一个从数据库中获取记录的函数,我正在尝试使用foreach循环打印结果。

这是我的功能:

function get_posts($connection) {

    $posts = array();
    $sql = "SELECT * FROM posts ORDER BY stamp DESC";
    $result = mysqli_query($connection, $sql);

    while ($post = mysqli_fetch_object($result)) {
        $posts = array('body'        => $post->body,
                       'stamp'      => $post->stamp,
                       'post_id'    => $post->id,
                       'user_id'    => $post->user_id);

    }
        return $posts;
}

现在我正在尝试使用以下代码显示结果:

  $posts = get_posts($connection);
  foreach ($posts as $key => $value) {
    echo $posts['body'] . "<hr>";
  }

使用该位代码时,它只返回数据库中的第一条记录4次。我已经使用var_dump来确保它确实是一个数组,它确实是。我必须在这里错误地使用foreach循环。

PS: mysqli_fetch_object 可以变成 mysqli_fetch_assoc 吗?我认为使用它可能更容易,但我不知道如何在函数中使用它。任何代码位都表示赞赏。

谢谢!

3 个答案:

答案 0 :(得分:1)

在函数get_posts中,您覆盖$posts数组中的先前值。 试试这个:

array_push($posts, array('body' => $post->body,
                   'stamp'   => $post->stamp,
                   'post_id' => $post->id,
                   'user_id' => $post->user_id));

答案 1 :(得分:1)

你应该put将新元素添加到数组的新索引中,如下所示:

while ($post = mysqli_fetch_object($result)) {
    $posts[] = array('body'        => $post->body,
                   'stamp'      => $post->stamp,
                   'post_id'    => $post->id,
                   'user_id'    => $post->user_id);

}

请注意,在此之前,您应该将$ post初始化为数组,如:

$posts = array();

然后您可以通过这种方式检索信息:

foreach($posts as $postInfo) {
    foreach($postInfo as $key => $val) {
        echo '<p>' .$key . ':&nbsp;' . $val. '</p>';
   }
}

这将回应:

bodyfoo
stamp(timestamp)
...... ...

答案 2 :(得分:0)

您需要将$posts更改为多维数组,这可以通过以下方式轻松完成:

...
$posts[] = array('body'        => $post->body,
...

然后其余的代码将按照您的计划运行。