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

php和mysql foreach只显示第一条记录四次,php,mysql,loops,foreach,while-loop,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($resu

我构建了一个从数据库中获取记录的函数,并尝试使用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>";
  }
$posts=get_posts($connection);
foreach($key=>$value){
echo$posts['body']。“
”; }
当使用该位代码时,它只从数据库返回第一条记录4次。我使用了var_dump来确保它确实是一个数组,而且它确实是。我一定是在这里错误地使用了foreach循环

PS:mysqli\u fetch\u对象是否可以转换为mysqli\u fetch\u assoc?我认为它可能更容易使用,但我不知道如何在函数中使用它。欢迎使用任何代码位


谢谢大家!

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

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

您需要将
$posts
更改为多维数组,这样做很容易:

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

然后剩下的代码将按计划工作。

您应该
将新元素放入数组的新索引中,如下所示:

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>';
   }
}
foreach($posts as$postInfo){
foreach($postInfo as$key=>$val){
回显“”.$key.:“.$val.

”; } }
这将反映:

body
foo

(时间戳)

...

现在它抛出了以下错误:注意:未定义的索引:第26行的/Applications/MAMP/htdocs/blog/index.php中的body-26行是echo$posts['body'];根据您的评论,您在第11行的/Applications/MAMP/htdocs/blog/includes/functions.php中将帖子拼错为posttsParse error:syntax error,意外的“=>”(T_双箭头)。我必须查看您所有固定的相关代码才能理解问题。这似乎有效。你能解释一下为什么要用两个foreach循环来得到结果吗?首先获取$posts,然后将其设置为$postinfo,然后使用该$postinfo。您不能将$posts用作$key=>$val吗?因为这里的
$posts
是一个多维数组,该数组中的每个索引都包含另一个数组,该数组包含一对键和值。根据
rasmus lerdorf
的规定,永远不要使用
数组推送
函数,因为它存在性能问题,而使用实际的语法将新元素推入数组:
$arr[]=“lastOne”
;我明白了,非常感谢你花时间回答。