关于MySQLi结果集的PHP Foreach

时间:2013-05-24 15:21:39

标签: php mysql foreach

我有一大堆代码可以在我的本地XAMPP测试服务器上运行。问题是,当推送到生产服务器时,它会中断。这不是数据库连接的问题,并且PHP / MySQL在生产服务器上都是5.3,因此不使用旧版本。我认为这是使用foreach循环而不是更标准的while循环;如果是这样,为什么?

<?php
   $res = $mysqli->query('DESCRIBE '.$table);
   $columnCount = 0;
   echo '<ul>';
   foreach($res as $field) {
     if(in_array($field["Field"], $sheetData[0])) {
      echo '<li>';
            //var_dump($field);
      echo $field['Field'].' - '.$field['Type'];
      echo "</li>\r\n";
      $columnCount++;
    }
  }
  echo '</ul>';
?>

编辑:澄清一下,它根本没有输出任何东西而中断;当在循环中插入一个简单的echo语句时,它似乎甚至都没有执行它。

EDIT2:我在下面添加了一个答案,其中详细介绍了这里的问题实际上是什么以及为什么这段代码在某些条件下确实有效。

2 个答案:

答案 0 :(得分:4)

请改为:

if ($result = $mysqli->query('DESCRIBE ' . $table)) {
    $columnCount = 0;
    echo '<ul>';

    /* fetch associative array */
    while ($field = $result->fetch_assoc()) {
        if (in_array($field["Field"], $sheetData[0])) {
            echo "<li>$field[Field] - $field[Type]</li>\r\n";
            $columnCount++;
        }
    }

    echo '</ul>';

    /* free result set */
    $result->free();
}

答案 1 :(得分:4)

所以,自从我在很久以前问过这个问题以来,我想我应该通过一些额外的说明来更新它:我先用foreach循环做的事情确实有效。需要注意的是它只能起作用在PHP 5.4+中,就像mysqli_result类实现Traversable接口时那样。这意味着您可以在更高版本的PHP中使用foreach循环对其进行迭代。

这个变化在我发布我的问题(2013年中期)时显然不是众所周知的,可能是因为互联网上的这么多服务器仍然使用5.3 - 这可能是因为这是PHP的最新版本可用于Ubuntu 12.x - 它将其实用程序限制为最近更新的服务器。但是当你处于支持它的环境中时,这是一种完全有效的技术。