【问题标题】:Foreach loop breaks, when database query returns no/empty results [duplicate]当数据库查询返回无/空结果时,Foreach 循环中断
【发布时间】:2015-05-03 21:15:51
【问题描述】:

当查询不返回任何结果时,我有一个 foreach 循环来显示来自 query 的数据 - 有时我希望它不显示任何数据但我收到以下错误:

警告:在第 29 行的 /home/u913241783/public_html/editmeeting.php 中为 foreach() 提供的参数无效

显示数据的段是:

<?php
    foreach($activities as $k=>$v) {
?>
<tr class="table-row">
    <td><?php echo $k+1; ?></td>
    <td contenteditable="true" onBlur="saveToDatabase(this,'title', 'activities', 'activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["title"]; ?></td>
    <td contenteditable="true" onBlur="saveToDatabase(this,'description','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["description"]; ?></td>
    <td contenteditable="true" onBlur="saveToDatabase(this,'leaders','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["leaders"]; ?></td>
    <td contenteditable="true" onBlur="saveToDatabase(this,'time','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["time"]; ?></td>
</tr>
<?php
    }

编辑:

完整代码为:

<?require_once("dbcontroller.php");
$db_handle = new DBController(); ?>
<h1 class="regular brown bottom_line">Activity Test</h1>
<div class="clear"></div>
</header>

<?
include'connect_db.php';
//get variables
$input1 = $_SESSION[ 'unitid' ];
$id=($_GET['id']);
$activities=array();

        $sql = "SELECT activityid, activitynumber, title, description, time, leaders FROM activities WHERE meetingid='$id'";
        $activities = $db_handle->runQuery($sql);?>
       <table class="tbl-qa">
          <thead>
              <tr>
                <th class="table-header" width="10%">Activity No.</th>
                <th class="table-header">Title</th>
                <th class="table-header">Description</th>
                <th class="table-header">Leaders</th>
                <th class="table-header">Time</th>

              </tr>
          </thead>
          <tbody>
          <?php
          print_r($activities);
          foreach($activities as $k=>$v) {
          ?>
              <tr class="table-row">
                <td><?php echo $k+1; ?></td>
                <td contenteditable="true" onBlur="saveToDatabase(this,'title', 'activities', 'activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["title"]; ?></td>
                <td contenteditable="true" onBlur="saveToDatabase(this,'description','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["description"]; ?></td>
                <td contenteditable="true" onBlur="saveToDatabase(this,'leaders','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["leaders"]; ?></td>
                <td contenteditable="true" onBlur="saveToDatabase(this,'time','activities','activityid','<?php echo $activities[$k]["activityid"]; ?>')" onClick="showEdit(this);"><?php echo $activities[$k]["time"]; ?></td>
              </tr>
        <?php
        }
        ?>
          </tbody>
        </table>
    </body>
</html>

dbcontroller.php

<?php
class DBController {
    private $host = "***********";
    private $user = "***********";
    private $password = "***************";
    private $database = "***********";



    function __construct() {
        $conn = mysqli_connect($this->host,$this->user,$this->password,$this->database) OR die ( mysqli_connect_error() );
    }

    function runQuery($query) {
        $conn = mysqli_connect($this->host,$this->user,$this->password);
        mysqli_select_db($conn, $this->database);
        $result = mysqli_query($conn, $query)or die(mysqli_error($conn));
        while($row=mysqli_fetch_assoc($result)) {
            $resultset[] = $row;
        }       
        if(!empty($resultset))
            return $resultset;
    }

    function numRows($query) {
        $result  = mysqli_query($conn, $query);
        $rowcount = mysqli_num_rows($result);
        return $rowcount;   
    }
}
?>

【问题讨论】:

  • print_r($activities); 的输出是什么?
  • 添加您的完整代码...在哪里设置 $activities 变量。
  • 当查询没有返回结果时它不打印任何东西,当查询返回结果时它打印它们。

标签: php mysql arrays mysqli foreach


【解决方案1】:

问题在于您的方法runQuery,因为如果结果为空,它不会返回任何内容。只需添加一个 else 情况,您只返回一个空数组,这样 foreach 循环就不会运行,例如

function runQuery($query) {
    $conn = mysqli_connect($this->host,$this->user,$this->password);
    mysqli_select_db($conn, $this->database);
    $result = mysqli_query($conn, $query)or die(mysqli_error($conn));
    while($row=mysqli_fetch_assoc($result)) {
        $resultset[] = $row;
    }       
    if(!empty($resultset))
        return $resultset;
    else
        return array();
}

另外我建议您将连接保存到属性中,然后将该属性用作连接变量,例如

function __construct() {
    $this->conn = mysqli_connect($this->host,$this->user,$this->password,$this->database) OR die ( mysqli_connect_error() );
  //^^^^^^^^^^^
}   

然后你可以在其他方法中使用它$this-&gt;conn

您可能还想看看mysqli_* prepared statements它更安全

【讨论】:

  • 请解释一下downVote,以便我改进我的答案!
  • 我正在尝试投票,但是当我按下向上箭头时它一直显示-1。感谢您的所有帮助 - 我也会研究您提出的有关改进我的连接方法的建议。
  • @LauraMorris 请参阅:stackoverflow.com/help/privileges/vote-up 这可能会有所帮助
  • @LauraMorris 不客气!祝你有美好的一天:D
  • 不,只返回$result。将 fetchmode 设置为 assoc。它是可遍历的,你可以直接foreach它。如果它为空,则不会有循环。失败为假,只返回成功的查询为真(例如插入操作)。确实大大降低了复杂性和错误情况,还节省了内存。
猜你喜欢
  • 2015-07-23
  • 2012-10-21
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多