SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

SQLiteとPHPで軽快なWebアプリケーションを作る

軽量データベースで作成するWebアプリケーション

ダウンロード サンプルソース (5.1 KB)

アプリケーション要件の定義

 ここで、今回のサンプルアプリケーションで実装すべき機能を簡単にまとめておきます。このリストは、後でデータベース構造を作成するときのガイドラインになります。

  1. 項目の入力 ―― ユーザーが新しい作業項目を入力できるようにします。各項目には、説明、期限、優先度を含めます。
  2. 項目の修正 ―― 入力済みの項目をユーザーが編集または削除できるようにします。
  3. 項目の状態の変更 ―― ユーザーが項目を「完了済み」としてマークできるようにします。
  4. 項目リストの表示 ―― ユーザーがすべての完了項目と保留項目のリストを日付順および優先度順に表示できるようにします。

 ここに示した機能はごく基本的なものであり、必要に応じてもっと複雑なアプリケーションにすることもできます。

 このサンプルアプリケーションでは、これらの機能を実装するために、データベースにアクセスしてitemsテーブル内のレコードを操作するさまざまなPHPスクリプトを使用します。ここで、スクリプトの内容を簡単に紹介しておきます。

 まずアプリケーションのインデックスページ(図1)を見てみましょう。このページは、保留項目と完了項目の最新の要約を日付順に並べて表示するindex.phpというスクリプトに基づきます。index.phpはSELECTクエリでデータベース内のレコードを読み取り、出力をHTMLページとして整形します。

図1 作業リストアプリケーションのインデックスページ。このリストでは作業項目を日付の降順で表示している。項目の追加または変更を行うためのリンクも用意されている。
図1 作業リストアプリケーションのインデックスページ。このリストでは作業項目を日付の降順で表示している。項目の追加または変更を行うためのリンクも用意されている。

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

図2 ユーザーが新しい作業項目を追加するときに使う項目入力フォーム。
図2 ユーザーが新しい作業項目を追加するときに使う項目入力フォーム。

 既存の作業項目を編集するときにも、同じフォームを使用します。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に、このテーブル定義の各フィールドの簡単な説明を示します。

表1 サンプルアプリケーションのitemsテーブル内のデータベースフィールド
フィールド説明
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のデータ型について補足
 SQLiteには、NULL、INTEGER、REAL、TEXT、BLOBという5つの基本データ型があります。ただし、SQLiteデータベースにデータを挿入するときには、挿入する各値のデータ型の方が挿入先フィールドのデータ型よりも優先されます。これはSQLite特有の「明確な型付け(manifest typing)」と呼ばれる機能で、この機能により、たとえばINTEGER型の値をTEXT型のフィールドに挿入したり、その逆を行ったりできます。ただし、自動増分数値フィールドを作成するINTEGER PRIMARY KEY型のフィールドだけは例外です(このフィールド型は前述のスキーマでも使われています)。

 明確な型付けを歓迎しない人もいるかもしれませんが、心配はいりません。SQLiteは厳密な類似性モード(Strict Affinity Mode)で実行することができ、その場合、不正な型の値をフィールドに挿入しようとするとエラーが返されます。明確な型付けの詳細についてはこちらを参照してください。また、SQL-92のうちSQLiteで省略されている機能(またはサポートされていない機能)を一度確認しておくとよいでしょう。

次のページ
作業リストのメインページの作成

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Vikram Vaswani(Vikram Vaswani)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1607 2007/08/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー