【问题标题】:php and mysql foreach only displays the first record four timesphp 和 mysql foreach 只显示第一条记录四次
【发布时间】:2013-12-30 23:56:14
【问题描述】:

我构建了一个函数来从数据库中获取记录,并尝试使用 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 吗?我认为使用它可能更容易,但我不知道如何在函数中使用它。任何代码位都值得赞赏。

谢谢!

【问题讨论】:

    标签: php mysql loops foreach while-loop


    【解决方案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>';
       }
    }
    

    这会回显:

    body : foo
    stamp : (timestamp)
    ...
    ...

    【讨论】:

    • 这似乎行得通。您能否解释一下为什么要使用两个 foreach 循环来获得结果?您首先获取 $posts,然后将其设置为 $postinfo,然后使用该 $postinfo。难道你不能只使用 $posts 作为 $key => $val 吗?
    • 因为这里$posts 是一个多维数组,该数组中的每个索引都包含另一个数组,该数组包含一对键和值。
    • 根据rasmus lerdorf 永远不要使用array_push 函数,因为它存在性能问题,而是使用实际语法将新元素推入数组:$arr[] = 'lastOne';
    • 我明白了,非常感谢您花时间回答。
    【解决方案2】:

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

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

    【讨论】:

    • 解析错误:语法错误,第 11 行 /Applications/MAMP/htdocs/blog/includes/functions.php 中的意外 '=>' (T_DOUBLE_ARROW)
    • 它对我有用。我必须查看您所有已修复的相关代码才能理解问题。
    【解决方案3】:

    您需要将$posts 更改为一个多维数组,这样做可以轻松完成:

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

    那么您的其余代码将按您的计划工作。

    【讨论】:

    • 现在它抛出以下错误:注意:未定义的索引:第 26 行 /Applications/MAMP/htdocs/blog/index.php 中的正文 - 第 26 行是 echo $postts['body'] ;行
    • 根据您的评论,您的帖子拼写错误为 postts
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多