DBIモジュールはPerlからデータベースにアクセスできるようにするための、データベースインターフェースで、特定のデータベースに依存しない部分をサポートします。
connect(データベースへの接続)
disconnect(データベースの切断)
prepare(実行のためのステートメントの準備)
execute(ステートメントの実行)
rows(直前のステートメントの影響を受けた行数を調べる)
fetchrow_array(ステートメントの結果から次の行を取り出す)
データベースに接続してデータベースへのハンドルを返します。返されたデータベースへのハンドルはその後のデータベース操作で使います。
$dbh = DBI->connect( data_source, username, password )
次はMySQL接続の例です。
$db = DBI->connect( 'DBI:mysql:books:localhost', $user, $passwd);
usernameとpasswordは、それぞれデータベースに接続するために必要なユーザー名とパスワードです。data_sourceには、接続先データベースを次のような書式で指定します(わかりにくいので上記のMySQLへの接続の例が参考になるかもしれません)。
dbi:DriverName:database_name dbi:DriverName:database_name@hostname:port dbi:DriverName:database=database_name;host=hostname;port=port
connectメソッドで返されたデータベースハンドルをデータベースから切断します。
$dbh->disconnect;
ステートメント(MySQLのクエリに相当する概念)は直ちに実行されるのではなく、「ステートメントの準備」という段階を経てその後の段階で実行されます。prepareメソッドは実行のための1つのステートメントを準備し、ステートメントハンドルオブジェクトを返します。
$sth = $dbh->prepare( $statement );
以下はMySQLでbookstblというテーブルの全レコードを取得するクエリを実行する際のステートメント準備の例です。
$sth = $db->prepare( "select * from bookstbl" );
prepareメソッドで返されたステートメントハンドルオブジェクトを使って、すでに準備されているステートメントを実行します。
$sth->execute;
直前のステートメントの影響を受けた行数を調べるにはステートメントハンドルオブジェクトのrowsメソッドを使います。このメソッドは行を返せない場合や不明な場合に-1を返します。
$rv = $sth->rows;
以下はMySQLでテーブルbookstblの行数を表示する例です。
$sth = $db->prepare("select * from bookstbl"); $sth->execute; $num_rows = $sth->rows; print "行数 = $num_rows\n";
ステートメントを実行した後、ステートメントの結果の行を取り出すにはステートメントハンドルオブジェクトのfetchrow_arrayメソッドを使います。 このメソッドは結果から1行取り出しそれを配列で返し、次の行に行を進めます。これ以上、行が無い場合、このメソッドはundefを返します。エラーが発生した場合にも、undefが返されますが、それを使ってエラーを判断すべきではありません。エラーの判断には$sth->err、またはRaiseErrorを使います。
@ary = $sth->fetchrow_array;
以下はMySQLでテーブルbookstblのすべての行を表示する例です。
$sth = $db->prepare( "select * from bookstbl" ); $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows 件\n"; for ( $i=0; $i< $num_rows; $i++ ) { @a = $sth->fetchrow_array; print "ID = $a[0], 書名 = $a[1] 著者 = $a[2] \n"; }