トップ » 技術記事 » PHPで週末プログラミング(1) - 掲示板を作ってみよう(2)

PHPで週末プログラミング(1) - 掲示板を作ってみよう(2)

タグ: PHP SQLite

もし、Webサイトの管理者で週末に何か気軽に作ってみようと思ったなら、自分専用の「掲示板」が作ってみるのはどうでしょうか。前回より、PHPを使うことで手軽にできる掲示板の制作を紹介しています。掲示板を題材にPHPを学ぶことで、Webプログラミングの仕組みを学ぶことができます。ゼロからの掲示板作りに挑戦してみましょう。

対象とする読者

  • 週末に何か作ってみたい人
  • 何かしらのプログラミング言語の経験がある
  • PHPに挑戦してみたい人
  • 掲示板を作ってみたい人

ここで作る掲示板

二回目の今回は、データベースを利用して、より手軽に書き込みを管理する方法を紹介します。データベースを利用するテストプログラムを作りながら、Webアプリケーションの仕組みを確認していきます。

前回の復習

PHP の開発環境を整えるには、XAMPP をインストールするのが簡単ですので、前回、XAMPPのインストールや簡単なテストを行いました。今回も、XAMPP の環境を対象として解説しています。

前回作った掲示板では、ユーザーが投稿した書き込みを、ファイルへ保存するところまで作りました。

URLパラメータを取得するには、$_GET["変数名"] で取得できること、そして、URLパラメータにデータを渡すためには、HTMLの <form> タグを利用できることを学びました。

今回は、データベース(SQLite)を利用して、掲示板に投稿された書き込みを、データベースに保存する方法を紹介します。

なぜデータベースを使うのか?

フリーで配布されている多くの掲示板は、ユーザーからの書き込みを、ファイルへ保存するようになっています。それは、多くの場合、データベースを利用するよりもファイルへデータを保存する方が、手軽に処理ができるからという理由からだと思います。同様の理由で、フリーのWikiアプリケーションとして人気の PukiWiki もデータベースにデータを保存せず、テキストとしてデータを保存しているそうです。

しかし、データベースを利用するメリットははかり知れません。データベースは、データを効率的に扱うためのアプリケーション(またはライブラリ)なのです。そのため、何かしらのデータを扱うアプリケーションを作る場合、データベースを使うことで、プログラマーは、ずいぶん楽をすることができます。このあと、扱いますが、SQLという言語を用いてデータの入出力を行いますが、複雑な条件での検索など、非常に手軽に記述することができます。

PHPから使えるデータベースとして有名なのは、MySQL や PostgreSQL がありますが、他にも、Oracle や MS SQLServer など、多くのデータベースと接続する機能を備えています。

SQLite を使う

今回、掲示板作成のために利用するのは、SQLite というデータベースです。SQLite は、特別なソフトをインストールしなくても使える軽量データベースです。PHP 5以降なら標準で添付しています。また、PHP 4が使える格安のレンタルサーバーでも、SQLite が使えるようになっているところは多いようです。

しかも、1ファイル1データベースという非常にシンプルな構成になっていますので、テキストファイルにデータを記録するのと同じくらい手軽に利用できます。

SQLite が使えるかチェックする

それでは、SQLite が利用できるかどうかを確認してみようと思います。以下のプログラムを、XAMPP の htdocs ディレクトリに「test.php」という名前で保存し、「http://localhost/test.php」にアクセスしてみてください。

<?php
phpinfo();
?>

そして、ブラウザの検索で「SQLite」を検索してみてください。いくつかの項目がヒットすると思いますが、SQLite という項目が見つかれば、PHP でSQLiteが使えることが分かります。

20080815_php-sqlite-check.png

筆者のインストールした XAMPP for Windows 1.6.6a では、利用できるようになっていましたが、もし、利用できなければ、「PHP SQLite インストール」などのキーワードで検索してインストールしてみてください。(長くなるのでここでは扱いません。)

PHP で SQLite の基本的な使い方

SQLite は、1ファイル1データベースとなっています。そのため、扱い方が非常に簡単になっています。通常、プログラミング言語で、ファイルを扱う場合、ファイルを開いてハンドルを得て、これを介して操作を行い、最後にファイルを閉じるという手順を踏みますが、SQLite を扱う場合もこれとほとんど同じ手順で扱うことができます。


<?php
$filename = "test.db";
$query    = "SELECT * FROM logs";
# データベースの処理
$handle = sqlite_open($filename);              # データベースを開く
$result = sqlite_array_query($handle, $query); # 何かしらの操作を行う
sqlite_close($handle);                         # データベースを閉じる
?>
データベースの中には複数のテーブルがある

データベースの中には、いろいろなデータを入れることができます。データと言っても、個別に1つの値を記録しているというよりは、まとまったグループに分けてデータを保存していくようになっています。その1つのグループを、テーブルと言います。つまり、データベースの中には、複数のテーブルを格納することができるようになっています。

テーブルと言うのは、Excel のワークシート1枚に例えると分かりやすいかもしれません。Excel のシートでは、列と行(縦横)の二次元にデータが並んでいますが、テーブルも同じで、はじめに列(カラム)を定義しておくと、そこに複数のデータを書き込んでいくことができます。

http://aoikujira.com/demo/hakkaku/rc/20080815_table.png

もう少し、整理してみると、データベースの中には、複数のテーブルがあり、テーブルは二次元の表のようになっており、列(カラム)と行があるということです。

テーブルを定義する方法

