2

ローカルの XAMPP テスト サーバーで動作するこのコードのチャンクがあります。問題は、本番サーバーにプッシュすると壊れることです。これはデータベース接続の問題ではなく、本番サーバーでは PHP/MySQL が両方とも 5.3 であるため、どちらの古いバージョンも使用していません。より標準的な while ループの代わりに foreach ループを使用していると考えています。もしそうなら、なぜですか?

<?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 ループで最初に行ったことは機能します。mysqli_resultクラスがTraversableインターフェースを実装したときの PHP 5.4+ でのみ機能することに注意してください。これは、以降のバージョンの PHP で foreach ループを使用して繰り返し処理できることを意味します。

この変更は、私が質問を投稿した時点 (2013 年半ば) ではあまり知られていませんでした。これは、おそらく、インターネット上の非常に多くのサーバーがまだ 5.3 を使用しているという事実によるものです。 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 に答える