2016-02-13 166 views
2

以下PDO查詢返回下面的結果:PHP PDO組查詢列名的結果

$db = new PDO('....'); 
$sth = $db->prepare('SELECT ...'); 

這些結果如下:

name curso 
ABC stack 
CDE stack 
FGH stack 
IJK stack 
LMN overflow 
OPQ overflow 
RST overflow 

我需要建立HTML這樣的:

<p>stack</p> 
ABC<br/> 
CDE<br/> 
...<br/> 
<p>overflow</p> 
LMN<br/> 
OPQ<br/> 

這就是我想要的:

$sth->execute(); 
    //$curso = $sth->fetch(); 
    $id = $sth->fetchColumn(1); 
    echo "<p>".mb_convert_encoding($id,'utf-8', 'iso-8859-1').'</p>'; 
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
    echo (mb_convert_encoding($row['name'],'utf-8', 'iso-8859-1')).'<br/>'; 
    } 

但是,這是消除各組的頭名,如:

<p>stack</p> 
    CDE<br/> 
    ...<br/> 
+0

嗯,你在做fetchcolumn將獲得ID和扔掉行的其餘部分,然後拿到下一行與取... –

+0

我得到的邏輯,但如何獲得結果按'curso'分組? –

回答

0

也許你可以試試這種代碼打印結果:

$sth->execute(); 
$curso = ''; 
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
    if ($row['curso'] !== $curso) { 
     $curso = $row['curso']; 
     echo '<p>' . mb_convert_encoding($curso, 'utf-8', 'iso-8859-1') . '</p>'; 
    } 
    echo mb_convert_encoding($row['name'], 'utf-8', 'iso-8859-1') . '<br />'; 
} 
+0

我希望有某種內置的方法,但這個工作,謝謝! –

+0

我的方法是不要太多地改變你的初始代碼,以確保它的工作。另一個答案很好地描述了內置解決方案。 – nemoinho

3

這是一個有趣的問題,因爲它不僅涉及到regular PDO feature of grouping results,而且還包括更棘手的參數組合,可以使整個代碼更加平滑:

  • 首先,您必須使用fetchAll()來立即從查詢中獲取所有結果,而不是手動獲取它們。
  • 然後,您必須使用名爲PDO::FETCH_GROUP的PDO魔術常量對結果進行分組,並將所有實際結果嵌套在子陣列中。
  • 最後,您可以將它與另一個常量PDO::FETCH_COLUMN合併,以獲得嵌套數組中的列!

請注意,爲了使用PDO::FETCH_GROUP,您必須在第一位置放置一列。所以,像這樣改變你的代碼

$sth = $db->prepare('SELECT curso, ...'); 
$sth->execute(...); 
$data = $sth->fetchAll(PDO::FETCH_GROUP); 

現在你有一個你正在尋找的分組數組!好了,差不多了,因爲這將是一個嵌套的數組將不得不這樣

foreach ($data as $curso => $section) { 
    echo "<p>$curso</p>"; 
    foreach ($section as $row) { 
     echo $row['name']."<br>"; 
} 

處理然而,如果從該組中只需要一列,我們可以用PDO::FETCH_COLUMN,得到它,使得代碼實光滑:

$data = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN); 
foreach ($data as $curso => $names) { 
    echo "<p>$curso</p>"; 
    foreach ($names as $name) { 
     echo $name."<br>"; 
} 
+0

非常感謝!第一種解決方案非常完美。第二個返回注意:使用未定義的常量PDO_FETCH_COLUMN - 在$ data = $ sth-> fetchAll(PDO :: FETCH_GROUP | PDO_FETCH_COLUMN)中假定爲'PDO_FETCH_COLUMN';並注意:數組到字符串轉換echo $ name。「
」; –

+0

這是我的錯字。 Shoukd是PDO :: FETCH_COLUMN –