0

タイトルが示すように、私の目的は、MySQL データベースのデータを使用して HTML テーブルを作成することです。

一連のセルを手動で作成したため、使用している一般的な方法は適切ですが、多数のフィールドを含めるようにスケーリングしようとしているため、PHP と foreach ループを使用してセルの HTML を作成しようとしています。配列で。私の問題にコンテキストを与え、同様の状況にある人々に一般的な支援を提供するために、作業のコンテキストと手順を書き留めました。ただし、私が抱えている問題は、具体的にはコードの 1 つのセクションにあることはわかっています。そのセクションにスキップする場合は、以下に明確に示します。

ステップ 1 では、フィールドに含めるタイトルと MySQL データベースの列名の配列を定義します。

$titles  = array('Name', 'Age', 'Height', 'Weight');
$headers = array('q1', 'q2', 'q3', 'q4');

ステップ 2: データベースに接続します (以前に定義した $username と $password):

try {
    $pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
    $pdo->exec("SET CHARACTER SET utf8");

ステップ 3: いくつかの連結を介して SQL ステートメントを作成し、$result をフェッチします。

$sql ="SELECT";

foreach(array_combine($headers, $titles) as $header => $title) {
    $sql .= "`$header` AS `$title`,";
}

$sql .= "`q5` AS `Eye Color`";
$sql .= "FROM samdata.CO_data";


$result = $pdo->query($sql);

ステップ 4: 静的 HTML と上記の SQL クエリの結果を連結して $html_table を作成する

if($result !== false) {
    $html_table = '<table><tr>';
    foreach($titles as $title) {
        $html_table .= "<th> $title </th>";                          
    }

    $html_table .='</tr> <tr>';


//*********PROBLEM SECTION BELOW **************************
    foreach(array_combine($result, $titles) as $row => $title) {                            
        $html_table .= "<td>' .$row\['$title'\]. '</td>";
    }
}
//*********PROBLEM SECTION ABOVE **************************

$html_table .= '</tr> </table>';
$conn = null;   

echo $html_table;       
}

他のすべての部分をテストしたため、問題が示されたセクションにあることはわかっています。たとえば、配列/ foreachループを組み合わせる代わりに手動で書き出す場合:

foreach($result as $row) {
             $html_table .= '
             <tr>
                <td>' .$row['Names']. '</td>
                <td>' .$row['Age']. '</td>
                <td>' .$row['Height']. '</td>
            </tr>';
}

ループの代わりに、それは正常に動作し、それらの見出しの各結果のデータを表示します。問題は、私が何百もの見出しを持っていて、それらをすべて 1 つずつ書き出すよりもエレガントに (そして怠惰に) したいということです!

どこが間違っていますか?ご協力いただきありがとうございます。

4

3 に答える 3

4

問題の行に引用符が一致していないようです。

$html_table .= "<td>' .$row\['$title'\]. '</td>";

二重引用符で始めます。二重引用符の内部では、単一引用符を使用して文字列を終了することはできません。代わりに、二重引用符は二重引用符でのみ終了できます。そして、同じことが一重引用符にも当てはまります。つまり、これは次の2つの方法のいずれかで修正できます。

$html_table .= "<td>" . $row[$title] . "</td>";

または:

$html_table .= '<td>' . $row[$title] . '</td>';

また、周りから引用符を削除した方法にも注目して$titleください。それらは不要であり、PHPに必要以上の処理を行わせることになります。

引用符がどのように一致するかに注目してください。エディターでコードを作成するときは、構文がどのように強調表示されているかを確認してください。元のコードでは、すべて同じ色になるため、変数とインデックスが文字列内にあることがわかります。

二重引用符で囲まれた文字列(など)の変数展開に依存している場合はecho "Hello $name";、配列の文字列キーへのアクセスは、次のように角かっこで囲まれていないと機能しないことに注意してください。

echo "Hello {$person['FirstName']}";

ただし、次のように数値インデックスを使用できます。

echo "Hello $people[0]";

したがって、コードで、文字列を終了して値を連結してから文字列を再開したくない場合は、これを行う必要があります。

$html_table .= "<td>{$row[$title]}</td>";

ただし、この構文は見苦しく、PHPは、変数を展開する必要がある場所を見つけるために追加の処理を実行します。IMHO、これらの問題をすべて回避するために連結を使用してください。

于 2012-10-21T00:07:38.977 に答える
3

あなたは正しくループしていません。$result は、取得する必要がある PDOStatement です。試す

foreach( $result->fetchAll() as $row ) {
    $html_table .= '<tr>' . "\n";
    foreach( $row as $col ) {
        $html_table .= '<td>' .$col. '</td>';
    }
    $html_table .= '</tr>' . "\n";
}
于 2012-10-21T00:14:27.903 に答える
-1

このソリューションは私のプロジェクトで機能しているようで、クエリから列を取得し、レコードをhtmlテーブルに入れることができます。うまくいけば、他の誰かにも役立つかもしれません:

$conn = (...)

$sqlselect = "SELECT name, last, othercol FROM persontable";

// I prepare and execute my query
$stmt = $conn->prepare($sqlselect);
$stmt->execute();

//get full recordset: header and records
$fullrs = $stmt->fetchAll(PDO::FETCH_ASSOC); 

//get the first row (column headers) but do not go to next record
$colheaders = current($fullrs)

out = ""; //variable that will hold my table

out .= <table>;

//get my columns headers in the table          
foreach($colheaders as $key=>$val) 
{
    $out .= '<th>'.$key.'</th>';
}

//get my records in the table
foreach($fullrs as $row) 
{
   $out .= "<tr>"; 
      $out .= '<td>'.$row['name'].'</td>';
      $out .= '<td>'.$row['last'].'</td>';
      $out .= '<td>'.$row['othercol'].'</td>';
   $out .= "</tr>";
}

out .= </table>;  

//spit my table out
echo $out;
于 2015-07-13T04:22:33.483 に答える