【问题标题】:PHP + MySQL - While Loop notPHP + MySQL - While 循环不是
【发布时间】:2015-09-02 17:53:15
【问题描述】:

我对 PHP + MySQL 还很陌生,所以请原谅我的困惑—— 我不明白为什么我的代码不会遍历 'underground_name' 列并回显所有行?

这是我的代码...

<?php
    include("../includes/header.php");
    require('../../mysqli_connect.php');
    include("../functions/filter_time.php");

    // query the database
    $query = "SELECT * FROM projects_underground, underground, projects
            LEFT JOIN river ON projects.river_id=river.river_id 
            LEFT JOIN dlr ON projects.dlr_id=dlr.dlr_id 
            LEFT JOIN overground ON projects.overground_id=overground.overground_id 
            LEFT JOIN natrail ON projects.natrail_id=natrail.natrail_id 
            LEFT JOIN tram ON projects.tram_id=tram.tram_id

            WHERE 
            projects_underground.underground_fk = underground.underground_id AND
            projects_underground.projects_fk = projects.projects_id AND
            name = 'Imperial War Museum'";

    $result = mysqli_query($dbc, $query); // put queried result into variable
    $row = mysqli_fetch_assoc($result); // put that into seperate arrays called $row
    $ug = mysqli_fetch_array($result);

    while ($ug = mysqli_fetch_array($result)) {
        echo $ug['underground_name'];
    }
?>

提前感谢您的帮助!

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    1. 尝试在 SQL 控制台上运行您的查询,并检查您得到的结果。
    2. 尝试转储$ug 数组以查看是否正在获取输出。
    3. 您调用了三次mysqli_fetch_*(),一次是在初始化$row 时,一次是在初始化$ug 时,一次是在while 循环中。这将错过前两行 - 因此,如果查询结果中只有两行,则不会打印任何输出。


    $row = mysqli_fetch_assoc($result); // Fetches first result row off the stack 
    $ug = mysqli_fetch_array($result);  // Fetches second result row
    
    while ($ug = mysqli_fetch_array($result)) { // Fetches third row
         // Starts printing from the third row (if there is any)
         echo $ug['underground_name'];
    }
    

    【讨论】:

    • 1. SQL 查询 - SELECT underground_name FROM projects_underground, projects, underground WHERE projects_underground.underground_fk = underground.underground_id AND projects_underground.projects_fk = projects.projects_id AND projects_id = 5 在 PHPmyAdmin 中创建预期结果 - 2. - 当我 (var_dump($row['underground_name']) 我只得到第一行结果?很困惑...? ——
    • mysqli_fetch_rowmysqli_fetch_assoc 函数从结果中返回单独的行。对其中一个的后续调用将返回结果中的下一行(如果没有更多行,则返回 NULL)。因此,您当前代码中的$row 将包含第一行,$ug 将包含第二行(在 while 循环之前),依此类推。
    【解决方案2】:

    您需要了解,当您调用 mysqli_fetch_assoc($result);mysqli_fetch_array($result); 时,您正在从结果堆栈中获取一行。因此,在您到达while 语句之前,您已经完成了两行。因此,如果您的查询返回三个结果,那么您只会在循环中显示一个。

    【讨论】:

    • 感谢您的回复@Machavity。
    • SELECT underground_name FROM projects_underground, projects, underground WHERE projects_underground.underground_fk = underground.underground_id AND projects_underground.projects_fk = projects.projects_id AND projects_id = 5 在 PHPmyAdmin 中创建了预期的结果——但是当我 (var_dump($row['underground_name']) 我只得到第一行结果?很困惑...?
    • @CallMePhilip 请记住,这些函数一次只返回一行。如果您想要一个数组数组,则必须构建自己的循环来执行此操作。
    【解决方案3】:

    尝试运行以下命令查看返回的行数:

    echo $result->num_rows().'行已返回。'.PHP_EOL;

    这是我认为应该可以解决问题的代码更新(通过删除早期对 fetch_assoc 和 fetch_array 的调用并添加一些基本检查是否已返回任何行):

    <?php
    include("../includes/header.php");
    require('../../mysqli_connect.php');
    include("../functions/filter_time.php");
    
    // query the database
    $query = "SELECT * FROM projects_underground, underground, projects
            LEFT JOIN river ON projects.river_id=river.river_id 
            LEFT JOIN dlr ON projects.dlr_id=dlr.dlr_id 
            LEFT JOIN overground ON projects.overground_id=overground.overground_id 
            LEFT JOIN natrail ON projects.natrail_id=natrail.natrail_id 
            LEFT JOIN tram ON projects.tram_id=tram.tram_id
    
            WHERE 
            projects_underground.underground_fk = underground.underground_id AND
            projects_underground.projects_fk = projects.projects_id AND
            name = 'Imperial War Museum'";
    
    $result = mysqli_query($dbc, $query); // put queried result into variable
    
    if (is_object($result) && $result->num_rows() > 0) {
    
        // This line is just for testing, delete from real code
        echo $result->num_rows().' rows have been returned.'.PHP_EOL;
    
        while ($ug = mysqli_fetch_array($result)) {
            echo $ug['underground_name'];
        }
    } else {
        // Do something if no results were returned
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2020-05-15
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2016-11-27
      • 1970-01-01
      相关资源
      最近更新 更多