ホームページ  >  記事  >  バックエンド開発  >  MySQL データベースに基づいてオブジェクト永続層を実装する PHP メソッド_PHP チュートリアル

MySQL データベースに基づいてオブジェクト永続層を実装する PHP メソッド_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:50:271119ブラウズ

PHPによるMySQLデータベースをベースとしたオブジェクト永続化層の実装方法

この記事では、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 '
';

?>

この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。

http://www.bkjia.com/PHPjc/1017846.html

本当http://www.bkjia.com/PHPjc/1017846.html技術記事 MySQL データベースに基づいてオブジェクト永続層を実装する PHP の方法 この記事では、MySQL データベースに基づいてオブジェクト永続層を実装する PHP の方法について説明します。皆さんの参考に共有してください。詳細は以下の通りです: ハート...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。