SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

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

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

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

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

 次は、前節で作成したデータベースを操作するためのコードに取り掛かります。まずサンプルアプリケーションのインデックスページから始めます。これは保留項目と完了項目の要約を表示するページです。移植性を高めるために、以降のすべてのコードリストではPHPのPDO拡張とPDO/SQLiteドライバを使用します(どちらもPHPバージョン5.1以降でデフォルトでインストールされます)。インデックスページ全体のコードについては、リスト1を参照してください。

 リスト1の処理で重要なのは最初の数行です。ここでSQLiteデータベースへの接続を確立し、このデータベースからレコードを取得します。まず、新しいPDOオブジェクトを初期化し、SQLiteデータベースファイルの所在を示すDSN文字列をPDOオブジェクトに渡します。実際のDSN文字列は、接続しようとするデータベースによって異なります(詳細については、「補足説明:移植性」を参照してください)。次に、このスクリプトはPDOオブジェクトのquery()メソッドを呼び出して2つのSELECTクエリを実行します。1つ目のクエリでは保留項目の一覧を取得し、2つ目のクエリでは完了項目の一覧を取得します。どちらの場合も、以降の処理を単純化するために、fetchAll()メソッドを使用して結果セットを配列の入れ子として整形しています。

リスト1 index.php
<?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>
補足説明: 移植性
 本稿のコードリストでは、PHP 5.1以降の新機能であるPHPのPDO(PHP Data Objects)拡張を使用しています。この拡張はデータベース抽象化レイヤのような働きをし、この拡張を利用すると、移植可能なデータベース非依存のコードを簡単に記述でき、新しいデータベースに切り換えるときにも、PDOコンストラクタに渡すDSN文字列を編集するだけで済みます。
 たとえばMySQLからSQLiteに切り換える場合、必要な作業はDSN文字列を次のように変更することだけです。
<?php
$dbh = new PDO('mysql:host=localhost;port=3307;dbname=testdb', 
  'user, 'pass);
?>
 ただし、PDOなどのデータベース抽象化レイヤを使用すると、移植性は高まりますが、アプリケーションのパフォーマンスに影響が出ることがあるので注意してください。移植性を重視しない場合は、PHPのネイティブSQLiteサポートを使用した方が高いパフォーマンスを得られます。

 必要なデータをすべて取得したら、単純なHTMLページを生成し、foreach()ループを使用して、fetchAll()から返された配列を処理します。1つ1つのレコードについて、説明、実施期限、完了日(データがある場合)、優先度を表形式でページに出力します(図3)。ここでPHPのdate()メソッドを使用して、dueおよびcompleteフィールドで返されたUNIXタイムスタンプを人間にわかりやすい表記に変換していることに注目してください。

図3 index.phpの出力結果。データベースから保留項目と完了項目を取得し、表形式で表示する。
図3 index.phpの出力結果。データベースから保留項目と完了項目を取得し、表形式で表示する。

 さらに、リスト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スタイルシートが含まれています。

リスト2 main.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;    
}

次のページ
リスト項目の追加

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー