【perl】データベースを参照してデータ数をカウントする。

モジュールをインストールして、さっそくプログラミングしてみた。開発環境は以下。
windowsXP
・xampp
・active perl


実際のコードは以下。詳しい説明は、コード以降に。

#! /usr/bin/perl

use strict;
use DBI;
use DBD::mysql;

print "Content-Type: text/html; \n\n";

my $user = 'root';
my $passwd = '●●●';
my $dbh = DBI->connect('DBI:mysql:practice1:localhost', $user, $passwd);


my $sth = $dbh->prepare('SELECT COUNT(*) FROM test');
$sth->execute;


while(my @rec = $sth->fetchrow_array){
	print join(',', @rec)."\n";
}

$sth->finish;
$dbh->disconnect;


以下、解説。

use strict;

この一行を入れると、コマンドプロンプトなどのシェルで実行したときにエラーを表示してくれます。例えば、変数を宣言し忘れているときなんか(新しく変数を使うときにmyをつけていないと指摘されます)。

use DBI;
use DBD::mysql;

DBIとDBD::mysql、2つのモジュールの使用を宣言。

print "Content-Type: text/html; \n\n";

ヘッダ。perlのプログラムを実行して何か結果をブラウザ表示させる時は、必ずこのヘッダが必要です。挿入場所は、ブラウザ表示させるコードの前なら、どこに入れても可。
ブラウザに表示させる結果の中に日本語が含まれていたら、charsetの指示もする以下のものを使用する。(今回は、データの数だけ表示させるので上記のものを使用。)

print "Content-Type: text/html; charset = Shift_JIS \n\n";

※「\n\n」の部分で、ヘッダですよ、と宣言している。このヘッダより上記にあるprint文は、ブラウザには表示されない。

my $user = 'root';
my $passwd = '●●●';
my $dbh = DBI->connect('DBI:mysql:practice1:localhost', $user, $passwd);

DB接続を行っている。connectは、DBIクラスメソッドでデーターベースサーバーとの接続を行うメソッド。
書式は、

$dbh = DBI->connect(データソース, ユーザー名, パスワード);

上記のソースのように、$userや$passwd等の変数を宣言してユーザー名とパスワードを入れてからconnectに代入する方法をとってもよいが、宣言せずにconnectに直接入れても可。パスワードの設定をしていないときは、パスワードを省略。
データソースの書き方は、

DBI::mysql:データベース名:ホスト名

データベース名やホスト名は、mySQLadminを起動させ、「特権」をクリックすると確認できる。

my $sth = $dbh->prepare('SELECT COUNT(*) FROM test');
$sth->execute;

$dbh(データベースハンドルメソッド)であるprerareを使用してSQL文の設定を行い、$sth(ステートメントハンドルメソッド)であるexecuteで設定したSQL文を実行している。
prerareの書式は以下。

$sth = $dbh->prepare(SQL文);
while(my @rec = $sth->fetchrow_array){
	print join(',', @rec)."\n";
}

$sth(ステートメントハンドルメソッド)であるfetchrow_arrayを利用して、行データを項目の配列として1行ずつ取り出す作業を、データの数と等しい回数while文でループさせる。1行ずつ配列として取り出して、配列recに入れている。

$sth->finish;
$dbh->disconnect;

今回使ったSQL文をfinishで破棄し、disconnectでデータベースとの接続を切断。


新しいモジュールを使うときは、メソッドの確認や使い方の概要の確認にまだ時間がかかります。新しいモジュールでも、もっと早く使えるようになれるといいなー。


次は、htmlでログイン画面を作ってDBにあるデータと照合し、判定させるプログラムを作りたい。あと、別件でクローラーも作りたい。