MySQLを使用するときにPEAR DBをエミュレートする

かつては、MySQLを使用するときにPEAR DBを使用する必要がありませんでした (明白な理由により:最新バージョンのphpでのサポートの終了、スローダウンなど)しかし、書かれたコードのメガトンを考慮して、エミュレーターは検索を開始しました。 驚いたことに、多かれ少なかれ適切なものは見つかりませんでした。 エイリアンは少し時間をかけて自分の絵を描きます。

クラスでは、プロジェクトで使用された部分だけを販売しました(99%のケースでは、これで十分です)。 これが行われたプロジェクトはかなり前に完了したため、このコードはそれ以上開発されませんでした。 しかし、誰かが何かを補ったり修正したりしても、私は気にしません。

エミュレーターは、ログに書き込むことができるエラー処理クラスと、そこから継承されたPEAR DBエミュレータークラスの2つの部分で構成されています。

コードは2つのプロジェクトで正常にテストされました。 もちろん、コードには修正や補足が可能なものがはるかに多くありますが、それを出発点として先に進むことができます。 追加と修正はPMでお願いします。私の裁量でソースで行います。

これが誰かに役立つことを願っています。コードが長い間渡されているように遡及的に行われるすべてが明らかな欠点に苦しんでいるので、あまり蹴らないでください。 ここに置くと、その美しさを自慢するのではなく、誰かの時間を節約したいだけです。



さらにケースについて:



エラークラス:

