PHP+SQLite+PDO 入門

WindowsでPHP+SQLite3(PDO)を動かしてみる。SQLは初体験

インストール

PHPはインストール済みとする。php.iniを開いて次の2つをコメントアウトして有効にする。

  • extension=php_pdo.dll
  • extension=php_pdo_sqlite.dll

これで準備完了。(php_sqlite.dllは有効にする必要なし)

テーブルの作成

bbs
id 名前 投稿時間 本文

まずは上の表を作成する。
「bbs」という名前の表で「id」「名前」「投稿時間」「本文」の4つの項目がある。

<?php
$db = new PDO("sqlite:./test.sqlite3"); //DBに接続
$sql = "create table bbs(id integer primary key autoincrement,
 名前 text, 投稿時間 integer, 本文 text)";  //SQL文
$db->query($sql); //DBにSQL文を投げる
$db = null; //DBから切断
?>

phpファイルはUTF-8で保存して、設置パスに日本語が含まれないように注意(DBファイルが開けない)。それでは少し解説

  • 「./test.sqlite3」→ データを保存するファイルへのパス。存在しなければ勝手に作られる
  • 「create table bbs」→ bbsという名前の表を作成する
  • 「id integer」→idという項目は数値
  • 「primary key」 →idを主キーに設定する
  • 「autoincrement」→ データを追加していくと自動で一意の番号が付与されるようになる
  • 「名前 text」→名前という項目はテキスト

上手く動作すれば同じフォルダに「test.sqlite3」というファイルが作成されるはずです。

データの追加

テーブルを作成したらデータを1つ追加してみる。先ほどのスクリプトとの違いはSQL文だけです。

<?php
$db = new PDO("sqlite:./test.sqlite3"); //DBに接続
$sql = "insert into bbs(名前, 投稿時間, 本文)
 values ('名無しさん', 123456789, 'こんにちは')"; //SQL文
$db->query($sql); //DBにSQL文を投げる
$db = null; //DBから切断
?>

これで名前が「名無しさん」、投稿時間が「123456789」(UNIXタイム)、本文が「こんにちは」として登録された。idは自動的に付与されて「1」となります。

データの更新

先ほど登録したデータを更新してみる。スクリプトは同じなので省略してSQL文だけ。

$sql = "update bbs set 名前 = '名有りさん' where id = 1";

「where id = 1」でID=1を指定して、名前を「名有りさん」に変更。(他の項目は変わらない)

複数の項目を変更したい場合は、次のようにコンマで区切って指定する。

$sql = "update bbs set 名前 = '名有りさん', 本文 = 'こんばんわ' where id = 1";

データの削除

$sql = "delete from bbs where id = 1";

これでID=1が削除される。

データの取り出し

$db = new PDO("sqlite:./test.sqlite3");
$sql = "select * from bbs";
foreach ($db->query($sql) as $line) {
     print "{$line['id']} {$line['名前']} {$line['投稿時間']} {$line{'本文'}}\n";
}
$db = null; 

「select * from bbs」でbbsにある全部の項目(*)と全部の件数を取り出せる。(UTF-8なのでコンソールに表示すると文字化けする)
項目で本文だけ取り出したい場合は「select 本文 from bbs」となる。本文と名前だけ取り出したい場合は「select 本文, 名前 from bbs」となる。

1件だけ取り出すには次のSQL文。bbsのid=1だけを取り出します

$sql = "select * from bbs where id = 1";

最新の10件、つまりidの大きい順に10件取り出すには次のSQL文。

$sql = "select * from bbs order by id desc limit 10";

「order by id desc 」でidが大きい順。「limit 10」で10件まで。
小さい順がデフォルト動作ですが、小さい順を指定する必要があればdesc→ascと変更する。

では最新の11番目から30番目までを取り出すには

$sql = "select * from bbs order by id desc limit 10, 20";

「limit 10, 20」を解説すると、最初の10件はスキップして、そこから20件を取り出すとなります。(つまり11~30番目が得られる)

例外処理

例外処理を行いたいなら、次のようにtry~catchで括る。

try {
    $db = new PDO('sqlite:./test.sqlite3');
    //処理省略
    $db = null;
} catch (PDOException $e) {
   die($e->getMessage());
}

セキュリティ

インターネットアプリの場合、SQL文の中に外部入力が侵入するとセキュリティホールになります(SQLインジェクション)。外部入力をSQL文に突っ込む場合は、queryは使わずprepareを使う必要がある。このblogがよくまとまって説明している。

$id = $_GET['id'];

$db = new PDO("sqlite:./test.sqlite3");
$sql = $db -> prepare("select * from bbs where id = ?");
$sql->execute(array($id));
while ($line = $sql->fetch(PDO::FETCH_ASSOC)) {
     print "{$line['id']} {$line['名前']} {$line['投稿時間']} {$line{'本文'}}\n";
}
$db = null;

prepare()はSQL文の構文解析を実行。SQL文の中にある?はSQLの変数。そしてexecute()の引数でPHPの変数とSQLの変数が関連付けされ、実行されている。

DBファイル(今回ならtest.sqlite3)に他人に見られては困るデータが入っている場合は、public_htmlの外に置くようにする。

データベースをGUIで管理するソフト

参考リンク

広告

コメントをどうぞ~

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中