データベースを操作するときの日常的な操作にうんざりしています。 どういうわけか状況を修正することにしました。 既存のクラスを30分ほど見てみましたが、自分にふさわしいものは見つかりませんでした。 そして、彼は自分で書く方が簡単だと決めました。
実際に、私は取得したかった:
1.メモリーを保存します。
仕事では、さまざまな国の4〜5台のサーバープラットフォームでサイトを保守および作成する必要があります。 パスワードと(まれではありますが)ネットワークアドレスは常に変化しています。 そのため、接続設定を何らかの方法で一元化し、多数のアドレスとパスワードを覚える必要をなくし、1つのファイルをすべてのサーバーに分散させ、必要に応じて必要なデータベースサーバーを使用したいと考えました。
2.時間を節約します。
私は怠け者です。 私はすぐにスクリプトからスクリプトへと持ち運ぶ必要のあるコードの断片にすぐに飽きます。 要求を出し、配列を取得したかった。
3.自由が欲しかった。
短い検索時間で私の目に留まった多くのモジュールは、クエリ自体を整理しようとしました。
もちろん、これは自分でクエリを書くよりも誰かにとって便利なように思えるかもしれませんが、多くの場合、複雑なクエリを使用し、「スマート」モジュールがそれをすべて正しく最適なクエリに変えるために、これらすべてを書く方法を分析するために時間を費やす必要があります。
実際、これが起こったのです。
<?php
class db {
private static $flag_one; //
//
private $host = 'localhost';
private $user = 'root';
private $password;
private $database = 'mydb';
private $connect; //
private $result; //
private $server; //
public $query_log_mask = 'query%.log'; //
public $debug=0; // /
サーバー名は念のために作成されます。 どの北に接続されているかによって、スクリプトの動作が異なることが必要な場合に、すべてのケースが発生しました。
ログマスクとデバッグフラグの両方が、スクリプト中の変更に使用できます。これは非常に便利な場合があります。
コメントは必要ないと思います。
public static function one($server = 'local'){
if (!isset(self::$flag_one)) {
$c = __CLASS__;
self::$flag_one = new $c($server);
}
return self::$flag_one;
}
契約では、すべてのサーバーとそれらに接続するための特定のパラメーターを定義することにしました。
また、データベースへの接続を確立し、エンコードを設定します。
protected function __construct($server) {
$this->server=$server;
switch ($server) {
case 'server1':
$this->password = 'abcde';
break;
case 'server2':
$this->host='192.168.0.100';
$this->user='someuser';
$this->database='somedb';
$this->password = 'edcba';
break;
default:
$this->password = '';
break;
}
$this->connect = mysql_connect($this->host, $this->user, $this->password) or die(mysql_error());
mysql_select_db($this->database, $this->connect);
$this->query('SET CHARSET cp1251;');
}
複製を禁止します
public function __clone(){
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
メモリからクラスを削除する前に、データベースへの接続を閉じます。
public function close() {
mysql_close($this->connect);
}
public function __destruct(){
$this->close();
}
サーバー名とデータベース名を取得するための関数。
public function show_server() {
return $this->server;
}
public function show_db() {
return $this->database;
}
実際にはモジュール全体の中心))
データベースに要求を行い、必要に応じてログに記録する関数。
public function query($query) {
if(this->debug>0) $this->mysql_query_log($query,'debug');
$this->result = mysql_query($query, $this->connect) or $this->mysql_query_log($query);
}
要求処理関数は要求を受け入れ(または最後に実行された結果を使用し)、配列を返します
public function fetch_rows($query = '', $assoc = MYSQL_ASSOC) {
if (!empty($query)) $this->query($query);
$return = array();
mysql_data_seek($this->result, 0);
while($line = mysql_fetch_array($this->result, $assoc)){
$return[] = $line;
}
return $return;
}
クエリの行数を取得する関数:
public function num_rows($query = '') {
if (!empty($query)) $this->query($query);
return mysql_num_rows($this->result);
}
最も疑わしい部分。 関数はINSERTを実行し、挿入されたレコードのIDを返します。
問題は、IDが返されるかどうかです
public function insert($query = '') {
if (!empty($query)){
$this->query($query);
return mysql_insert_id();
}
return -1;
}
禁止文字を置き換える
public function add_slashes($value) {
return mysql_real_escape_string($value, $this->connect);
}
エラーのある(またはすべての)要求をログに記録する機能
private function mysql_query_log($query = '',$type='error') {
$out='';
$error=($type=='error');
if (!empty($query)) {
$out.="#---------------------------------------\r\n";
$out.=$query."\r\n";
if($error){
$out.=mysql_errno($this->connect).': '.mysql_error($this->connect)."\r\n";
$out.=var_export(debug_backtrace(), true)."\r\n";
}
$out.="#---------------------------------------\r\n";
}
$file = fopen(sprintf($this->query_log_mask,$type), 'a+');
fwrite($file,$out);
fclose($file);
if($error) die('Wrong database query.');
}
}
?>
ここからモジュールをダウンロードできます
改善のためのコメントや提案を聞きたいです。
これはHabréの最初の投稿なので、厳密に判断しないようお願いします。