【问题标题】:Running while loop to display all rows, but it only displays one row运行while循环以显示所有行,但它只显示一行
【发布时间】:2016-04-09 19:26:38
【问题描述】:

我正在尝试执行一个 while 循环来显示有关已标记帖子的数据。我目前以 Conor 身份登录,他标记了 2 个帖子(flagged_posts 字段中的 2 行)。但是当我执行下面的代码时,只有一个 div 是 echo,而两个应该是 echo,因为他标记了两个帖子。

这是我的方法:

<?php
// getting id of logged in user, need this to see all the flagged posts from logged in user.
$get_uid = mysqli_query ($connect, "SELECT id FROM users WHERE username = '$user' ");
        $get_d = mysqli_fetch_assoc($get_uid);
            $user_ident = $get_d ['id'];

// using the above id and getting all the flagged posts which have been flagged by the id obtained
$flagged_by2 = mysqli_query ($connect, "SELECT * FROM flagged_posts WHERE flagged_by_id = '$user_ident'");
        $num_of_flagged_posts = mysqli_num_rows ($flagged_by2);
        while ($getting_d = mysqli_fetch_assoc ($flagged_by2)){
            $flagged_thought_id = $getting_d['thought_id'];
        }

$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id='$flagged_thought_id' ORDER BY id DESC LIMIT {$start}, {$limit}");
while ($row = mysqli_fetch_array($query)) {
    $thought_id      = $row['id'];
    $message_content = $row['message'];
    $date_of_msg     = $row['post_details'];
    $thoughts_by     = $row['added_by'];
    $attachent       = $row['attachment'];
    $shared          = $row['shared'];

    echo 
        "   <div class='message_wrapper'>
                <p> Details would be displayed here </p>
            </div>";
} //while closed

编辑

分页(使用 Marcin Nabiałek 方法):

        $flagged_by2 = mysqli_query ($connect, "SELECT * FROM flagged_posts WHERE flagged_by_id = '$user_ident'");
        $flagged_ids = [];  
        $num_of_flagged_posts = mysqli_num_rows ($flagged_by2);
        while ($getting_d = mysqli_fetch_assoc ($flagged_by2)){
            $flagged_ids[] = $getting_d['thought_id'];
        }
        if (!$flagged_ids) {
            $flagged_ids[] = 0;
        }


            // Pagination - Load more content when bottom of page hit.  
            $limit = 10;

            $page = (int) (!isset($_GET['p'])) ? 1 : $_GET['p'];
            # sql query
            $query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id IN " . implode(', ', $flagged_ids)." ORDER BY id DESC");
            # find out query start point
            $start = ($page * $limit) - $limit;
            # query for page navigation
            if(mysqli_num_rows($query) > ($page * $limit) ){
              $next = ++$page;
            }
            //$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id='$flagged_thought_id' ORDER BY id DESC LIMIT {$start}, {$limit}");
$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id IN " . implode(', ', $flagged_ids)." ORDER BY id DESC LIMIT {$start}, {$limit}");
            if (mysqli_num_rows($query) < 1) {
              header('HTTP/1.0 404 Not Found');
              echo "<div class='nothing_to_say'>
                        $ufirstname has no flagged posts.
                    </div>";
              exit();
            }

通过上述,我得到了两个相同的错误:

mysqli_num_rows() 期望参数 1 为 mysqli_result - 在线:

if(mysqli_num_rows($query) > ($page * $limit) ){ 

if (mysqli_num_rows($query) < 1) {

如果我将这两行注释掉,则会收到另一个错误: mysqli_fetch_array() 期望参数 1 为 mysqli_result,在线:

while ($row = mysqli_fetch_array($query)) {

【问题讨论】:

  • 我认为您的查询会更容易,个人:"SELECT * from users where username = '$user' left join flagged_posts on flagged_by_id = users.id left join user_thoughts on user_thoughts.id = flagged_posts.thought_id"

标签: php mysql


【解决方案1】:

这里的问题是:

$flagged_by2 = mysqli_query ($connect, "SELECT * FROM flagged_posts WHERE flagged_by_id = '$user_ident'");
        $num_of_flagged_posts = mysqli_num_rows ($flagged_by2);
        while ($getting_d = mysqli_fetch_assoc ($flagged_by2)){
            $flagged_thought_id = $getting_d['thought_id'];
        }

$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id='$flagged_thought_id' ORDER BY id DESC LIMIT {$start}, {$limit}");

您为同一个变量设置了循环值,并且您应该在这里有数组。所以你应该把这段代码改写成:

$flagged_by2 = mysqli_query ($connect, "SELECT * FROM flagged_posts WHERE flagged_by_id = '$user_ident'");
        $flagged_ids = [];  
        $num_of_flagged_posts = mysqli_num_rows ($flagged_by2);
        while ($getting_d = mysqli_fetch_assoc ($flagged_by2)){
            $flagged_ids[] = $getting_d['thought_id'];
        }
        if (!$flagged_ids) {
            $flagged_ids[] = 0;
        }

$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id IN " . implode(', ', $flagged_ids)." ORDER BY id DESC LIMIT {$start}, {$limit}");

但是,您只能进行 1 个查询,如注释所示,此外,您应该将 PDO 与准备好的语句一起使用 - 现在您的代码容易受到 SQL 注入的攻击。

【讨论】:

  • 我认为你在这一行缺少单引号$query = mysqli_query($connect, "SELECT * FROM user_thoughts WHERE id IN " . implode(', ", $flagged_ids)." ORDER BY id DESC LIMIT {$start}, {$limit}");,因为我从未真正使用过implode,所以我不知道引号应该在哪里结束。
  • @Freddy True,修复了这个
  • 我在查询的行上收到错误 - implode(): Invalid arguments passed?
  • @Freddy 再次抱歉,没有在一处添加[]。现在应该没问题了。
  • 嗯,似乎仍然无法正常工作,但我认为这不是您的代码。我正在使用分页,默认情况下应该显示前 10 行,然后显示一个链接到第 2 页。如果您可以看一下,我已经更新了我的代码。
猜你喜欢
  • 2014-07-13
  • 2012-02-22
  • 2017-02-12
  • 2023-03-24
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多