2012-10-20 43 views
0

作爲標題狀態,我的目標是使用來自MySQL數據庫的數據生成HTML表格。從MySQL和PDO填充HTML(PHP); foreach循環無法寫入MySQL數據

我使用的一般方法是合理的,因爲我手動編寫了一系列單元格,但我試圖將其縮放到包含大量字段,並且正在嘗試爲單元格編寫HTML PHP和foreach循環與數組。我已經寫出了我的工作背景和步驟,以便爲我的問題提供背景,併爲處於類似情況的人們提供一般幫助。然而,我知道,我所具有的問題特別出現在代碼的一個部分 - 如果您想跳過它,就會在下面明確指出。

第1步定義數組爲標題,我想在MySQL數據庫中的字段有和列名:

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

第2步:連接到數據庫($ username和$密碼先前定義):

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

3步:通過幾個串連創建我的SQL語句,並獲取$結果:

$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創建$ html_table,並從上面的SQL查詢

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

能你嘗試改變這條線'''''''''$''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' – noel

+0

好主意 - 但不會改變不幸。 – Gideon

+0

我只是認爲單引號會阻止代碼被運行。 – noel

回答

3

您的循環不正確。 $結果是您必須獲取的PDOStatement。嘗試

foreach($result->fetchAll() as $row) { 
    $html_table .= '<tr>' . "\n"; 
    foreach($row as $col) { 
     $html_table .= '<td>' .$col. '</td>'; 
    } 
    $html_table .= '</tr>' . "\n"; 
} 
+0

謝謝 - 我明白了,所以$ result不是數組,因此我的循環失敗。謝謝你 - 你的代碼導致只顯示一條記錄,而不是所有的記錄 - 然而,我還沒有把你的頭在這裏做的很好,所以不知道如何調試:任何想法? – Gideon

+0

此外 - 奇怪的事情正在發生:我得到的一個記錄是從幾個記錄中選擇不同的字段(我可以看到我直接在MySQL工作臺中查看錶) – Gideon

+0

您需要循環行然後cols。剛剛編輯。再試一次。 –

4

看起來你有你的問題行一些不匹配的報價:

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

你開始用雙引號。在雙引號內部,單引號不能用於終止字符串。相反,雙引號只能用雙引號結尾。單引號也是一樣。這意味着,這可以固定在以下兩種方法之一:

$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做了額外的處理來找到它需要擴展變量的地方。恕我直言,使用串聯來避免所有這些問題。

+0

你不希望單引號中的變量名應該是'$ html_table。=「​​」。 $ row [$ title]。 「」;'或'$ html_table。='​​'。 $ row [$ title]。 '';''甚至'$ html_table。=「​​{$ row [$ title]}」;' – bradym

+1

@bradym您的評論勝過我的編輯! –

+0

非常感謝:詳細和教育!看起來像我有一個問題,這是這個語法錯誤的組合,正確地循環這裏的另一個答案 - 我會調整。再次感謝! – Gideon

-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;