自転車旅行とWebサービス -12ページ目

自転車旅行とWebサービス

しがないSEが自転車旅行にかまけながら自前Webサービス作成を目指す

 
さて、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接続関連を共通部品化しときたいな・・・
あとエラーハンドリングもしっかりしないと後で死ぬ羽目になる・・・