3

このコードは最初の行を完全に表示しますが、それ以上は表示しません。fetchAll()を試してみましたが、表示する正しい行数を取得できますが、行ごとに 1 つの列しか入力されず、データ値は「配列」という単語に置き換えられます。whileループを試してみました。それは私を怒らせています!

/* SQL */
$sql = "SELECT * FROM exam WHERE exam.Level = ? AND exam.Centre!=''";

/* parameter */
$level = 'B2';

/* prepare */
$stmt = $db->prepare($sql);

/* Execute */
$stmt->execute(array($level));

/* Fetch */
$row = $stmt->fetch(PDO::FETCH_ASSOC);      

/* Display */
    echo '<table>
        <tr>';
    if ($row)
      {
        foreach ($row as $key => $value) 
         {
            echo '<td>';
            echo $value;
            echo '</td>';
         }
      }    
     echo '</tr>
         </table>';
4

2 に答える 2

3

これは、1 行しかフェッチしないためです。fetchAll(); を使用する必要があります。fetch() の代わりに

変化する

$row = $stmt->fetch(PDO::FETCH_ASSOC); 

 $row = $stmt->fetchAll(PDO::FETCH_ASSOC); 

または、fetch() で while ループを使用します。さらに、準備されたステートメントが必要ない場合は、 query() を使用して、 foreach() を介して反復できます

于 2013-05-20T12:02:18.087 に答える
3

すべての行を返すfetch()単一の行のみを返す方法を混乱させています。ただし、後者がネストされたfetchAll()配列を返す限り、2 つのネストされたステートメントも必要になります。foreach

また、ビジネス ロジック (またはデータ操作) を表示ロジックから分離することをお勧めします。
また、コードには、削除したほうがよい不必要な余分なものが含まれています。

したがって、適切なバージョンは次のようになります。

/* Business logic */
$sql   = "SELECT * FROM exam WHERE Level = ? AND Centre!=''";
$level = 'B2';
$stmt  = $db->prepare($sql);
$stmt->execute(array($level));
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);      

/* Display logic */
?>
<table>
<? foreach ($data as $row): ?> 
  <tr>
<?     foreach ($row as $value): ?> 
    <td><?=$value?></td>
<?     endforeach ?> 
  </tr>
</table>
于 2013-05-20T12:24:44.550 に答える