2

我有这段代码可以在我的本地 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:我在下面添加了一个答案,该答案更详细地说明了这里的实际问题以及为什么此代码在某些条件下确实有效。

4

2 回答 2

6

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

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

于 2014-09-09T13:20:54.410 回答
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();
}
于 2013-05-24T15:39:43.483 回答