3

CodingBizの更新:

私はこれを私のコードに入れています:

for($i=1;$i<=$numRows;$i++) {
    $output .= '<tr>';
    $row = $this->fetchAssoc($result);
    $colRow = $this->fetchAssoc($colResult);
    foreach($colRow as $colName) {
        $output .= "<td>".$row[$colName]."</td>";
    }
    $output .= '</tr>';
}

代わりに

for($i=1;$i<=$numRows;$i++) {
    $output .= '<tr>';
    $row = $this->fetchAssoc($result);
    for($j=1;$j<=$colNumRows;$j++) {
        $colRow = $this->fetchAssoc($colResult);
        $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";
    }
    $output .= '</tr>';
}

これに何か問題がありますか?

元の投稿:

クエリの結果をテーブルに表示する関数をPHPクラスで作成しています。私は自分でテーブルを構築しているのではなく、すべてをPHPを使用して実行したいと思っています。これまでの私のコードは次のとおりです。

function allResults($table,$cols) {
    if(isset($cols)) {
        $query = "SELECT $cols FROM $table";
    }
    else {
        $query = "SELECT * FROM $table";
    }
    $result = $this->query($query);
    $numRows =  $this->numRows($result);
    $colQuery ="SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='shareride'  AND TABLE_NAME='$table'";
    $colResult = $this->query($colQuery);
    $colNumRows = $this->numRows($colResult);

    $output = '<table class="allResults">';
    $output .= '<tr>';
    for($i=1;$i<=$colNumRows;$i++) {
        $colRow = $this->fetchAssoc($colResult);
        $output .= "<td>".$colRow["COLUMN_NAME"]."</td>";
    }
    $output .= '</tr>';
    for($i=1;$i<=$numRows;$i++) {
        $output .= '<tr>';
        $row = $this->fetchAssoc($result);
        for($j=1;$j<=$colNumRows;$j++) {
            $colRow = $this->fetchAssoc($colResult);
            $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";
        }
        $output .= '</tr>';
    }
    $output .= '</table>';
    return $output;
}

不明な場合は、queryを参照しmysqli_querynumRowsを参照しmysqli_num_rows、をfetchAssoc参照しmysqli_fetch_assocます。データベース名は「shareride」です。

私はこの行に何かが欠けていることを知っています:

$output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";

しかし、私はそれが何であるかを知りません。現在、すべてのテーブル列のタイトルが正しく表示され、正しい数のコンテンツ行が取得されていますが、これらの行にデータベースからの実際のデータを入力することはできません。

私は何が欠けていますか?どんな助けでも歓迎です!

4

3 に答える 3

4

同じ結果セットからデータと列の名前を取得します

  <?php
  $i = 0;
  $colNames = array();
  $data = array();
  while($row = ***_fetch_assoc($res)) //where $res is from the main query result not schema information
  {
     //get the column names into an array $colNames
     if($i == 0) //make sure this is done once
     {
        foreach($row as $colname => $val)
           $colNames[] = $colname;
     }

     //get the data into an array
     $data[] = $row;

     $i++;
  }

 ?>

更新:@YourCommonSenseによって上記のコードを置き換えるように提案され、それは機能し、シンプルで短くなりました-私がしたようにループすることなく列名/配列キーを取得する方法

  $data = array();
  while($row = mysql_fetch_assoc($res))
  {
     $data[] = $row;
  }

  $colNames = array_keys(reset($data))

前と同じように続く:表を印刷する

 <table border="1">
 <tr>
    <?php
       //print the header
       foreach($colNames as $colName)
       {
          echo "<th>$colName</th>";
       }
    ?>
 </tr>

    <?php
       //print the rows
       foreach($data as $row)
       {
          echo "<tr>";
          foreach($colNames as $colName)
          {
             echo "<td>".$row[$colName]."</td>";
          }
          echo "</tr>";
       }
    ?>
 </table>

テスト結果

ここに画像の説明を入力してください

データ取得とテーブル生成をどのように分離したかがわかります。これらは相互に依存しているため、配列に静的データを入力することで、データベースなしでテーブル生成をテストできます。

それらを別々の機能にすることもできます。

于 2013-01-20T23:04:01.867 に答える
4
  1. データベース処理コードと HTML 出力コードを混在させないでください。これらは2つのまったく異なる問題です。allResults 関数がデータを含む配列のみを返すようにすると、別の関数を作成して、派手な方法で (データベース ハンドラー クラスではなく) 印刷することができます。
  2. 列名を取得するために情報スキーマは必要ありません。返された配列キーに既に含まれています。
  3. numRows も必要ありません - while() と foreach() を使用してください
  4. あなたと同じようにクエリに直接何かを挿入しないでください$cols。最終的にはエラーやインジェクションにつながります。
  5. このような関数は、クエリのいくつかのパラメーターを受け入れずに、特に mysql から mysqli に移行するコンテキストではまったく意味がありません。プレースホルダーではなく、変数を挿入する古い学校の mysql クエリとして使用します。したがって、移行はまったく役に立たなくなります。
  6. 「コードに何か問題があるか」を知るには、見るのではなく実行する必要があります。コードを実行してデバッグし、主要な変数を出力して、エラーが発生したことを確認します。
于 2013-01-21T05:24:18.150 に答える
0

データ部分を次のようなものに置き換えてみます。

while($row = $this->fetchAssoc($colResult))
{
  echo "<tr>";
  foreach($row as $value)
  {
    echo sprintf("<td>%s</td>",$value)
  }
  echo "</tr>";
}

私はそれが適切な答えではないことを知っていますが、そのコードを読むのは本当に難しいです

于 2013-01-20T23:02:35.250 に答える