<?php ////////////////////////////////////////////////////////// ⁄** SQLiteDatabaseの拡張と結果セット作成時の例外を投げる ユーティリティ関数の作成 *⁄ class SQLiteDatabasePlus extends SQLiteDatabase{ private $tablenames; ////////////////////////////////////////////////////////// //クエリに関連したpublic function ⁄** 関数のオーバーライド *⁄ public function query($strsql, $type = SQLITE_BOTH){ //SQLiteResult query ( string query [, int result_type // [, string &error_msg]] ) if ( false === $result = parent::query($strsql, $type = SQLITE_BOTH)){ //no sql details with last error throw new SQLiteException ( sqlite_error_string($this->lastError())); } return $result; } ////////////////////////////////////////////////////////// ⁄** 関数のオーバーライド *⁄ public function unbufferedQuery($strsql, $type = SQLITE_BOTH){ //SQLiteUnbuffered unbufferedQuery ( string query // [,int result_type [, string &error_msg]] ) if ( false === $result = parent::unbufferedQuery($strsql, $type)){ throw new SQLiteException ( sqlite_error_string($this->lastError())); } return $result; } ////////////////////////////////////////////////////////// ⁄** 関数のオーバーライド *⁄ public function singleQuery($strsql, $first_column = true, $bin_decode = false){ //array sqlite_single_query ( resource db, // string query [, bool first_row_only // [, bool decode_binary]] ) if ( false === $result = parent::singleQuery( $strsql, $first_column, $bin_decode)){ throw new SQLiteException ( sqlite_error_string($this->lastError())); } return $result; } ////////////////////////////////////////////////////////// ⁄** 関数のオーバーライド *⁄ public function queryExec($strsql){ //bool queryExec ( string query // [, string &error_msg] ) if ( !parent::queryExec($strsql)){ throw new SQLiteException ( sqlite_error_string($this->lastError())); } return true; } ////////////////////////////////////////////////////////// ⁄** 関数のオーバーライド *⁄ public function arrayQuery($strsql, $type = SQLITE_BOTH, $bin_decode = false ){ //array arrayQuery ( string query [, int result_type // [, bool decode_binary]] ) if ( false === $result = parent::arrayQuery($strsql, $result_type, $bin_decode)){ throw new SQLiteException ( sqlite_error_string($this->lastError())); } return $result; } ////////////////////////////////////////////////////////// ⁄** ポストされたデータをエスケープして返却する 変数の名前とフィールド名を比較する *⁄ public function cleanData($post, $tablename){ if (!isset($this->tablenames)){ $this->setTablenames(); } $this->matchNames($post, $tablename); //if on remove slashes if(get_magic_quotes_gpc()){ foreach ($post as $key=>$value){ $post[$key]=stripslashes($value); } } foreach ($post as $key=>$value){ $post[$key] = htmlentities( sqlite_escape_string($value)); } return $post; } ////////////////////////////////////////////////////////// ⁄** ポストされたフォームの要素の名前がテーブル名と一致するか をチェックする *⁄ public function matchNames($post, $tablename){ //check is set if (!isset($this->tablenames)){ $this->setTablenames(); } if (count($post) == 0){ throw new SQLiteException("Array not set."); } $fields = $this->getFields($tablename); foreach ($post as $name=>$value){ if (!array_key_exists($name, $fields)){ $message = "No matching column for ". "$name in table $tablename."; throw new SQLiteException($message); } } } ////////////////////////////////////////////////////////// ⁄** データベースのテーブル名を取得する *⁄ public function getTableNames(){ if (!isset($this->tablenames)){ $this->setTablenames(); } return $this->tablenames; } ///////////////////////////////////////////////////////// ⁄** 指定されたテーブルのフィールドの名前と型を取得する *⁄ public function getFields($tablename){ if (!isset($this->tablenames)){ $this->setTablenames(); } if (!in_array($tablename, $this->tablenames)){ throw new SQLiteException( "Table $tablename not in database."); } $fieldnames = array(); $sql = "PRAGMA table_info('$tablename')"; $result = $this->unbufferedQuery($sql); foreach ($result as $row){ $fieldnames[$row['name']] = $row['type']; } return $fieldnames; } ////////////////////////////////////////////////////////// //private methods ⁄** private method - テーブル名の配列の初期化 *⁄ private function setTableNames(){ $sql = "SELECT name ". "FROM sqlite_master ". "WHERE type = 'table' ". "OR type = 'view'"; $result = $this->unbufferedQuery($sql); foreach ($result as $row){ $this->tablenames[] = $row['name']; } } }//end class ?>
|