PHPとSQLiteを初めて使ってみたのですが、何とかデータベースの作成と編集及びデータの閲覧ができるスクリプトができたので、おぼえとして記しておきます。
1)SQLite関係
SQLiteといっても、query() の中はSQLで書くため他のデータベースと比べて(きっと)使い方に違いはありません。問題があるとすればSQLがCOBOLやFORTRANと同じ時代に作られた言語なため、書き方が古臭くコマンドの文字列が異様に長いことと、「'」の使い方がPHPやPerlと違うためプログラムが分かりにくいってことでしょうか。書いてみて思ったのですが、表向き「SQLであることを明確にするために大文字で書く」とよく聞きますが、実は「自分のプログラムから、書き方が違う古くさい言語を排除したい」ために大文字で書いているという気がしてなりません。私は後者そのままですけどw。
require 'DB.php';
...
// データベースへの接続
$db = DB::connect("sqlite://:@localhost/パスを含むデータベースファイル名");
if (DB::isError($db)) { die("Can't connect: " . $db->getMessage()); }
...
// テーブルの作成
$q = $db->query('CREATE TABLE テーブル名 (
id INTEGER PRIMARY KEY, フィールド名 フィールドタイプ,... )');
if (DB::isError($q)) { die('Query Error: ' . $q->getMessage()); }
...
// レコード追加
$q = $db->query("INSERT INTO テーブル名 (
id, フィールド名,... ) VALUES ( '$id', '値',... )");
// 値に $_POST['date'] を入れる場合は '$_POST[date]' とする
...
// プレースホルダによるレコード追加
$q = $db->query("INSERT INTO テーブル名 (
id, フィールド名,... ) VALUES ( ?, ?,... )", array($id, 値,... ));
// 値に $_POST['date'] を入れる場合はそのまま $_POST['date']
...
// レコード更新
$q = $db->query("UPDATE テーブル名 SET
date = '$date', フィールド名 = '値',... WHERE id = '$id'");
...
// プレースホルダによるレコード更新
$q = $db->query("UPDATE テーブル名 SET
date = ?, フィールド名 = ?,... WHERE id = '$id'", array($date, 値,... ));
...
// 全フィールドのデータ取得
$q = $db->query("SELECT * FROM テーブル名 WHERE id = '$id'");
$row = $q->fetchRow(); // 配列変数$rowにフィールド順に格納
$count = $q->numrows(); // レコード数 この場合$countは1
...
// レコード削除
$q = $db->query("DELETE FROM テーブル名 WHERE id = '$id'");
...
2)Form関係
htmlで<form>はこれまで使ったことがなく、今回初めて使いました。こんな状況なので私のプログラムは解説本を数ページめくったところにある「Hello, ?さん!」を表示するサンプルプログラムを引き延ばした状況になっていますw。したがって下記の内容は参考になりません。(きっぱり!)
...
// オートグローバル変数 $_POST['edit'] の値を使って処理する場合
if ($_POST['edit']) {
// $_POST['edit'] はvalueの値 'id=1'
$id = ereg_replace('id=', '', $_POST['edit']); // $_POST['edit'] から 'id=' を削除
...処理...
}
print "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"post\">\n";
print "<input type=\"submit\" name=\"edit\" value=\"id=1\" />\n";
print "</form>\n";
...
// オートグローバル変数 $_GET['id'] の値を使って処理する場合
if ($_GET['id']) {
// $_GET['id'] は '?id=' の後に続く値 '1'
...処理...
}
print "<a href=\"{$_SERVER['PHP_SELF']}?id=1\">一番</a>";
...
3)日本語処理関係
日本語のWebページを作る以上、プログラム内でマルチバイト文字の処理は付きまといますが、PHPでは 'mb_' で始まる関数で処理可能で正規表現も使用できます。注意点は、PHPの内部処理エンコーディングと違うエンコーディングで処理したい場合は指定が必要で、うちのLaCoocanは内部処理が 'EUC-jp' のようなので 'UTF-8' を明示的に指定しています。なお、下記は今回作成した文字列を切り捨てる関数です。
...
// 文字列をカットする関数
function textCut($str, $len = 80) {
// $str: カットする文字列
// $len: カットする文字数(省略時は80)
// 文字エンコーディングにUTF-8を指定
mb_regex_encoding('UTF-8');
// <div>...</div>を取り除く
$str = mb_ereg_replace('<div.+?/div>', '', $str);
// <...>を取り除く
$str = mb_ereg_replace('<.+?>', '', $str);
// 空白、改行等を取り除く
$str = mb_ereg_replace('\s', '', $str);
// $lenの値で文字列をカット、カット後は'...'で置き換え
$str = mb_strimwidth($str, 0, $len, '...', 'UTF-8');
return $str;
}
...
今回作成したプログラムで少し特殊な部分はこの程度で、他は一般的な関数等で事足ります。とりあえずこの程度でデータベースを利用したWebページが作れるので、Webを仕事にしている人等には便利な言語なんだろうと思います。
余談ですが、PHPのプログラムは <?php から ?> の間に書きますが、htmlの中でプログラムの場所が飛んでいても変数の値が引き継がれるのにはビックリしました。てっきり変数のスコープは範囲内だけだろうと思い込んでいたので、ブツ切り可能となると超楽チン。プログラムの見易さを考えた上で切る分には有効だと思います。