-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdb.html
114 lines (113 loc) · 4.62 KB
/
db.html
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
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Ethnamドキュメント</title>
<link href="css/style.css" media="all" rel="stylesheet" />
<link href="css/github.css" media="all" rel="stylesheet" />
</head>
<body>
<p><a href=".">目次</a></p>
<div class="blob instapaper_body">
<article class="markdown-body entry-content">
<h1>データベースアクセス</h1>
<ul>
<li>一番簡単なやり方(PEAR::DBを使う) </li>
<li>PEAR::DB 以外のDBアクセスライブラリを使う </li>
<li>複数のDBオブジェクトを扱う場合 </li>
<li>リードオンリーのDBを複数台設定したい場合 </li>
<li>AppManager内でのDBオブジェクトの使用方法 </li>
</ul>
<h2>データベースアクセス</h2>
<p>この部分、Randolph@IRCが、fujimotoさんに頂いたメールを元にして書いてます。</p>
<h3>一番簡単なやり方(PEAR::DBを使う)</h3>
<ol>
<li>
<p>etc/[appid]-ini.phpにdsn定義を行う。</p>
<p>$config = array(
'debug' => false,
'dsn' => 'mysql://user:pass@unix+localhost/dbname',
);</p>
</li>
<li>
<p>Ethna_Backend::getDBメソッドを利用してDBオブジェクトを取り出す。</p>
<p>function perform()
{
$db =& $this->backend->getDB();
// ...
return 'index';
}</p>
</li>
</ol>
<p>Ethnaの デフォルトの DB接続クラス( <a href="doc/Ethna/Ethna_DB_PEAR.html">Ethna_DB_PEAR</a>) はPEAR::DBを継承しているので、</p>
<pre><code>$sql = "SELECT id FROM test";
$result =& $db->query($sql);
$i = 0;
while ($data[$i] = $result->fetchRow()) {
$i++;
}</code></pre>
<p>こんな感じでQueryを実行して、データ取得。</p>
<h3>PEAR::DB 以外のDBアクセスライブラリを使う</h3>
<p>Ethna では、デフォルトの PEAR::DB の他に、 <a href="http://adodb.sourceforge.net/">ADODB</a> 及び <a href="http://creole.phpdb.org/trac/">Creole</a> の クラスが同梱されています。</p>
<p>それぞれのライブラリをインストールしてあれば、あとはちょっとした変更を加えるだけで、上記の PEAR::DB とほぼ同じように利用することができます。</p>
<p>ADODB についての詳細は、下記をご覧下さい。</p>
<p><em>see also:</em> <a href="adodb.html">ADODB を Ethna で使う</a></p>
<h3>複数のDBオブジェクトを扱う場合</h3>
<ol>
<li>
<p>iniファイルに「dsn_(接続名)」でエントリを追加</p>
<p>'dsn_r' => 'mysql://user:pass@unix+localhost/dbname',</p>
</li>
<li>
<p>[appid]_Controller.phpに</p>
<p>/**</p>
<ul>
<li>@var array DBアクセス定義
*/
var $db = array(
'' => DB_TYPE_RW,
);</li>
</ul>
</li>
</ol>
<p>って部分があるので、ここに使いたいDBオブジェクト名を追加。</p>
<pre><code>/**
* @var array DBアクセス定義
*/
var $db = array(
'' => DB_TYPE_RW,
'r' => DB_TYPE_RO, // READ ONLY
);</code></pre>
<ol>
<li>
<p>DBオブジェクト作成時に接続名を指定する。</p>
<p>// 今までどおりのDB接続
$db =& $this->backend->getDB();
// SELECT専用のDB接続
$db_r =& $this->backend->getDB('r'); // 引数が「r」になっている。</p>
</li>
</ol>
<h3>リードオンリーのDBを複数台設定したい場合</h3>
<pre><code>'dsn_r' => array(
'mysql://user:pass@unix+localhost/dbname1',
'mysql://user:pass@unix+localhost/dbname2',
);</code></pre>
<p>上記のように、array形式で指定します。</p>
<pre><code>$db_r =& $this->backend->getDB('r'); // 引数が「r」になっている。</code></pre>
<p>ランダムで、dbname1とdbname2を割り振ってくれます。</p>
<h3>AppManager内でのDBオブジェクトの使用方法</h3>
<p>Ethna_AppManagerのコンストラクタにより、既にDBオブジェクトは 取得されていますので、下記の様に操作する事が可能です。</p>
<pre><code>$this->db->query("SELECT id FROM test");
// 上記「複数のDBオブジェクトを扱う場合」の(1)を行った場合の例
$this->db_r->query("SELECT id FROM test");</code></pre>
<p>なお、上記方法で取得できるクラスはEthna_DB_PEARクラスです。 prepared statementなど、PEAR_DBの機能をフルに使うには、Ethna_DB_PEARクラスのメンバに直接アクセスする必要があります。</p>
<pre><code>$sql = "SELECT id FROM test WHERE id = ?";
$data = array($id);
$stmt =& $this->db->db->prepare($sql);
$res =& $this->db->db->execute($stmt, $data);</code></pre> </article>
</div>
<div class="site-footer">
@2015 <a href="https://twitter.com/DQNEO">DQNEO</a>
</div>
</body>
</html>