SQLite をはじめ、多くのデータベースでは、テーブルの定義から、データの挿入・取り出し(検索)などの操作を、SQL というデータベース操作言語を介して行うようになっています。

テーブルの作成~CREATE TABLE

テーブルを定義するのは、CREATE TABLE 句です。以下のように使います。

CREATE TABLE テーブル名 (
    カラム名   カラムの型,
    カラム名   カラムの型,
    カラム名   カラムの型,
    ...
);

以下のプログラムは、名前と発言内容だけを記録する簡単なテーブル「logs」を定義します。変数 $query の中に、SQL を記述し、sqlite_array_query() で SQL を実行します。

<?php
$filename = "test.db";
$query    = "
    CREATE TABLE logs (
        name TEXT,
        body TEXT
    );

";
# データベースの処理
$handle = sqlite_open($filename);              # データベースを開く
$result = sqlite_array_query($handle, $query); # SQLを実行する
sqlite_close($handle);                         # データベースを閉じる
?>
データの挿入~INSERT

次に、データを挿入する方法です。これは、INSERT 句を使います。これは、以下のように使います。

INSERT INTO テーブル名 (
    カラム名1, カラム名2, カラム名3 ...
) VALUES (
    カラム1のデータ, カラム2のデータ, カラム3のデータ...
);

上記の手順を実行し、すでにデータベースが作成されていることを前提に、データを挿入するプログラムを書くと次のようになります。

<?php
$filename = "test.db";
$data     = "hello!";
$data_esc = sqlite_escape_string($data);
$query    = "

    INSERT INTO logs (name, body) VALUES ('kujira','$data_esc');
";
# データベースの処理
$handle = sqlite_open($filename);              # データベースを開く
$result = sqlite_array_query($handle, $query); # SQLを実行する
sqlite_close($handle);                         # データベースを閉じる
?>

注意点としては、データベースへデータを挿入するときは、sqlite_escape_string() 関数を使って、データをエスケープしておく必要があるということです。特にユーザーが入力したデータなどは、必ずこの関数を通すようにします。

なぜなら、データベースの記述言語の SQL は、PHPのプログラムの中にあっては、ただの文字列です。そのため、ユーザーのデータの中に、「’」など、SQLとして意味のある文字があった場合、こちらの意図と違った SQL を実行してしまう可能性があるからです。

データの抽出~SELECT

次に、挿入したデータを取り出してみます。データを取り出すには、SELECT 句を利用します。書式は次の通りです。

SELECT * FROM テーブル名;

PHP でプログラムにしてみると次のようになります。

<?php
$filename = "test.db";
$query    = "SELECT * FROM logs";
# データベースの処理
$handle = sqlite_open($filename);              # データベースを開く
$result = sqlite_array_query($handle, $query); # SQLを実行する
sqlite_close($handle);                         # データベースを閉じる
# 結果の表示
echo "<pre>";
print_r($result);
?>

以下は、実行結果です。

http://aoikujira.com/demo/hakkaku/rc/20080815_sql-result1.png

SQLには、他にも、データを更新する UPDATE、データを削除する DELETE があります。ここで紹介した書式は非常に簡単なものです。SQLite で使える SQL の完全な書式は、SQLite のサイトにありますので、そちらを参考にするとよいでしょう。

掲示板の作成

SQLite と SQL の解説が一通り済んだところで、さっそくプログラムを作ってみようと思います。前回作った掲示板のプログラムで、ファイル入出力の部分を、データベースへの入出力に差し替えてみます。

<html><head>
<!-- 文字コードの指定 -->
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">

</head>
<body>
<!-- 入力フォーム -->
<form action="test.php">
  <input type="text" name="data" />

  <input type="submit" value="書く"/>
</form>
<?php
#-----------------------------------------------------------------------
# SQLite を使った簡易掲示板
#-----------------------------------------------------------------------
# データベースを開く
$dbname = "test.db";
if (file_exists($dbname) == FALSE) {
    # はじめての実行なら、テーブルを作成
    $dh = sqlite_open($dbname);
    $sql = "CREATE TABLE logs (name TEXT, body TEXT)";
    sqlite_array_query($dh, $sql);
} else {
    $dh = sqlite_open($dbname);
}
if (!$dh) { echo "DB OPEN ERROR"; exit;}

#-----------------------------------------------------------------------
# URLパラメーターがあればデータベースへ保存する
if (isset($_GET["data"])) {
    # 値を追加する
    $data = $_GET["data"];
    $data = sqlite_escape_string($data);
    $sql = "INSERT INTO logs (body) VALUES ('$data')";
    sqlite_array_query($dh, $sql);
}
#-----------------------------------------------------------------------
# データを取り出す
$sql = "SELECT * FROM logs";
$result = sqlite_array_query($dh, $sql);
#-----------------------------------------------------------------------
# 画面に表示する
echo "<pre>";
foreach ($result as $row) {
    $data = $row["body"];
    $data = htmlspecialchars($data);
    echo $data."\n";
}

#-----------------------------------------------------------------------
?>

</body></html>

これを、実行してみると、前回作った掲示板と同じように動かすことができました。

http://aoikujira.com/demo/hakkaku/rc/20080815_bbs1.png

まとめ

以上、今回は、SQLite の説明を中心に掲示板をデータベースに対応させるところまで作ってみました。SQLの簡単な使い方が理解できたなら、いろいろなものに応用できそうだという感触があったことでしょう。次回は、今回のたたき台を元にもう少しまともな掲示板を作ってみようと思います。お楽しみに。

Series Navigation掲示板を作ってみよう(3)»

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :