PerlでMySQLのDBに接続するのはPHPよりもやや複雑な感じがしないでもないです。それは完全にオブジェクトちっくにコードを書いている風だからです。
簡単にその手順を説明すると、まずは、DBIという汎用モジュールを使用します。(時折、use DBI;の説明が「DBIを使用します」という説明に不毛さを感じます。)このモジュールはデータベース操作には欠かせないモジュールでこれ使わないで書くとなると至難の技。Perlは殆ど自分でコードを書かなくていいからかなりいいですね。
次にデータソースを定義します。これもかなり単純で、my $dsn = 'DBI:mysql:<DB名>:<ホスト名>'; MySQLを使用する場合は太字まではいつも同じ。それからDB名とホスト名を続けて書けばOKです。もちろんこれはソースの文字列ごと突っ込んでもいいので何も変数にいれる必要はありませんが、慣習的にスカラー変数に格納してしまいます。
当然ユーザー名とパスワードを定義しておきます。データベースソース、ユーザ名、パスワードはもう3つセットにして覚えます。
で、DBI->connectという有名なオブジェクトだかメソッドだか関数だかのパラメーターに先の3つセットを突っ込んでやるわけです。
DBI->connect($dsn, $user, $password, {RaiseError => 1, PrintError => 0, AutoCommit =>0});
RaiseError を ON にしておけば SQL 解析の prepare で勝手に die してくれる。これは文法チェックの何なので1にしておく方が断然いい。AutocommitはOFFにするのが基本で、世の中いちいちコミットするとつらくなるので適当に済ませて軽くしておくことが大切。(と村上春樹と河合隼雄はきっと思わない。)
文字コードを一応設定しておいて、それからSQL文を渡す。prepareというメソッドだかにSQL文を渡してやると、返り値にSQL文そのものが返ってきます。それを$sth->execute;で実行します。
その結果は、$sth->fetchrow_arrayというところにレコードが配列でどばっと即座に入ってくるので、取得したレコードの分だけwhileでどんどん出力してしまうという感じです。Perlの基本は、レコードをwhileで単発連続処理(メモリ食わない)で、レコードは整理整頓しやすいように、配列へということになっています。間違っても多次元配列なんて使わないこと。メモリ食いまくってウン万件という数になってくると急激に実効速度が遅くなること間違いなしです。
最後に礼儀としてデータベース切断します。
簡単にその手順を説明すると、まずは、DBIという汎用モジュールを使用します。(時折、use DBI;の説明が「DBIを使用します」という説明に不毛さを感じます。)このモジュールはデータベース操作には欠かせないモジュールでこれ使わないで書くとなると至難の技。Perlは殆ど自分でコードを書かなくていいからかなりいいですね。
次にデータソースを定義します。これもかなり単純で、my $dsn = 'DBI:mysql:<DB名>:<ホスト名>'; MySQLを使用する場合は太字まではいつも同じ。それからDB名とホスト名を続けて書けばOKです。もちろんこれはソースの文字列ごと突っ込んでもいいので何も変数にいれる必要はありませんが、慣習的にスカラー変数に格納してしまいます。
当然ユーザー名とパスワードを定義しておきます。データベースソース、ユーザ名、パスワードはもう3つセットにして覚えます。
で、DBI->connectという有名なオブジェクトだかメソッドだか関数だかのパラメーターに先の3つセットを突っ込んでやるわけです。
DBI->connect($dsn, $user, $password, {RaiseError => 1, PrintError => 0, AutoCommit =>0});
RaiseError を ON にしておけば SQL 解析の prepare で勝手に die してくれる。これは文法チェックの何なので1にしておく方が断然いい。AutocommitはOFFにするのが基本で、世の中いちいちコミットするとつらくなるので適当に済ませて軽くしておくことが大切。(と村上春樹と河合隼雄はきっと思わない。)
文字コードを一応設定しておいて、それからSQL文を渡す。prepareというメソッドだかにSQL文を渡してやると、返り値にSQL文そのものが返ってきます。それを$sth->execute;で実行します。
その結果は、$sth->fetchrow_arrayというところにレコードが配列でどばっと即座に入ってくるので、取得したレコードの分だけwhileでどんどん出力してしまうという感じです。Perlの基本は、レコードをwhileで単発連続処理(メモリ食わない)で、レコードは整理整頓しやすいように、配列へということになっています。間違っても多次元配列なんて使わないこと。メモリ食いまくってウン万件という数になってくると急激に実効速度が遅くなること間違いなしです。
最後に礼儀としてデータベース切断します。
#!/usr/bin/perl
# DBI モジュールの読み込み
use DBI;
#データソースには、先頭にDBI 、次にDBMS名(MySQLやOracleなど)、データベース名、ホスト名、ポート名をコロン( : )で区切って指定します。ポートは省略可
my $dsn = 'DBI:mysql:test_db:localhost';
# ユーザ名
my $user = 'user';
# パスワード
my $password = 'password';
# データベースへ接続
$dbh = DBI->connect($dsn, $user, $password, {RaiseError => 1, AutoCommit => 0});
#文字コード設定
$dbh->do("set names utf8");
# prepareが成功した場合、ステートメントハンドルが返される
my $sth = $dbh->prepare("select entry_text from mt_entry where entry_id=1112");
# SQL文の実行
$sth->execute;
# データの取得と出力
print "Content-type: text/html\n\n";
while(@row = $sth->fetchrow_array) {
print "@row\n";
}
#データベース切断
$dbh->disconnect;



