作業リストのメインページの作成
次は、前節で作成したデータベースを操作するためのコードに取り掛かります。まずサンプルアプリケーションのインデックスページから始めます。これは保留項目と完了項目の要約を表示するページです。移植性を高めるために、以降のすべてのコードリストではPHPのPDO拡張とPDO/SQLiteドライバを使用します(どちらもPHPバージョン5.1以降でデフォルトでインストールされます)。インデックスページ全体のコードについては、リスト1を参照してください。
リスト1の処理で重要なのは最初の数行です。ここでSQLiteデータベースへの接続を確立し、このデータベースからレコードを取得します。まず、新しいPDOオブジェクトを初期化し、SQLiteデータベースファイルの所在を示すDSN文字列をPDOオブジェクトに渡します。実際のDSN文字列は、接続しようとするデータベースによって異なります(詳細については、「補足説明:移植性」を参照してください)。次に、このスクリプトはPDOオブジェクトのquery()メソッドを呼び出して2つのSELECTクエリを実行します。1つ目のクエリでは保留項目の一覧を取得し、2つ目のクエリでは完了項目の一覧を取得します。どちらの場合も、以降の処理を単純化するために、fetchAll()メソッドを使用して結果セットを配列の入れ子として整形しています。
<?php require 'include.php'; try { // connect to database $dbh = new PDO('sqlite:../../db/todo.db3'); // query and retrieve pending items $sth = $dbh->query("SELECT * FROM items WHERE status = '1' ORDER BY due DESC, priority DESC"); $pending = $sth->fetchAll(); $sth = null; // query and retrieve completed items $sth = $dbh->query("SELECT * FROM items WHERE status = '0' ORDER BY due DESC, priority DESC"); $complete = $sth->fetchAll(); unset($dbh); } catch (PDOException $e) { die('Error: ' . $e->getMessage()); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>To-Do List</title> <link rel="stylesheet" href="main.css" /> </head> <body> <h2>To-Do List</h2> <div class="category">Pending Items</div> <!-- generate listing of pending items --> <?php if (sizeof($pending) > 0) { ?> <table> <tr> <td class="head"></td> <td class="head">Due date</td> <td class="head">Priority</td> </tr> <?php foreach ($pending as $p) { ?> <tr> <td><?php echo $p['name']; ?></td> <td><?php echo date('d M Y', $p['due']); ?></td> <td><?php echo $priorities[$p['priority']]; ?></td> </tr> <?php } ?> </table> <?php } else { ?> <p>None</p> <?php } ?> <!-- link to add a new to-do item --> <p><a href="form.php">Add a new entry</a></p> <!-- generate listing of completed items --> <div class="category">Completed Items</div> <?php if (sizeof($complete) > 0) { ?> <table> <tr> <td class="head"></td> <td class="head">Due date</td> <td class="head">Completion date</td> </tr> <?php foreach ($complete as $c) { ?> <tr> <td><?php echo $c['name']; ?></td> <td><?php echo date('d M Y', $c['due']); ?></td> <td><?php echo date('d M Y', $c['complete']); ?></td> </tr> <?php } ?> </table> <?php } else { ?> <p>None</p> <?php } ?> </body></html>
たとえばMySQLからSQLiteに切り換える場合、必要な作業はDSN文字列を次のように変更することだけです。
<?php $dbh = new PDO('mysql:host=localhost;port=3307;dbname=testdb', 'user, 'pass); ?>
必要なデータをすべて取得したら、単純なHTMLページを生成し、foreach()ループを使用して、fetchAll()から返された配列を処理します。1つ1つのレコードについて、説明、実施期限、完了日(データがある場合)、優先度を表形式でページに出力します(図3)。ここでPHPのdate()メソッドを使用して、dueおよびcompleteフィールドで返されたUNIXタイムスタンプを人間にわかりやすい表記に変換していることに注目してください。

さらに、リスト1で2つの外部ファイルをインクルードしている点に注意してください。1つ目はinclude.phpで、このファイルには複数のコードリストで使われる定数(優先度レベルの英文表記や月名など)が定義されています。
<?php // define labels for priority values $priorities = array ( '1' => 'Very Low', '2' => 'Low', '3' => 'Medium', '4' => 'High', '5' => 'Very High', ); // define array of month names $months = array( '1' => 'Jan', '2' => 'Feb', '3' => 'Mar', '4' => 'Apr', '5' => 'May', '6' => 'Jun', '7' => 'Jul', '8' => 'Aug', '9' => 'Sep', '10' => 'Oct', '11' => 'Nov', '12' => 'Dec', ); ?>
2つ目はmain.css(リスト2を参照)で、このファイルにはサンプルアプリケーションで生成される各種のHTMLドキュメントの書式設定に使われるCSSスタイルシートが含まれています。
h2 {
font: 125% Verdana, sans-serif;
}
input.txt {
color: #00008B;
background-color: #E3F2F7;
border: 1px inset #00008B;
width: 200px;
}
input.btn {
color: #00008B;
font: bold Verdana;
background-color: #ADD8E6;
border: 1px outset #00008B;
}
select.txt {
color: #00008B;
background-color: #E3F2F7;
border: 1px inset #00008B;
}
div.category {
font: bold 80% Verdana, sans-serif;
background-color: #ADD8E6;
padding-bottom: 5px;
margin-top: 8px;
width: 600px;
}
td.head {
font: bold 80% Verdana, sans-serif;
}
td {
padding: 3px;
font: 80% Verdana, sans-serif;
}
p {
font: 80% Verdana, sans-serif;
padding-left: 5px;
}
.late {
color: red;
}
.ontime {
color: green;
}
a:link, a:visited {
color: blue;
}
