アプリケーション要件の定義
ここで、今回のサンプルアプリケーションで実装すべき機能を簡単にまとめておきます。このリストは、後でデータベース構造を作成するときのガイドラインになります。
- 項目の入力 ―― ユーザーが新しい作業項目を入力できるようにします。各項目には、説明、期限、優先度を含めます。
- 項目の修正 ―― 入力済みの項目をユーザーが編集または削除できるようにします。
- 項目の状態の変更 ―― ユーザーが項目を「完了済み」としてマークできるようにします。
- 項目リストの表示 ―― ユーザーがすべての完了項目と保留項目のリストを日付順および優先度順に表示できるようにします。
ここに示した機能はごく基本的なものであり、必要に応じてもっと複雑なアプリケーションにすることもできます。
このサンプルアプリケーションでは、これらの機能を実装するために、データベースにアクセスしてitemsテーブル内のレコードを操作するさまざまなPHPスクリプトを使用します。ここで、スクリプトの内容を簡単に紹介しておきます。
まずアプリケーションのインデックスページ(図1)を見てみましょう。このページは、保留項目と完了項目の最新の要約を日付順に並べて表示するindex.phpというスクリプトに基づきます。index.phpはSELECTクエリでデータベース内のレコードを読み取り、出力をHTMLページとして整形します。

データベースへの新規項目の追加は、2つのPHPスクリプトを通じて行います。form.phpはデータ入力用のHTMLフォーム(図2)を生成し、save.phpではユーザーが入力した情報をデータベースに保存します。

既存の作業項目を編集するときにも、同じフォームを使用します。form.phpはインテリジェントな判断を行い、編集モードで呼び出されたときにはフォームに既存レコードの内容を自動的に埋め込み、追加モードで呼び出されたときには空のフォームを生成します。
項目をデータベースに保存した後は、その項目についてさまざまな操作を実行できます。保留項目に対しては削除または編集のほか、完了済みとしてマークすることができますが、完了項目に対しては削除しかできません。これらの操作はそれぞれ異なるスクリプトによって実現されます。delete.phpでは、DELETEクエリを通じて名前付きレコードを削除します。done.phpでは、UPDATEクエリを通じてデータベース内の作業項目の状態を変更します。
このアプリケーションで使用するPHP定数とCSSスタイル規則は、それぞれinclude.phpとmain.cssに記述します。
index.phpとform.phpはさまざまなSELECTクエリでデータベースのレコードを読み取るだけの「読み取り用」スクリプトであり、save.php、delete.php、done.phpはデータベースの内容を実際に変更する「書き込み用」スクリプトであるという点に注目してください。
データベースの定義
実装のロードマップが明らかになったので、実際にアプリケーションの作成に進みましょう。まず、データベースファイルの名前を指定してSQLiteプログラムを呼び出し、新しいSQLiteデータベースを作成します。
root@thor:/usr/local/apache/data# sqlite3 todo.db3 SQLite version 3.3.17 Enter ".help" for instructions sqlite>
次のCREATE TABLEコマンドを使用してテーブルを追加します。
sqlite> CREATE TABLE items ( ...> id INTEGER NOT NULL PRIMARY KEY, ...> name TEXT NOT NULL, ...> due INTEGER NOT NULL, ...> complete INTEGER NULL, ...> priority INTEGER NOT NULL, ...> status INTEGER NOT NULL ...> );
表1に、このテーブル定義の各フィールドの簡単な説明を示します。
| フィールド | 説明 |
| Id | レコードID |
| Name | 作業項目の説明 |
| Due | 作業項目の実施期限(日) |
| Complete | 作業項目の実際の完了日 |
| Priority | 作業項目の優先度: 1(優先度低)~5(優先度高い) |
| Status | 作業項目の状態: 0(完了)または1(保留) |
テーブルが作成されたかどうかを確認するには、.tablesコマンドを使用します。このコマンドにより、現在のデータベースに含まれている全テーブルの一覧が表示されます。テーブルが正しく作成されている場合、.tablesコマンドを実行するとitemsというテーブル名が1つ返されます。
sqlite> .tables items
次に、サンプル実行に必要なダミーレコードを挿入します。
sqlite> INSERT INTO "items" VALUES(1, 'Buy anniversary present',1184437800,NULL,4,1); sqlite> INSERT INTO "items" VALUES(2, 'Send invoices',1180549800,NULL,5,1); sqlite> INSERT INTO "items" VALUES(3, 'Finish homework',1180549800, 1180290600,1,0); sqlite> INSERT INTO "items" VALUES(4, 'Visit Jane',1180290600,NULL,2,1); sqlite> INSERT INTO "items" VALUES(5, 'Finalize hotel reservations',1181737000,NULL,5,1); sqlite> INSERT INTO "items" VALUES(6, "Angie's birthday",1182537000,NULL,4,1); sqlite> INSERT INTO "items" VALUES(7, 'Weed the lawn',1182237000,NULL,1,1);
dueフィールドに挿入する値が、日付らしく見えないので戸惑う人もいるかもしれません。これは日付を表すUNIXタイムスタンプです。このタイムスタンプはPHPのmktime()関数を使って簡単に生成できます(詳しくは後述)。
明確な型付けを歓迎しない人もいるかもしれませんが、心配はいりません。SQLiteは厳密な類似性モード(Strict Affinity Mode)で実行することができ、その場合、不正な型の値をフィールドに挿入しようとするとエラーが返されます。明確な型付けの詳細についてはこちらを参照してください。また、SQL-92のうちSQLiteで省略されている機能(またはサポートされていない機能)を一度確認しておくとよいでしょう。
