2010年3月15日月曜日

SQLiteとPHP

AppleのサイトにSQLiteとPHPをMac OS Xで使う方法が書かれていました。

PHP the Easy Way: Enabling PHP and SQLite on Mac OS X Leopard http://developer.apple.com/mac/articles/internet/phpeasyway.html

しかし、ここに書かれているPHPとSQLiteを使用するスクリプトはそのままではMac OS X 10.5.8では動きません。すこし調べてみると、ソースコードを以下のように変更すると動作しました。
■ 変数を表す'\$'を全て'$'に変更
■ PDOの引数を変更
1. PDO命令の引数'sqlite:'の後にデータベース名'../Public/Drop Box/test.db'を追加
2. PDOは引数のセパレーターを','に変更
3. 引数のユーザ名が変数'$user_db'を初期化宣言
最初の項目はPHPの通常の変数宣言方法にしただけです。

次の項目は、PDO命令の引数を三カ所変更しています。
まず、データベース名が指定されていない問題の修正と、データベースを保存する場所の指定です。'../Public/Drop Box/'ディレクトリのパーミッションは他のユーザからは書き込みのみの設定になっています。'~/Sites'ディレクトリのパーミッションを書き込み可能にする方法もありますが、後で元に戻すのを忘れた場合に危険であると考えてこのようにしています。

次に、セパレータが'.'になっていたものを','に変更しました。

最後に本来はユーザ名が設定されるべき引数に初期化宣言されていない変数'$user_db'が設定されていたため、この変数を初期化宣言しています。今回は暫定的に'myName'で初期化していますが、変数'$user_db'自体を削除してしまうのも一案です。この場合には文末の'echo'文にある変数'$user_db'も削除します。

以上の変更を加えて、さらにHTMLに入れたものが以下のようになります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <title>php_sqlite</title>
</head>
<body>
<?php
// create a SQLite3 database file with PDO and return a database handle (Object Oriented)
$user_db = 'myName';
try {
 $dbHandle = new PDO('sqlite:../Public/Drop Box/test.db','$user_db');
}catch(PDOException $exception){
 echo 'test error<br>';
 die($exception->getMessage());
}
// create page view database table
$sqlCreateTable = 'CREATE TABLE pageView(id INTEGER PRIMARY KEY AUTOINCREMENT, page CHAR(256), access INTEGER(10))';
$dbHandle->exec($sqlCreateTable); // remove or 'comment out' this line after first run
// insert page visit in database with a prepared statement
$sqlInsertVisit = 'INSERT INTO pageView (page, access) VALUES (:page, :access)';
$stmt = $dbHandle->prepare($sqlInsertVisit);
$stmt->bindParam(':page', $_SERVER['PHP_SELF'], PDO::PARAM_STR);
$stmt->bindParam(':access', time(), PDO::PARAM_INT);
$stmt->execute();
// get page views from database
$pageVisit = $dbHandle->quote($_SERVER['PHP_SELF']);
$sqlGetView = 'SELECT count(page) AS view FROM pageView WHERE page = '.$pageVisit.'';
$result = $dbHandle->query($sqlGetView);
$pageView = $result->fetch(); // store result in array
// print page views and filename
echo '<blockquote>This page has been viewed <b>'.$pageView['view']. "</b> times, according to <em>$user_db</em>.</blockquote>";
echo '<blockquote>Edit <em>'.$_SERVER['SCRIPT_FILENAME'].'</em>
to learn how this works.</blockquote>';
?>
</body>
</html>
上記のスクリプトをファイル名"test1.php"等として、ホームディレクトリの'~/Site/'に置いて以下のULRでアクセスします。
http://localhost/~(userName)/test1.php
なお、上記のファイルの少し編集すると「Web 共有」を「切」にしたままでTerminalから以下のように実行する事もできます。
php -f (ファイル名:例test2.php)
まず、上記コードの'<?php'から'?>'までを別のテキストファイル(ファイル名:例test2.php)にし、データベースの保存場所を変更します。コードは以下のようになります。
<?php
// create a SQLite3 database file with PDO and return a database handle (Object Oriented)
$user_db = 'myName';
try {
 $dbHandle = new PDO('sqlite:test.db','$user_db');
}catch(PDOException $exception){
 echo 'test error<br>';
 die($exception->getMessage());
}
// create page view database table
$sqlCreateTable = 'CREATE TABLE pageView(id INTEGER PRIMARY KEY AUTOINCREMENT, page CHAR(256), access INTEGER(10))';
$dbHandle->exec($sqlCreateTable); // remove or 'comment out' this line after first run
// insert page visit in database with a prepared statement
$sqlInsertVisit = 'INSERT INTO pageView (page, access) VALUES (:page, :access)';
$stmt = $dbHandle->prepare($sqlInsertVisit);
$stmt->bindParam(':page', $_SERVER['PHP_SELF'], PDO::PARAM_STR);
$stmt->bindParam(':access', time(), PDO::PARAM_INT);
$stmt->execute();
// get page views from database
$pageVisit = $dbHandle->quote($_SERVER['PHP_SELF']);
$sqlGetView = 'SELECT count(page) AS view FROM pageView WHERE page = '.$pageVisit.'';
$result = $dbHandle->query($sqlGetView);
$pageView = $result->fetch(); // store result in array
// print page views and filename
echo '<blockquote>This page has been viewed <b>'.$pageView['view']. "</b> times, according to <em>$user_db</em>.</blockquote>";
echo '<blockquote>Edit <em>'.$_SERVER['SCRIPT_FILENAME'].'</em>
to learn how this works.</blockquote>';
?>
上記のファイルをphp命令の引数(例test2.php)として渡して実行させます。なお、手軽に試す事を目的としているために、出力結果は正しく改行されず<em>などのhtml文字列も含まれます。

さらに、上記のファイルを以下のようにするとTerminalから通常の命令と同様に実行できます。
まず、上記のファイルの先頭に以下の一行を付け加えます。
#!/usr/bin/php
上記のファイルをファイル名'test.sh'等として保存し、Terminalから以下の命令を実行します。
chmod 744 (ファイル名:例test.sh)
上記の変更を加えて実行形式にしたファイルは以下のように実行できます。
./(ファイル名:例test.sh)
なお、上記の二例ではデータベースのファイル'test.db'はそれぞれのファイルが置かれている場所に保存されます。

0 件のコメント: