この記事では、MySQLデータベースをベースとしたPHPによるオブジェクト永続化層の実装方法の例を説明します。皆さんの参考に共有してください。詳細は以下の通りです
気まぐれに、PHP オブジェクトからデータベースまでの単純な永続化レイヤーを作成しました。
私は PHP をあまり使用しないので、PHP リフレクションに関する内容のほとんどを学習しました。
現時点では、この関数はいくつかの単純なタスクを完了するだけであり、オブジェクト間の関係はマッピングできず、オブジェクトのメンバーは文字列または整数の 2 つの型のみをサポートします。
メンバー変数の値はエスケープされません。 。 。
以下のコードを投稿してください:
最初はデータベースの関連定義です。このファイルはデータベースの接続プロパティを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
/* * ファイル名: config.php *2012-9-29作成 * RobinTang によって作成されました * この生成されたファイルのテンプレートを変更するには、 にアクセスしてください * ウィンドウ - 設定 - PHPeclipse - PHP - コード テンプレート*/ // データベースについて define('DBHOST', 'localhost') // データベースサーバー ; define('DBNAME', 'db_wdid') // データベース名define('DBUSER', 'root') // ログインユーザー名 define('DBPSWD', 'trb'); // ログインパスワード ?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
/* * ファイル名:database.php *2012-9-29作成 * RobinTang によって作成されました * この生成されたファイルのテンプレートを変更するには、 にアクセスしてください* ウィンドウ - 設定 - PHPeclipse - PHP - コード テンプレート */ include_once("config.php"); $debug = false; $g_out = false; 関数出力($s){ グローバル $g_out; $g_out .= $s; $g_out .= "rn"; } 関数 db_openconnect(){ $con = mysql_connect(DBHOST, DBUSER, DBPSWD);
if(!mysql_set_charset("utf8", $con)){ out("mysql エンコーディングの設定に失敗しました"); } if (!$con){ out('接続できませんでした: ' .mysql_error()); } その他{ if(!mysql_select_db(DBNAME, $con)){ $dbn = DBNAME; out("データベース '$dbn' を選択できました: " .mysql_error()); } $sql = "set time_zone = '+8:00';"; if(!db_onlyquery($sql, $con)){ out("タイムゾーンの選択に失敗しました!" . mysql_error()); } } $con を返す; } 関数 db_colseconnect($con){ mysql_close($con); } 関数 db_onlyquery($sql, $con){ $r = mysql_query($sql, $con); if(!$r){ out("クエリ '$sql' :fail"); false を返す; } その他{ $r を返す; } } 関数 db_query($sql){ $con = db_openconnect(); $r = db_onlyquery($sql, $con); $res = false; if($r){ $res = true; } db_colseconnect($con); $r を返す; } 関数 db_query_effect_rows($sql){ $con = db_openconnect(); $r = db_onlyquery($sql, $con); $res = false; if($r){ $res = mysql_affected_rows($con); if($res==0){ $res = -1; } } その他{ $res = false; } db_colseconnect($con); $res を返す; } 関数 db_getresult($sql){ $con = db_openconnect(); $r = db_onlyquery($sql, $con); $res = false; if($r && $arr = mysql_fetch_row($r)){ $res = $arr[0]; } db_colseconnect($con); $res を返す; } 関数 db_getarray($sql){ $con = db_openconnect(); $r = db_onlyquery($sql, $con); $ret = false; if($r){ $row = false; $len = 0; $ret = 配列(); $i = 0; while($arr = mysql_fetch_row($r)){ if($row == false || $len==0){ $row = 配列(); $len = count($arr); for($i=0;$i<$len;++$i){ $key = mysql_field_name($r, $i); array_push($row, $key); } } $itm = 配列(); for($i=0;$i<$len;++$i){ $itm[$row[$i]]=$arr[$i]; } array_push($ret, $itm); } } db_colseconnect($con); $ret を返す; } ?> |
実際、上記の 2 つのファイルは以前に書かれたもので、永続化レイヤーは次のとおりです:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
/* * ファイル名: sinorm.php *2012-11-4作成 * RobinTang によって作成されました * この生成されたファイルのテンプレートを変更するには、 にアクセスしてください* ウィンドウ - 設定 - PHPeclipse - PHP - コード テンプレート */ include_once("database.php");
関数 SinORM_ExecSql($sql) { return db_query($sql); } 関数 SinORM_ExecArray($sql) { return db_getarray($sql); } 関数 SinORM_ExecResult($sql){ return db_getresult($sql); } 関数 SinORM_GetClassPropertys($class) { $r = 新しい ReflectionClass($class); if (!$r->hasProperty('tablename')) { throw new Exception("クラス '$class' には [テーブル名] プロパティがありません"); } $table = $r->getStaticPropertyValue('テーブル名'); if (!$r->hasProperty('id')) { throw new Exception("クラス '$class' には [id] プロパティがありません"); } $mpts = 配列 (); $pts = $r->getProperties(ReflectionProperty :: IS_PUBLIC); foreach ($pts を $pt として) { if (!$pt->isStatic()) { array_push($mpts, $pt); } } 配列を返す ( $テーブル、 $mpts ); } 関数 SinORM_GetPropertyString($pts, $class, $obj = false, $noid = false) { if (is_null($pts)) { list ($tb, $pts) = SinORM_GetClassPropertys($class); } $s = false; $v = false; $l = false; foreach ($pts を $pt として) { $name = $pt->名前; if ($noid == false || $name != 'id') { if ($l) { $s = $s 。 '、'; } $s = $s 。 $name;
if ($obj) { if ($l) { $v = $v 。 '、'; } $val = $pt->getValue($obj); if (is_null($val)) $v = $v 。 「ヌル」; if (is_string($val)) $v = $v 。 "'$val'"; その他 $v = $v 。 $val; } $l = true; } } 配列を返す ( $s、 $v ); } 関数 SinORM_GetTableName($class){ $r = 新しい ReflectionClass($class); if (!$r->hasProperty('tablename')) { throw new Exception("クラス '$class' には [テーブル名] プロパティがありません"); } $table = $r->getStaticPropertyValue('テーブル名'); if (!$r->hasProperty('id')) { throw new Exception("クラス '$class' には [id] プロパティがありません"); } $table を返す; } 関数 SinORM_ResetORM($class) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "CREATE TABLE `$tb` (`id` int NOT NULL AUTO_INCREMENT"; $r = 新しい ReflectionClass($class); $obj = $r->newInstance(); foreach ($pts を $pt として) { $val = $pt->getValue($obj); $name = $pt->名前; if ($name != 'id') { $sql = $sql 。 '、'; } 他 { 続き; } if (is_null($val)) 新しい例外をスローします($class . '->' . "名前にはデフォルト値が必要です"); if (is_string($val)) $sql = $sql 。 "`$name` テキスト NULL"; その他 $sql = $sql 。 "`$name` int NULL"; } $sql = $sql 。 ",主キー (`id`));"; $dsql = "`$tb` が存在する場合はテーブルを削除;"; return SinORM_ExecSql($dsql) && SinORM_ExecSql($sql); } 関数 SinORM_SaveObject($obj) { $class = get_class($obj); list ($tb, $pts) = SinORM_GetClassPropertys($class); list ($names, $vals) = SinORM_GetPropertyString($pts, $class, $obj, true); $sql = "`$tb`($names) の値($vals) に挿入"; if(SinORM_ExecSql($sql)){ $q = "SELECT `id` FROM `$tb` ORDER BY `id` DESC LIMIT 1;"; $id = SinORM_ExecResult($q); if($id){ $obj->id = $id; } } false を返す; } 関数 SinORM_GetObjects($class) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "SELECT * from `$tb`;"; $ary = SinORM_ExecArray($sql); $res = false; if (is_array($ary)) { $res = 配列 (); $ref = 新しい ReflectionClass($class); foreach ($ary を $a) { $obj = $ref->newInstance(); foreach ($pts を $pt として) { $name = $pt->名前; $olv = $pt->getValue($obj); $val = $a[$name]; if (is_string($olv)) $pt->setValue($obj, $val); その他 $pt->setValue($obj, intval($val)); } array_push($res, $obj); } } 他 { 「いいえ」とエコー; } $res を返す; } 関数 SinORM_GetObject($class, $id) { list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "SELECT * from `$tb` where `id`=$id;"; $ary = SinORM_ExecArray($sql); $res = null; if (is_array($ary) && count($ary) > 0) { $res = 配列 (); $ref = 新しい ReflectionClass($class); $a = $ary[0]; $obj = $ref->newInstance(); foreach ($pts を $pt として) { $name = $pt->名前; $olv = $pt->getValue($obj); $val = $a[$name]; if (is_string($olv)) $pt->setValue($obj, $val); その他 $pt->setValue($obj, intval($val)); } $obj を返す; } null を返す; } 関数 SinORM_Update($obj) { $class = get_class($obj); list ($tb, $pts) = SinORM_GetClassPropertys($class); $sql = "`$tb` セットを更新 "; $l = false; foreach ($pts を $pt として) { $name = $pt->名前; $val = $pt->getValue($obj); if ($name == 'id') 続き; if ($l) $sql = $sql 。 '、'; if (is_string($val)) $sql = $sql 。 "$name='$val'"; その他 $sql = $sql 。 "$name=$val"; $l = true; } $sql = $sql 。 " WHERE `id`=$obj->id;"; return SinORM_ExecSql($sql); } 関数 SinORM_SaveOrUpdate($obj) { if (SinORM_GetObject(get_class($obj), $obj->id) == null) { SinORM_SaveObject($obj); } 他 { SinORM_Update($obj); } } 関数 SinORM_DeleteObject($obj){ $class = get_class($obj); $tb = SinORM_GetTableName($class); $sql = "`$tb` WHERE `id`=$obj->id; から削除"; return SinORM_ExecSql($sql); } 関数 SinORM_DeleteAll($class){ $tb = SinORM_GetTableName($class); $sql = "`$tb`から削除;"; return SinORM_ExecSql($sql); } ?> |
以下は使用例です:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/* * ファイル名:demo.php *2012-11-4作成 * RobinTang によって作成されました * この生成されたファイルのテンプレートを変更するには、 にアクセスしてください* ウィンドウ - 設定 - PHPeclipse - PHP - コード テンプレート */ include_once("sinorm.php"); //以下は永続オブジェクトクラスの定義です // 各永続オブジェクト クラスには、データベース内でオブジェクトが保存されているテーブルの名前を表す $tablename という静的メンバーが必要です // クラスの各メンバーは初期化される必要があります。つまり、初期値が与えられる必要があります // メンバー変数は文字列または整数のみにすることができ、パブリックとして定義してください パブリック メンバー変数のみがマッピングされます。クラスユーザー{ public static $tablename = 't_user' // 静的変数、オブジェクトのテーブル名、必須 public $id = 0; // テーブル内の主キーに対応するオブジェクト ID は必須であり、0 に初期化する必要があります
public $name = '' // 名前、初期化する必要があります ;public $age = 0 //年齢、初期化する必要があります ;public $email = '' // 初期化する必要があります ;}
// 注: 次のステートメントは、クラスの定義後に実行する必要があります。これでテーブルの作成作業が完了します。 // SinORM_ResetORM('User'); // この文は最初に一度だけ実行されます。実行後、User に対応するテーブルがデータベースに自動的に作成されます。
$user1 = new User() // オブジェクトを作成します $user1->名前 = 'TRB'; $user1->年齢 = 22; $user1->email = 'trbbadboy@qq.com'; SinORM_SaveObject($user1); // オブジェクトをデータベースに保存します
//保存後自動でIDが付与されます $id = $user1->id; $id '
$user2 = SinORM_GetObject('User', $id) // ID によってデータベースからオブジェクトを作成します echo $user2->name '
$user1->name = 'trb' // 変更します ;SinORM_Update($user1) // データベースを更新します
$user3 = SinORM_GetObject('User', $id) // もう一度読みます ;echo $user3->name ' ?>
|
http://www.bkjia.com/PHPjc/1017846.html