1

私はいくつかのPHPコードを持っています:

  1. mysqlテーブルに接続します
  2. 結果を取得します
  3. 結果をHTMLテーブルとして表示するためにフォーマットします(タグの追加など)
  4. 適切にフォーマットされた結果を$echoResultsFinalという名前の変数に保存します

次に、HTMLの中に、いくつかのインラインPHPがあります。それ:

  1. $echoResultsFinalが設定されているかどうかを確認します
  2. もしそうなら、エコーはその内容を出します
  3. そうでない場合は、質問に関係のないものをエコーアウトします

問題: PHPで生成されたテーブルがエコーアウトされると、テーブルの内容が適切な順序になりません。

テーブルを生成するコード:

$echoResultArray = array();
$i = 0;
while ($row = mysql_fetch_array($result))
{
    $td = '';
    foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $key => $value)
    {
        $td .= "<td>" . $row[$key] . "</td>";
    }
    $echoResultArray[$i] = "<tr>" . $td . "</tr>";
    $i++;
}
//Table closing tag
$echoResultsClosing = "</tbody></table>";
mysql_close();

$echoResultData = '';
foreach($echoResultArray as $var)
{
    $echoResultData .= $var;
    $echoResultData .= PHP_EOL;
}

$echoResultFinal = $echoResult . $echoResultData . $echoResultsClosing;

何が起きているのか分かりますか?:)

助けてくれてありがとう!

4

1 に答える 1

4

foreach最初のループに問題があります。あなたが持っているコードはこれです:

foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $key => $value)
{
    $td .= "<td>" . $row[$key] . "</td>";
}

ここで注意すべき重要なことは、foreach が渡した配列を反復処理するときに、すべてのキー$keyとすべての値を割り当てていることです ( )。ここでの問題は、 を使用して配列から値を取得していることです。ただし、渡された配列では、キーは 0 ~ 8 の数字 (配列のインデックス) です。これは、foreach に渡す配列を実行することで確認できます。$value$key => $value$key$rowvar_dump

array(9) {
  [0] => string(10) "FIRST_NAME"
  [1] => string(9) "LAST_NAME"
  [2] => string(7) "RIT_ACC"
  [3] => string(6) "LINK_1"
  [4] => string(6) "LINK_2"
  [5] => string(6) "LINK_3"
  [6] => string(6) "LINK_4"
  [7] => string(6) "LINK_5"
  [8] => string(6) "LINK_6"
}

使用$keyしている s は括弧内にあります。$rowしたがって、配列内の数値インデックスを探しています。のデフォルトの動作により、これでも出力が得られますmysql_fetch_array()

返される配列の型は、result_type の定義方法によって異なります。MYSQL_BOTH (デフォルト) を使用すると、連想インデックスと数値インデックスの両方を持つ配列が得られます。MYSQL_ASSOC を使用すると、連想インデックスのみが取得され (mysql_fetch_assoc() が機能するため)、MYSQL_NUM を使用すると、数値インデックスのみが取得されます (mysql_fetch_row() が機能するため)。

ドキュメントからの引用にここで強調を加えました。

したがって、 への呼び出しmysql_fetch_array()は、列の名前と値、および列とその値の数値インデックスを含む配列を返します。クエリSELECTが foreach に渡した配列とは異なる順序でフィールドを並べ替えたため、結果は順不同でした。数値インデックスは のフィールドの順序に対応するため、必要な順序ではSELECTなく、データベースが指定した順序でフィールドを出力していました。

今後このバグを回避するには、明示的に or を使用するmysql_fetch_assoc()か、または定数を にmysql_fetch_row()渡します。ただし、これらの関数は推奨されておらず、PHP 5.4 で削除される予定です。PDOを調べることを強くお勧めします。(PDO には同様の戻り戦略があり、列名とインデックスを次のように返すので注意してください!)MYSQL_ASSOCMYSQL_NUMmysql_fetch_array()mysql_*MYSQL_BOTH

これを修正するには、 を使用し$valueてクエリから列を取得する必要があります。この変数には列の文字列名が含まれるためです。

foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $value)
{
    $td .= "<td>" . $row[$value] . "</td>";
}

また、キーを使用しない場合は、キーを受け取るために変数を指定する必要がないという理由as $key => $valueだけで、 your を に変更したことに注意してください。as $valueこれらは の2 つの形式ですforeach

于 2012-07-23T20:55:04.737 に答える