以前との改良点
1. DB接続の設定をiniファイルからdefineに変更
2. dboクラスは拡張拡張可能になった。
phpのinclude_path設定に存在するディレクトリの中のDBOディレクトリ以下にあるファイルを検索する
ファイルの命名規則はクラス名と同じファイル名+拡張子がphpであること
3. 検索フィールド名のデミリタが変更可能
使用例:
$table_name = 't_foobar'; //DBに存在するテーブル名 or 拡張クラス名 //テーブルをコントロールするDBOクラスを取得する $dbo = pdbo::Factory($table_name); //検索 $condition = array( 'foobar_name->eq' => 'foobar', 'foobar_year' => 10, ); $rows = $dbo->getAllBySearch( $condition ); //検索結果が配列で取得できる
クラス定義:
//検索フィールド名のデミリタ define( 'PDBO_DEMILT', '->' ); //PDBの接続設定 define('PDO_DSN_STRING',''); define('PDO_DSN_USERNAME',''); define('PDO_DSN_PASSWORD',''); // PDOを利用したデータベースクラス class pdbo{ private static $pdo; private function __construct(){ } public function Factory( $table ){ if( is_null( pdbo::$pdo ) ){ try{ pdbo::$pdo = new PDO( PDBO_DSN_STRING, DBO_DSN_USERNAME, DBO_DSN_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); } catch( PDOException $e ){ echo $e->GetMessage(); throw new Exception( $e->getMessage() ); } } $tmp = explode(':', get_include_path() ); foreach( $tmp as $val ){ $tmp = "{$val}/DBO/{$table}.php"; if( file_exists($tmp) ){ include_once $tmp; return new $table( pdbo::$pdo, '', '' ); } } return new pdbo_if( pdbo::$pdo, '', $table ); } } class dbo{ protected $dbo; protected $db_name; protected $table_name; protected $fields; protected $error_message; protected $query_log = array(); public function __construct( &$pdbo, $db, $table ){ $this->dbo = $pdbo; $this->db_name = $db; $this->table_name = $table; if( strlen($this->table_name) == 0 ){ $this->table_name = $this->_tablename; $table = $this->_tablename; } //テーブル情報取得 try{ $ret = $pdbo->query( 'DESCRIBE '.$table ); } catch( PDOException $e ){ $this->error_message = $e->getMessage(); throw new Exception( $this->error_message ); } $tmp = $ret->fetchAll( PDO::FETCH_ASSOC ); if( !$tmp ) echo $table; foreach( $tmp as $node ){ $type = $this->getType( $node['Type'] ); $this->fields[$node['Field']]['type']= $type['type']; $this->fields[$node['Field']]['size']= $type['size']; $this->fields[$node['Field']]['option']= $type['option']; $this->fields[$node['Field']]['null']= $node['Null']; $this->fields[$node['Field']]['key'] = $node['Key']; } } public function pdbo_if( &$pdo, $db, $table){ $this->__construct( $pdo, $db, $table ); } public function DumpQuery(){ print_r( $this->query_log ); } public function TraceDump(){ return $this->DumpQuery(); } public function begin(){ $this->dbo->beginTransaction(); } public function commit(){ $this->dbo->commit(); } public function rollback(){ $this->dbo->rollback(); } public function getLastInsertID(){ return $this->dbo->lastInsertId(); } /** * 一行だけレコードを取得する * $flagがtrueの時、条件配列にプライマリキーが存在しない場合エラーに * なります * @param array $condition 条件配列 * @param array $sort ソート配列 * @param bool $flag プライマリキー存在チェック * @param array $option オプション */ public function getOnce( $condition, $order = array(), $flag = true, $option = array() ){ $table = $this->table_name; $dbo =& $this->dbo; if( $flag ){ //プライマリーキーの存在チェック $primary = $this->getPrimary(); $keys = array_keys( $condition ); foreach( $primary as $name ){ if( !in_array( $name, $keys ) ){ throw new Exception('プライマリーキーが設定されていません'); } } } //フィールド $fields = array(); if( isset( $option['fields'] ) ) $fields = $option['fields']; //フィールド構築 if( count( $fields ) ){ $fields = $this->makefields( $fields ); $fields = implode( ',', $fields ); } else { $fields = '*'; } //検索条件生成 $ret = null; try{ $where = $this->makeWhere( $condition ); $_order = $this->makeOrder( $order ); $_groupby= ''; if( isset( $option['groupby'] ) && count( $option['groupby'] ) ){ $_groupby = ' GROUP BY '.join( ',', $option['groupby'] ); } $sql = "SELECT {$fields} FROM {$table}"; if( strlen( $where ) > 0 ) $sql .= $where; if( strlen( $_order) > 0 ) $sql .= $_order; if( strlen( $_groupby) > 0 ) $sql .= $_groupby; $this->query_log[] = $sql; $ret = $dbo->query( $sql ); } catch( PDOException $e ){ $this->error_message = $e->getMessage(); throw new Exception( $this->error_message ); } //エラー処理 if( $ret === false ) throw new Exception( "query error: {$sql}"); //複数行検出 if( $ret->rowCount() != 1 ) return false; return $ret->fetch(PDO::FETCH_ASSOC); } /** * */ public function getRowBySearch( $condition, $order = array(), $flag = true, $option = array() ){ return $this->getOnce( $condition, $order, $flag, $option ); } public function getRow( $condition, $order = array(), $flag = true, $option = array() ){ return $this->getOnce( $condition, $order, $flag, $option ); } /** * 条件に一致するレコードを全て取得する * $flagがtrueの時、条件配列にプライマリキーが存在しない場合エラーに * なります * @param array $condition 条件配列 * @param bool $flag プライマリキー存在チェック */ public function getAllBySearch( $condition = array(), $order = array(), $option = array() ){ $table = $this->table_name; $dbo =& $this->dbo; //フィールド $fields = array(); if( isset( $option['fields'] ) ) $fields = $option['fields']; //フィールド構築 if( count( $fields ) ){ $fields = $this->makefields( $fields ); $fields = implode( ',', $fields ); } else { $fields = '*'; } //検索条件生成 $ret = null; try{ $where = $this->makeWhere( $condition ); $_order = $this->makeOrder( $order ); $sql = "SELECT {$fields} FROM {$table}"; $sql .= $where; $sql .= $_order; $this->query_log[] = $sql; $ret = $dbo->query( $sql ); } catch( PDOException $e ){ $this->error_message = $e->getMessage(); throw new Exception( $this->error_message ); } //エラー処理 if( $ret === false ) throw new Exception( "query error: {$sql}"); return $ret->fetchAll(PDO::FETCH_ASSOC); } public function getAllBySearchWithPager( &$pager, $condition, $order=array(), $option=array() ){ unset($condition['limit'] ); unset($condition['sort_number']); unset($condition['display_number']); if( isset($condition['from']) ) { $pager['now'] = $condition['from'] / $pager['limit'] + 1; } unset($condition['from']); unset($condition['numrows']); return $this->getAllPager( $condition, $order, $pager, $option ); } /** * 条件に一致するレコードを全て取得する * また、ページャー情報を生成する * $flagがtrueの時、条件配列にプライマリキーが存在しない場合エラーに * なります * @param array $condition 条件配列 * @param bool $flag プライマリキー存在チェック */ public function getAllPager( $condition = array(), $order = array(), &$page, $option = array() ){ $table = $this->table_name; $dbo =& $this->dbo; //フィールド $fields = array(); if( isset( $option['fields'] ) ) $fields = $option['fields']; //フィールド構築 if( count( $fields ) ){ $fields = $this->makefields( $fields ); $fields = implode( ',', $fields ); } else { $fields = '*'; } //検索条件生成 $res = null; try{ $where = $this->makeWhere( $condition ); $_order = $this->makeOrder( $order ); $sql = "SELECT {$fields} FROM {$table}"; $sql .= $where; $sql .= $_order; $this->query_log[] = $sql; $res = $dbo->query( $sql ); /* $res = $dbo->prepare( $sql, array(PDO::ATTR_CURSOR=>PDO::CURSOR_SCROLL) ); */ $res->execute(); } catch( PDOException $e ){ $this->error_message = $e->getMessage(); throw new Exception( $this->error_message ); } //エラー処理 if( $res === false ) throw new Exception( "query error: {$sql}"); // ページャ処理 if( !isset( $page['now'] ) ) { if( isset( $page['from'] ) ){ if( $page['from'] == 0 ) $page['now'] = 1; else $page['now'] = ceil( $page['from'] / $page['limit'] ); } else { $page['now'] = 1; } } $page['rowCount'] = $res->rowCount(); $page['pageMax'] = ceil( $page['rowCount'] / $page['limit'] ); $page['start'] = ( $page['now'] - 1 ) * $page['limit']; if( $page['start'] < 1 ) $page['start'] = 0; $page['end'] = $page['now'] * $page['limit']; if( $page['end'] > $page['rowCount'] ) $page['end'] = $page['rowCount']; // レコード取得 $ret = array(); $all = $res->fetchAll(PDO::FETCH_ASSOC); if( $page['rowCount'] > 0 ){ for( $n = $page['start']; $n < $page['end']; $n ++ ){ if( !isset($all[$n]) ) break; $ret[] = $all[$n]; /* echo "n: {$n} $n"; $tmp = $res->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $n ); if(!$tmp) break; $ret[] = $tmp; */ } } return $ret; } /** * ページャ情報を編集する */ public function fixPager( $pager, $option = array() ){ /* * numrows * allnumrows * to * firstpage * prev * pages * next * lastpage */ $tmp = $pager; $pager = array( 'numrows' => $tmp['rowCount'], 'allnumrows'=> $tmp['rowCount'], 'from' => $tmp['start'] + 1, 'to' => $tmp['end'], 'firstpage' => '', 'prev' => '', 'next' => '', 'lastpage' => '', 'pages' => array(), 'current' => $tmp['now'], ); //リンク生成 $myFile = basename( $_SERVER['SCRIPT_NAME'] ); $opt = ''; if( count($option) ) { $tt = array(); foreach( $option as $key => $val) $tt[] = "{$key}={$val}"; $opt = '&'.implode('&',$tt); } if( $tmp['pageMax'] == 1 ){ $pager['firstpage'] = null; $pager['prev'] = null; } if( $tmp['pageMax'] == $tmp['now'] || $tmp['pageMax'] == 1){ $pager['next'] = null; $pager['lastpage'] = null; } for( $n = 1; $n 1 ){ $pager['prev'] = $pager['pages'][$pager['current']-1]; $pager['firstpage'] = $pager['pages'][1]; } if( $tmp['pageMax'] > 1 && $pager['current'] < $tmp['pageMax']){ $pager['next'] = $pager['pages'][$pager['current']+1]; $pager['lastpage'] = $pager['pages'][$tmp['pageMax']]; } return $pager; } /** * 唯一のレコード更新 */ public function updateOnce( $data ){ $now = time(); $table = $this->table_name; $dbo =& $this->dbo; $fields =& $this->fields; //更新データ $up_data = array(); //条件データ $condition = array(); foreach( $data as $name => $val ){ //if( !in_array( $name, array_keys($fields) ) ) continue; list( $nm ) = $this->getfieldName( $name ); if( $fields[$nm]['key'] == 'PRI' ){ $condition[$name] = $val; } else { $up_data[$name] = $val; } } if( count($condition) == 0) { throw new Exception( "updateOnce関数の引数にプライマリキーがありませんでした。" ); } //更新日 if( array_key_exists( 'update_datetime', $this->fields ) && !array_key_exists( 'update_datetime', $data ) ){ $data['update_datetime'] = $now; } return $this->update( $up_data, $condition ); } /** * 複数更新 */ public function update( $data, $condition = array() ){ $now = time(); $table = $this->table_name; $dbo =& $this->dbo; $fields =& $this->fields; $node = array(); //更新日 if( array_key_exists( 'update_datetime', $this->fields ) && !array_key_exists( 'update_datetime', $data ) ){ $data['update_datetime'] = $now; } $upd_data = array(); foreach( $data as $key => $val ) { if( !is_array( $val ) ) $val = addslashes( $val ); $option = ''; //オプション検出 if( strpos( $key, PDBO_DEMILT ) !== false ){ $tmp = $key; $tmp = explode( PDBO_DEMILT, $tmp ); $key = $tmp[0]; $option = $tmp[1]; //存在しないキーはスキップ if( !array_key_exists( $key, $fields ) ) continue; if( !is_array( $val ) ){ //文字列 日付型 の場合の処理 if( $this->isString( $fields[$key]['type'] ) || $this->isDate( $fields[$key]['type'] ) ) { $val = "'{$val}'"; } else { //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'{$val}'"; } } } $upd_data[$key] = $this->CombineValue( $key, $option, $val); } else { if( !array_key_exists( $key, $fields ) ) continue; //文字列 日付型 の場合の処理 if( $this->isString( $fields[$key]['type'] ) ) $val="'{$val}'"; if($this->isDate( $fields[$key]['type'] ) ) { $val = "'".date('Y-m-d H:i:s', $val)."'"; } else { //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'{$val}'"; } } $upd_data[$key] = $val; } } try{ $where = $this->makeWhere( $condition ); $node = array(); foreach( $upd_data as $name => $val){ $node[] = "{$name} = {$val}"; } $sql = "UPDATE {$table} SET ".implode( ' , ', $node )." {$where}"; $this->query_log[] = $sql; $dbo->query( $sql ); } catch( Exception $e){ echo $e->getMessage(); return false; } return true; } /** * 一行だけレコードを取得する * $flagがtrueの時、条件配列にプライマリキーが存在しない場合エラーに * なります * @param array $data 登録情報 * @param bool $flag プライマリキー存在チェック */ public function insert( $data, $flag = true ){ $now = time(); if( count( $data ) == 0 ) return false; $fields =& $this->fields; //登録日 if( array_key_exists( 'regist_datetime', $this->fields ) && !array_key_exists( 'regist_datetime', $data ) ){ $data['regist_datetime'] = $now; } //更新日 if( array_key_exists( 'update_datetime', $this->fields ) && !array_key_exists( 'update_datetime', $data ) ){ $data['update_datetime'] = $now; } $tmp = $data; /* //文字列次処理 foreach( $data as $name => $val ){ //文字列時にクォートをつける if( $this->isString($fields[$name]['type']) ){ $val = "'".addslashes($val)."'"; } //日付時にクォートをつける if( $this->isDate($fields[$name]['type']) ) { if( is_int( $val ) ){ $val = date( 'Y-m-d H:i:s', $val ); } $val = "'".addslashes($val)."'"; } $data[$name] = $val; } */ $inst_data = array(); foreach( $data as $key => $val ) { if( !is_array( $val ) ) $val = addslashes( $val ); $option = ''; //オプション検出 if( strpos( $key, PDBO_DEMILT ) !== false ){ $tmp = $key; $tmp = explode( PDBO_DEMILT, $tmp ); $key = $tmp[0]; $option = $tmp[1]; //存在しないキーはスキップ if( !array_key_exists( $key, $fields ) ) continue; if( !is_array( $val ) ){ //文字列 日付型 の場合の処理 if( $this->isString( $fields[$key]['type'] ) || $this->isDate( $fields[$key]['type'] ) ) { $val = "'{$val}'"; } else { //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'{$val}'"; } } } $inst_data[$key] = $this->CombineValue( $key, $option, $val); } else { if( !array_key_exists( $key, $fields ) ) continue; //文字列 日付型 の場合の処理 if( $this->isString( $fields[$key]['type'] ) ) $val="'{$val}'"; if($this->isDate( $fields[$key]['type'] ) ) { $val = "'".date('Y-m-d H:i:s', $val)."'"; } else { //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'{$val}'"; } } $inst_data[$key] = $val; } } //インサートチェック if(($name=pdbo_if::existsfield($inst_data,$this->getNotNull()))!==true){ throw new Exception( "{$name}はnot nullのフィールドですが、存在していませんでした。" ); } $sql = "INSERT INTO {$this->table_name} ( ". implode( ' , ', array_keys($inst_data) )." ) VALUES ( "; $sql .= implode( ', ', $inst_data )." ); "; try{ $this->query_log[] = $sql; $ret = $this->dbo->query( $sql ); } catch( PDOException $e ) { throw new Exception( 'Insert Error:'.$e->getMessage() ); } if( $ret === false ){ throw new Exception( 'Insert Error: '.$sql ); } return true; } /** * 一件削除 */ public function deleteOnce( $condition = array() ){ } /** * 条件削除 */ public function deleteSearch( $condition ){ //if( count( $condition ) == 0 ) return false; $sql = "DELETE FROM {$this->table_name} ".$this->makeWhere($condition); try{ $this->query_log[] = $sql; $ret = $this->dbo->query( $sql ); } catch( PDOException $e ) { throw new Exception( 'Insert Error:'.$e->getMessage() ); } return true; } public function deleteByArray($ids){ $condition = array(); foreach( $ids as $key => $val ){ $condition[$key.'->in'] = $val; } return $this->deleteSearch( $condition ); } /** * Where句の生成 */ private function makeWhere( $condition ){ if( count( $condition ) == 0 ) return ''; $fields = $this->fields; $where = array(); foreach( $condition as $key => $val ){ if( !$val ) continue; if( is_string($val) && strlen( trim($val) ) == 0 ) continue; if( is_array($val) && count( $val ) == 0 ) continue; if( !is_array( $val ) ) $val = addslashes( $val ); $option = ''; //オプション検出 if( strpos( $key, PDBO_DEMILT ) !== false ){ //オプション取得 $tmp = $key; $tmp = explode( PDBO_DEMILT, $tmp ); $key = $tmp[0]; $option = $tmp[1]; //テーブルにカラムが存在するか if( !isset( $fields[$key] ) ){ throw new Exception( "{$key}は{$this->table_name}に存在しないカラムです" ); } if( !is_array( $val ) ){ //文字列 日付型 の場合の処理 if( $this->isString( $fields[$key]['type'] ) || $this->isDate( $fields[$key]['type'] ) ) { $val = "'{$val}'"; } else { //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'{$val}'"; } } } $where[] = $this->CombineStr( $key, $option, $val ); } else { //オプションが無いとき //テーブルにカラムが存在するか if( !isset( $this->fields[$key] ) ){ throw new Exception( "{$key}は{$this->table_name}に存在しないカラムです" ); } if( $this->isString($fields[$key]['type'] ) ) { $where[] = "{$key} LIKE '%{$val}%'"; } else { $where[] = "{$key} = {$val}"; } } } if( count( $where ) == 0 ) return ''; return " WHERE ".implode( ' AND ', $where ); } /** * 配列からWhere文を生成する */ public function makeWhereArray( $condition ){ if( count( $condition ) == 0 ) return ''; $where = array(); foreach( $condition as $key => $val ){ if( is_string($val) && strlen( trim($val) ) == 0 ) continue; if( is_array($val) && count( $val ) == 0 ) continue; if( !is_array( $val ) ) $val = addslashes( $val ); $option = ''; //オプション検出 if( strpos( $key, PDBO_DEMILT ) !== false ){ //オプション取得 $tmp = $key; $tmp = explode( PDBO_DEMILT, $tmp ); $key = $tmp[0]; $option = $tmp[1]; //セカンドオプションがある時 if( isset( $tmp[2] ) ){ //セカンドオプションが文字型の時 if( $tmp[2] == 'STR' ) $val = "'".$val."'"; } $where[] = $this->CombineStr( $key, $option, $val ); } else { //オプションが無いとき $where[] = "{$key} = {$val}"; } } if( count( $where ) == 0 ) return ''; return " WHERE ".implode( ' AND ', $where ); } /** * 配列からORDER文を生成する */ public function makeOrderArray( $order ){ if( count( $order ) == 0 ) return ''; $ret = array(); $fields = $this->fields; $kyes = array_keys( $order ); foreach( $order as $name => $val ){ $ret[] = "{$name} {$val}"; } if( count( $ret ) == 0 ) return ''; return " ORDER BY ".implode( " , ", $ret ); } /** * フィールド生成 */ protected function makefields( $fields ){ $ret = array(); foreach( $fields as $val ){ $val = addslashes( $val ); //オプション検出 if( strpos( $val, PDBO_DEMILT ) !== false ){ //オプション取得 $tmp = $val; $tmp = explode( PDBO_DEMILT, $tmp ); $key = $tmp[0]; $option = $tmp[1]; $ret[] = $this->CombineField( $key, $option )."AS {$key}"; } else { //オプションが無いとき $ret[] = $val; } } return $ret; } protected function CombineValue( $key, $option, $val ){ $ret = ''; switch( $option ){ //暗号 復号化 case 'decrypt': $ret = "AES_DECRYPT('{$val}','".CRYPT_CODE."') "; break; //暗号 符号化 case 'crypt': $ret = "AES_ENCRYPT('{$val}','".CRYPT_CODE."') "; break; //その他 default: $ret = $val; break; } return $ret; } /** * セレクトのフィールド生成 */ protected function CombineField( $key, $option ){ $ret = ''; switch( $option ){ case 'max': $ret = "MAX( {$key} )"; break; //暗号 復号化 case 'decrypt': $ret = "AES_DECRYPT({$key},'".CRYPT_CODE."') "; break; //暗号 符号化 case 'crypt': $ret = "AES_ENCRYPT({$key},'".CRYPT_CODE."') "; break; //その他 default: $ret = $key; break; } return $ret; } /** * オプションに対応したSQL構築 */ protected function CombineStr( $key, $option, $val ){ $ret = ''; switch( $option ){ case 'begin': case 'beginYMD': case 'from': $ret = "{$key} >= {$val}"; break; case 'end': case 'endYMD': case 'to': $ret = "{$key} {$val}"; break; case 'lt': $ret = "{$key} < {$val}"; break; case '--': $ret = "{$key} {$val}"; break; case 'like': $ret = "{$key} LIKE {$val}"; break; case 'likebin': $ret = "{$key} LIKE BINARY {$val}"; break; case 'eq': $ret = "{$key} = {$val}"; break; case 'neq': $ret = "{$key} != {$val}"; break; case 'in': $ret = "{$key} IN (".implode(',', $val).")"; break; case 'not_in': $ret = "NOT ( {$key} IN (".implode(',', $val).") )"; break; case 'crypt': $ret = "AES_DECRYPT({$key},'".CRYPT_CODE."') ". " = {$val}"; break; case 'crypt_like': $ret = "AES_DECRYPT({$key},'".CRYPT_CODE."') ". "LIKE '%{$val}%'"; break; case 'crypt_likebin': $ret = "AES_DECRYPT({$key},'".CRYPT_CODE."') ". "LIKE BINARY '%{$val}%'"; break; default: throw new Exception( 'makeWhere error: '. '指定されないオプションを検出しました' ); } return $ret; } /** * ソート文構築 */ protected function makeOrder( $order ){ if( count( $order ) == 0 ) return ''; $ret = array(); $fields = $this->fields; $kyes = array_keys( $order ); //テーブルにカラムが存在するか foreach( $order as $name => $val ){ if( !isset( $fields[$name] ) ){ throw new Exception( "{$name}は{$this->table_name}に存在しないカラムです" ); } $ret[] = "{$name} {$val}"; } if( count( $ret ) == 0 ) return ''; return " ORDER BY ".implode( " , ", $ret ); } /** * 文字型かを判別する */ protected function isString( $type ){ switch( strtolower($type) ){ case 'char': case 'varchar': case 'text': case 'longtext': return true; } return false; } /** * 日付型かを判別する */ protected function isDate( $type ){ switch( strtolower($type) ){ case 'date': case 'datetime': case 'timestamp': return true; } return false; } /** * Mysqlのカラムタイプから型とサイズ、オプション属性を切り離す */ private function getType( $type ){ $ret = array( 'size' => '', 'type' => '', 'option'=> '', ); $st = 0; $end= 0; $st = strpos( $type, '(' ); if( $st === false ){ $ret['type'] = $type; return $ret; } $ret['type'] = substr( $type, 0, $st ); $end = strpos( $type, ')' ); $ret['size'] = substr( $type, $st+1, $end-$st-1 ); $tmp = explode( ' ', $type ); if( count( $tmp ) > 1 ) $ret['option'] = $tmp[1]; return $ret; } /** * プライマリーキー配列の取得 */ private function getPrimary(){ $ret = array(); foreach( $this->fields as $name => $node ){ if( $node['key'] == 'PRI' ){ $ret[] = $name; } } return $ret; } private function getNotNull(){ $ret = array(); foreach( $this->fields as $name => $node ){ if( $node['null'] == 'No' ){ $ret[] = $name; } } return $ret; } /** * $list配列内のフィールドが$fieldsに含まれているかチェックする */ private function existsfield( $fields, $list ){ $keys = array_keys( $fields ); foreach( $list as $name ){ if( !in_array( $name, $keys ) ) return $name; } return true; } /** * フィールド名を取得 */ private function getfieldName( $name ){ if( strpos( $name, PDBO_DEMILT ) === false ) return array( $name, '' ); return explode( PDBO_DEMILT, $name ); } }
View Comments (0)