さて、DBのインストールです。
数あるDBMSの中から選んだのはmySQL
選んだ理由は無料であること以外に特にないw
仕事ではORACLEばっかだけど有償が前提なのはいやだよねー
MySQL Community Serverをインストール・・・
っていつの間にかORACLE傘下になってるやないか・・・
そんなことはさておき、こいつをFullでインストール。
rootユーザーでログインし、ささっとDBとユーザーと簡単なテーブルを作成。
DBの構造は
DB【sato】→ユーザー(スキーマ)【sato】→テーブル【test_user_tb】(次の画像も参照)
こういう感じ。
つまり、私のPCの中にはsatoというDBがあり、その中にsatoスキーマがあり、そのにtest_user_tbテーブルがあるということ。
別にユーザーが違ってもシノニムを張れば別ユーザーのテーブルをつかえるし、
テーブルリンクを張ればDBが違うユーザーのテーブルもつかえる。
まあ今は考える必要はありませんがね・・・
とりあえずデータを入れる
なんかtestスキーマが見えてるが手が滑っただけなので気にしないでほしい。
そしてデータ登録時に普通に誤ってsuzukiのuser_idを3にするのを忘れた。
横着してテーブルにプライマリキーを設定していないことが原因でもある。
後で治しておこう。
ここまでできたら、APからデータの取得を試す。
まずはPPMからDBIをインストール。
あ、後でDBD-mysql(ドライバー)のインストールも忘れずに。
そしてこうやってDBからデータをとる↓
use DBI;
$dbh = DBI->connect('DBI:mysql:sato:127.0.0.1:3306','sato','sato')
or die "$!\n Error: failed to connect to DB.\n";
$sql = "SELECT "
. "user_name "
."FROM "
. "sato.test_user_tb "
."ORDER BY "
. "user_id";
$result = $dbh->selectall_arrayref($sql);
さらっと書いているが接続にはとても苦労した。
DBの名前やパスワードを晒すことができないとはいえ、
どのサイトも接続文字列の記述をhogeみたいに書くからだ。
一応解説すると、
connect('DBI:DBドライバー名:DB名:ホスト名:ポート番号','スキーマ名',パスワード')
となる。
ところで、DBドライバーを用いて接続しているが、この場合の接続の仕方はなんて言うんだろう?
ORACLEはネイティブ接続に対してODBC接続というが、これに倣うとMDBC接続と呼べばよいのか?
後、次の行の
or die "$!\n Error: failed to connect to DB.\n";
は必ず書くべき。
スクリプト言語の宿命か、接続に失敗してもそのまま突っ走ってしまい、
connectの行でエラーが出ないからだ。
具体的には
$dbh->selectall_arrayref($sql);
の行で[selectall_arrayref ガ定義サレテイマセン]というエラーメッセージが出る。
接続に失敗し、DBIインスタンスが生成されないからである。
私はここで「え~なんで~!?!? DBIインストールしたじゃーん!」となってしばらくハマってしまった。
そんなこんなでようやくテストページに表示。
#!"C:\Perl64\bin\perl.exe"
use DBI;
$dbh = DBI->connect('DBI:mysql:sato:127.0.0.1:3306','sato','sato')
or die "$!\n Error: failed to connect to DB.\n";
$sql = "SELECT "
. "user_name "
."FROM "
. "sato.test_user_tb "
."ORDER BY "
. "user_id";
$result = $dbh->selectall_arrayref($sql);
print "Content-Type: text/html; charset=UTF-8\n\n";
print '<html>';
print '<head>';
print '<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">';
print '<title>TEST</title>';
print '</head>';
print '<body>';
foreach $data(@{$result}){
print '<br>';
print $data;
}
$dbh->disconnect;
print '</body>';
print '</html>';
へあ!selectall_arrayrefのrefってそういうことか!
print $data;
改め
print $data->[$i];
と修正し、
うまく表示できましたとさ。
これで
HTTPリクエスト→Web→AP→DB
↓
HTTPリクエスト←Web←AP←DB
の流れが完成。
次にとりかかる前にDB接続関連を共通部品化しときたいな・・・
あとエラーハンドリングもしっかりしないと後で死ぬ羽目になる・・・
