特別なことは何もせず、データベース接続とテキスト キャッシュをクラスにカプセル化するだけです。
- class Db{
- protected $_connect;
- protected $_db = Array();
- protected $_cache = Array();
-
- public function __construct($args){
- list($this->_db, $this->_cache) = $args;
- }
- 保護関数 connect($db){
- $this->_connect = mysql_connect($db['ホスト名'],$db['ユーザー名'],$db ['パスワード']);
- mysql_set_charset('UTF8');
- mysql_select_db($db['データベース名'],$this->_connect);
- }
- /**
- *機能: テーブル内のデータを取得し、クエリされたデータを配列形式で返します。
- *$sql: 実行される受信 SQL ステートメントは SELECT である必要があり、SELECT のみにすることができます
- *
- */
- public function fetch( $sql){
- $result = '';
- if(isset($this->_cache['expire'])){
- $name = md5(strto lower(str_replace(' ','',$sql)) );
- $dir = substr($name,0,2);
- $dir = $this->_cache['dir'].'/'.$dir;
- !is_dir($dir) && mkdir($ dir,0777);
- !is_dir($dir) && mkdir($dir,0777);
- $this->_cache['path'] = $dir.'/'.$name;
- if(is_file($ this->_cache['path']) && $this->check_expire()){
- $result = $this->get();
- }
- }
- if($result == ''){
- $data = $this->exec($sql);
- $result = Array();
- while($result[] = mysql_fetch_array($data,MYSQL_ASSOC)){} //インデックスを削除
- mysql_free_result($data );
- array_pop($result);
- isset($this->_cache['expire']) && $this->write($result);
- }
- return $result;
- }
- /**
- *機能: SELECT を除くすべての SQL ステートメントを実行します。
- *$sql: 実行する受信 SQL ステートメントは SELECT にすることはできません
- *戻り値: TRUE または FALSE
- */
- public function exec($sql){
- if($this->_connect === null) $this->connect($this->_db); //データリンクを実行します
- if( $result = mysql_query($sql, $this->_connect) ){
- return $result;
- }else{
- die("{$sql}
実行エラー: " . mysql_error());
- }
- }
- /**
- *機能: データベース挿入ステートメントを実行します。これは INSERT ステートメントのみです。
- *$v: 実行される渡される条件は配列形式であり、table は挿入されるテーブルを表し、row はフィールド、value は挿入される値です
- *戻り値: mysql_insert_id() OR FALSE
- */
- public function insert($table,$field,$ignore = 0){
- $D = Array('field'=>'','val'=>'');
- foreach($field AS $key => $v){
- $D['field'] .= $key.',';
- $D['val'] .= "'{$this->escape($v)} ',";
- }
- $D['フィールド'] = rtrim($D['フィールド'],',');
- $D['val'] = rtrim($D['val'],' ,');
- $ignore = $ignore > 'IGNORE' : '';
- $sql = "INSERT {$ignore} INTO {$this->_db['perfix']}{$table}( {$D[' field']}) VALUES({$D['val']})";
- if($this->exec($sql)){
- $insert_id = mysql_insert_id();
- return is_numeric ($insert_id) ? $insert_id : TRUE;
- }else{
- return FALSE;
- }
- }
- public function update($table,$field){
- $D = Array('where'=>'',' str'=> '');
- $index = 0;
- foreach($field AS $key => $v){
- $index == 0 ? $D['where'] = "{$key} = '{$this ->escape($v)}'" : $D['str'] .= "{$key} = '{$this->escape($v)}',";
- $index++;
- }
- $D['str'] = rtrim($D['str'],',');
- $sql = "UPDATE {$this->_db['perfix']}{$ table} SET {$ D['str']} WHERE {$D['where']}";
- return $this->exec($sql);
-
- }
- public function delete($table,$field ){
- $str = '';
- foreach($field AS $key => $v){
- $str = "{$key} = '{$v}'";
- }
- $sql = 'DELETE FROM '.$this ->_db['perfix'].$table.' WHERE '.$str.';
- return $this->exec($sql);
- }
- public function sum( $table,$condition ){
- $totle = $this->fetch('SELECT COUNT(*) AS totle FROM '.$this->db['perfix'].$table.' WHERE '.$condition );
- return $ totle[0]['totle'];
- }
- /**
- *関数: 入力された特殊文字をフィルタリングします
- *$v: 検出のために渡されるパラメータ
- *戻り値: 検出されたパラメータ
- */
- public functionscape($v){
- return mysql_real_escape_string($v);
- }
- /*
- *関数: キャッシュ判定を行う
- */
- public function cache($name,$expire=100000000){
- $this->_cache['expire'] = $expire;
- return $this;
- }
- public function check_expire( ){
- return ( filemtime($this->_cache['path']) + $this->_cache['expire']) > strtotime("now");
- }
-
- public function write($ data){
- $ f = fopen($this->_cache['path'], 'w');
- if ($f) {
- flock($f, LOCK_EX);
- fseek($f, 0) ;
- ftruncate($ f, 0);
- $tmp = fwrite($f, Serialize($data));
- if (!($tmp === false)) {
- $result = true;
- }
- fclose ($f);
- }
- chmod($this->_cache['path'],0777);
- }
- public function get(){
- $f = fopen($this->_cache['path' ], 'r' );
- $data = fread($f,filesize($this->_cache['path']));
- fclose($f);
- return unserialize($data);
- }
- public function delete_dir($ dir = ''){
- $dir = empty($dir) ? $this->_cache['dir'] : $dir;
- !is_dir($dir) && exit;
- $d = opendir($dir) ;
- $i = 0;
- while(($file = readdir($d)) !== false){
- $path = $dir.'/'.$file;
- if($i > 1) is_file ($path) ? unlink($path) : $this->delete_dir($path);
- $i++;
- }
- Closedir($d);
- rmdir($dir);
- }
- public function __destruct() {
- isset($this->_connect) && mysql_close($this->_connect);
- }
- }
コードをコピー
|