【问题标题】:Calling function from while loop causing infinite loop从while循环调用函数导致无限循环
【发布时间】:2018-06-29 10:20:18
【问题描述】:

我在一个函数中有一条 MySQLi 语句如下:

function getTimeData($time) {
    $con = mysqli_connect("domain:port", "user", "password", "dbname") or die (mysql_error());
    $selectedDate = $_SESSION['date'];

    $prepTimeData = mysqli_prepare($con, "SELECT * FROM `time` WHERE `date`=? AND `time`<=? AND `endTime`>=?");
    $prepTimeData->bind_param("sss", $selectedDate, $time, $time);
    $prepTimeData->execute();
    $getTimeData = $prepTimeData->get_result();

    return $getTimeData;
  }

然后用while循环遍历所有结果:

while ($data0800 = getTimeData("0800")->fetch_assoc()) {
?><tr><td><?php $data0800['first_name'];?></td>
<td><?php $data0800['riderage'];?></td>
<td><?php $data0800['ridinglevel'];?></td>
<td><?php $data0800['horse'];?></tr><?php
                      }

它会导致表格无限增长而没有实际填充它应该填充的内容。但是,将语句放在函数之外可以正常工作。

【问题讨论】:

  • mysql_error() btw 不适合这里。

标签: php mysqli while-loop


【解决方案1】:

你调用下面的代码;

while ($data0800 = getTimeData("0800")->fetch_assoc()) {

看起来很公平吧?但是每次 while 循环时,都会调用该函数,这意味着完成了一个新查询,这反过来意味着它永远不会到达末尾,因为该值会重置为它找到的第一行,而不是每次循环循环时都调用该函数,使用以下内容将函数调用与循环分开应该可以使其按预期工作,依次收集每一行;

$timedata = getTimeData("0800");
while ($data0800 = $timedata->fetch_assoc()) {

这是因为您只调用一次函数并将其结果存储在 $timedata 变量中,而不是每次循环时都刷新查询和结果集

【讨论】:

  • fetch_assoc() 已经在对数组中的结果进行排序了吗? $timedata = getTimeData("0800"); $datas = $timedata-&gt;fetch_assoc() 后跟 foreach ($datas as $data){} 也是处理此问题的选项
  • fetch_assoc() 收集单行,如果 OP 想要依次使用每一行(如相关循环中的代码所示),while 在获取每一行时效果更好,一次一个,而不是 foreach 一次一个字段,foreach 将循环行内的数据,而不是行本身
  • @LewisSmith - 乐于助人!很高兴它解决了您的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多