<?php /* * Class: Error * Progr.: Mikhail Tchervonenko * Data: 2009-03-04 * EMail: rusmikleATgmailPointCom * ICQ: 35818796 * Skype: RusMikle */ class ERROR { var $show_errors =false; var $stop_after_error =false; var $error =0; var $error_message =""; var $error_messages =false; var $error_backtrase =false; var $error_filename = 'error_log/error_log.txt'; // *********************************** // ***** err_log function start function err_log($error_text="",$error_backtrase=false) { $this->error=1; $this->error_backtrase = $error_backtrase; $error_backtrase = $this->backtrace()."\n\r"; $this->error_message = "-----".date("DM j G:i:s T Y").$error_text; if (is_writable($this->error_filename)) { if (!$handle = fopen($this->error_filename, 'a')) { $ret = false; } if (fwrite($handle, "\n\r------\n\r".$this->error_message.$error_backtrase."\n\r-------\n\r") === FALSE) { $ret = false; } fclose($handle); $ret = true; } if($this->error_backtrase) $this->error_message .= "\n\r".$error_backtrase; $this->error_messages[] = $this->error_message; if($this->show_errors) echo str_replace("\n\r","<br>",$this->error_message); if($this->stop_after_error) exit(); return $ret; } // *********************************** // ***** backtrace function start function backtrace() { $output = "\n\r"; $output .= "Backtrace:\n\r"; $backtrace = debug_backtrace(); foreach ($backtrace as $bt) { $args = ''; foreach ($bt['args'] as $a) { if (!empty($args)) { $args .= ', '; } switch (gettype($a)) { case 'integer': case 'double': $args .= $a; break; case 'string': $a = substr($a, 0, 64).((strlen($a) > 64) ? '...' : ''); $args .= "\"$a\""; break; case 'array': $args .= 'Array('.count($a).')'; break; case 'object': $args .= 'Object('.get_class($a).')'; break; case 'resource': $args .= 'Resource('.strstr($a, '#').')'; break; case 'boolean': $args .= $a ? 'True' : 'False'; break; case 'NULL': $args .= 'Null'; break; default: $args .= 'Unknown'; } } $output .= "\n\r"; $output .= "file: {$bt['line']} - {$bt['file']}\n\r"; $output .= "call: {$bt['class']}{$bt['type']}{$bt['function']}($args)\n\r"; } $output .= "\n\r"; return $output; } // *********************************** // ***** getMessage function start function getMessage() { return $this->error_message; } } ?>
      
      







そして、DBエミュレーター自体



 <?php /* * Class: DB * Progr.: Mikhail Tchervonenko * Data: 2009-03-04 * EMail: rusmikleATgmailPointCom * ICQ: 35818796 * Skype: RusMikle */ class DB extends ERROR { var $tp ="cms1_"; var $conn =false; var $counter =0; // *********************************** // ***** set_database function start function set_database($database) { $res = mysql_select_db($database,$this->conn); if(!$res) { $this->err_log(); return false; } $this->error=0; return true; } // *********************************** // ***** construct function start function connect($host="localhost", $user="root", $pass="", $database="", $table_prefix="st__", $show_errors = false, $stop_after_error =false, $error_backtrase = false, $error_log_file="error_log/error_log.txt") { $this->tp = $table_prefix; $this->show_errors =$show_errors; $this->stop_after_error =$stop_after_error; $this->conn = mysql_connect($host, $user, $pass); if(!$this->conn) { $this->err_log(); return false; } if(!$this->set_database($database)) return false; $this->error=0; return true; } // *********************************** // ***** destruct function start function __destruct() { if(!empty($this->conn)) @mysql_close($this->conn); $this->conn = null; } // *********************************** // ***** close function start function close() { if(!empty($this->conn)) @$mysql_close($this->conn); $rs = null; $this->error=0; } // *********************************** // ***** query function start function query($query) { $this->error=0; $ret = mysql_query($query,$this->conn); if(!$ret) { $this->err_log(mysql_error()."\n\rQUERY:"."\n\r".$query); return false; } return $ret; } // *********************************** // ***** fcount function start function fcount($res) { if(!$res) return 0; $ret = @mysql_num_fields ($res); return $ret; } // *********************************** // ***** ecount function start function ecount($res) { if(!$res) return 0; $ret = @mysql_num_rows ($res); return $ret; } // *********************************** // ***** getOne function start function getOne($sql) { if(empty($sql)) { $this->error=1; return false; } $res = $this->query($sql); $ret = @mysql_fetch_array($res,MYSQL_NUM); if(!empty($res)) @mysql_free_result($res); return $ret[0]; } // *********************************** // ***** getRow function start function & getRow($sql, $ret_type=MYSQL_ASSOC) { // MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH if(empty($sql)) { $this->error=1; return false; } $this->counter = 0; $ret=array(); $res = $this->query($sql); $ret = @mysql_fetch_array($res, $ret_type); $this->counter = $this->ecount($res); if(!empty($res)) @mysql_free_result($res); return $ret; } // *********************************** // ***** getAll function start function & getAll($sql, $ret_type=MYSQL_ASSOC) { // MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH if(empty($sql)) { $this->error=1; return false; } $this->counter = 0; $ret=array(); $res = $this->query($sql); if(!empty($res)) $this->counter = $this->ecount($res); if($this->counter>0) { while ($row = @mysql_fetch_array($res, $ret_type)) $ret[] = $row; } if(!empty($res)) @mysql_free_result($res); return $ret; } // *********************************** // ***** nextId function start function nextId($table_name) { if(empty($table_name)) return false; $table_name=strtolower(trim($table_name))."_seq"; $this->query("CREATE TABLE IF NOT EXISTS `".$table_name."` (`id` bigint(20) unsigned) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); $this->query("LOCK TABLES ".$table_name." WRITE"); $id = $this->getOne("SELECT id FROM ".$table_name); if(empty($id)) { $id=1; $this->query("INSERT into ".$table_name." SET id=".$id); } else { $id++; $this->query("UPDATE ".$table_name." SET id=".$id); } $this->query("UNLOCK TABLES"); return $id; } // *********************************** // ***** iserror function start //        PEAR  !!!! function iserror($result) { if(!is_object($result) && !is_array($result) && empty($result)) return true; else return false; } }// End Class ?>
      
      







ここでこれ以上のコメントは不要だと思います。コードは大きく単純ではありません。 しかし、質問があれば、すぐに答えます。



クラスの操作を開始するには、PEAR DBをオフにし、このコードを有効にして、DBクラスのインスタンスを作成し、接続関数を書き換えます。



敬具ミハイル・チェルボネンコ。

PS ソースコードは素晴らしいものではないので、記事の本文にその全体を掲載することを許可しました。これにより、コメントや提案があればすぐに修正できるようになります。



All Articles