PHPを使ってデータベースを操作するのは非常に簡単で、PHPERを始めた人でも操作できますが、大量のテーブル操作を扱う場合、多くのMYSQLステートメントにうんざりするため、熱心に操作します。多数のデータベース操作をカプセル化します。そこでデータベースオブジェクトマッピングが登場しました。
まず、新しいインターフェースを作成します。
singleton.class.php
[php]
/**
* @著者 tomyjohn
* @リンク
* @ライセンス
* @バージョン1.0
* @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net
* @パッケージシングルトン
*/
/**
* データベースオブジェクト
*/
インターフェースシングルトン{
/**
* データベースオブジェクトを生成します
* @returns オブジェクト データ オブジェクト;
*@アクセス公開
*/
パブリック静的関数 getInstance();
}
db.class.php
[php]
/**
* @著者 tomyjohn
* @リンク
* @ライセンス
* @バージョン1.0
* @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net
* @パッケージデータベース
*/
/**
*抽象DBクラス
*/
抽象クラス db{
/**
* ファクトリーモード
* @param string $type SQL タイプ
* @returns オブジェクト
*@アクセス公開
*/
パブリック静的関数ファクトリー($type){
return call_user_func(array($type,'getInstance'));
}
/**
* SQL文を実行します
* @param string $query SQL ステートメント
* @return オブジェクト リソースまたは false;
* @アクセス公開
*/
抽象パブリック関数実行($query)
/**
* SQL ステートメントによって返される配列を取得します
* @param string $query SQL ステートメント
* @return オブジェクト リソースまたは false;
* @アクセス公開
*/
抽象パブリック関数 get_array($query)
/**
* 前のステートメントの実行 ID を取得します
* @param string $query SQL ステートメント
* @return 整数または false;
* @アクセス公開
*/
抽象パブリック関数 insert_get_id($query);
/**
* 特殊文字を変換します
* @param string $string
* @return string 処理された文字列
* @アクセス公開
*/
抽象パブリック関数 clean($string);
}
これを見れば、call_user_func メソッドの使い方が思い浮かぶと思いますので、安心して読み進めてください
。
mysql.class.php
[html]
/**
* @著者 tomyjohn
*@リンク
* @ライセンス
* @バージョン 1.0
* @copyright Copyright 2010 tomyjohn - tomyjohn.gicp.net
* @パッケージデータベース
*/
/**
*MYSQL データベース オブジェクト
*/
クラス mysql は db を拡張し、シングルトンを実装します{
/**
* @var $instance オブジェクト
* @現在のクラスにアクセス
*/
保護された静的 $instance = null;
/**
* @var $link リソース
* @現在のクラスにアクセス
*/
保護された $link
/**
* データベースインスタンス
* @return $self::instance オブジェクト
*/
パブリック静的関数 getInstance(){
If(is_null(self::$instance)){
self::$instance = 新しい self();
}
自己::$インスタンスを返す
}
/**
* コンストラクター
*/
保護された関数 __construct(){
グローバル $current_conf
$user = $current_conf['DBUSER']
$pass = $current_conf['DBPWD'];
$host = $current_conf['DBHOST'];
$db = $current_conf['DBNAME']
$this->link = mysql_connect($host,$user,$pass);
mysql_set_charset($current_conf['DBCHARSET'] , $this->link);
mysql_select_db($db);
}
/**
* 特殊文字を変換します
* @param string $string
* @return string 処理された文字列
*@アクセス公開
*/
パブリック関数 clean($string){
return mysql_real_escape_string($string,$this->link);
}
/**
* SQL ステートメントを実行します
* @param string $query SQL ステートメント
* @return オブジェクトリソースまたは false
*@アクセス公開
*/
パブリック関数実行($query){
return mysql_query($query,$this->link);
}
/**
* 前のステートメントの実行 ID を取得します
* @param string $query SQL ステートメント
* @return 整数または false
*@アクセス公開
*/
パブリック関数 insert_get_id($query){
$this->execute($query);
return mysql_insert_id($this->link);
}
/**
* SQL ステートメントによって返される配列を取得します
* @param string $query SQL ステートメント
* @return オブジェクトリソースまたは false
*@アクセス公開
*/
パブリック関数 get_array($query){
$result = $this->execute($query);
$return = array();
if($result){
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$return[] =$row;
}
$return
;
}
}
current_conf この配列は私のプロジェクトのものです。実際、これを読んだ後、このクラスは DB を継承してシングルトン インターフェイスを実装した後にも置き換えることができることも理解できると思います。 MSSQL.ORACLなどのデータベースでも使えますが、これだけではこんな感じの運用データベースしか作れません
[html] プレーンコピーを表示
print_r($value_array); これにより、拡張と一部の繰り返し操作の問題は解決されますが、あまり便利ではありません。さらに一歩進んで、データベース テーブルをオブジェクトで表現する、つまりデータベース マッピングを作成する必要があります。
dao.class.php[html]
クラスダオ{
/**
* @var $values 配列はデータベース オブジェクトを格納します
* @access 現在のクラス
*/
protected $values = array();
/**
* @var $suffix 配列はデータベース オブジェクトを格納します
*@アクセス公開
*/
パブリック $suffix = '';
/**
* コンストラクター
*/
パブリック関数 __construct($qualifier = null){
グローバル $current_conf;
$this->suffix = $current_conf['DBSUFFIX'];
if(!is_null($qualifier)){
$条件 = 配列();
if(is_numeric($qualifier)){
$conditional = array('id'=>$qualifier);
}
else if(is_array($qualifier)){
$条件 = $修飾子;
}
それ以外の場合{
throw new Exception('指定された修飾子の型が無効です!');
}
$this->populate($conditional);
}
}
パブリック関数 __set($name , $value){
$this->values[$name] = $value;
}
パブリック関数 __get($name){
if(isset($this->values[$name])){
$this->values[$name] を返します。
}
それ以外の場合{
null を返します。
}
}
/**
* インスタンスのパラメータを解析します
* @param $条件付きオブジェクト
*/
保護された関数 Populate($conditional){
$connection = db::factory('mysql');
$sql = "SELECT * FROM {$this->suffix}{$this->table} WHERE ";
$qualifier = '';
foreach($conditional as $column => $value){
if(!empty($qualifier)){
$qualifier .= ' AND ';
}
$qualifier .= "`{$column}`='" . $connection->clean($value) 。 "" ";
}
$sql .= $qualifier;
$value_array = $connection->get_array($sql);
if(!isset($value_array[0])){
$value_array[0] = 配列();
}
foreach($value_array[0] as $key => $value){
$this->values[$key] = $value;
}
}
/**
* セーブデータ
*/
パブリック関数 save(){
if(!$this->id){
$this->create();
}
それ以外の場合{
$this->update(); を返す
}
}
/**
* データを追加 www.2cto.com
*/
パブリック関数 create(){
$connection = db::factory('mysql');
$sql = "INSERT INTO {$this->suffix}{$this->table}(`";
$sql .= implode('`, `' , array_keys($this->values));
$sql .="`) VALUES('";
)
$clean = array();
foreach($this->values as $value){
$clean[] = $connection->clean($value);
}
$sql .= implode("', '" , $clean);
$sql .="')";
$this->id = $connection->insert_get_id($sql);
}
/**
* データを更新します
* @return は操作の結果を返します
*/
パブリック関数 update(){
$connection = db::factory('mysql');
$sql = "UPDATE {$this->suffix}{$this->table} セット ";
$updates = array();
foreach($this->values as $key=>$value){
if($key!='id'){
$updates[] = "`{$key}`='" 。 $connection->clean($value) 。 "";
}
}
$sql .= implode(',' , $updates);
$sql .= " WHERE id={$this->id}";
return $connection->execute($sql);
}
/**
* データを削除します
* @return は操作の結果を返します
*/
パブリック関数 delete(){
$connection = db::factory('mysql');
$sql = "{$this->suffix}{$this->table} WHERE から削除します
";
$qualifier = 'id='.$this->id;
$sql .= $qualifier
return $connection->execute($sql);
}
/**
* オブジェクトを配列に変換します
* @return 配列
*/
パブリック関数 object_to_array(){
$this-> 値を返す
}
}
これを見たら誰もがこのクラスを継承したくなると思います。 はい、このクラスを継承すると、各レコードをオブジェクト化し、オブジェクト指向で処理できるようになります。
ニュース.dao.クラス
クラスニュースが dao を拡張します{
保護された$table = __CLASS__;
}
作者: トミージョン
www.bkjia.com