DBI/DBDは、データベースにアクセスするための手段と、データベースの種類に依存しないインターフェイスを提供します。
DBI(データベース・インタフェイス)モジュールとDBD(データベース・ドライバ)モジュールからできており、DBDモジュールは各データベースごとに存在します。プログラマは、DBIモジュールのルールにしたがってプログラミングすることで、どのデータベースにも同じ方法で操作することができます。
データベースに接続するには、最初にDBIモジュールを読み込みます。
# DBI モジュールの読み込み use DBI;
次にDBIモジュールのconnectメソッドを使ってデータベースに接続します。
connectメソッドは、[データソース]、[ユーザ名]、[パスワード]の引数を受け取り、データベースハンドルオブジェクトへのリファレンスを返します。
データソースは、[DBI]:[DBMS名]:[データベース名]:[ホスト名]:[ポート名]で指定します。(ホスト名とポート番号は省略可。)
# データソース $dsn ='DBI:mysql:dbname:www:3306'; # ユーザ名 $user = 'dbuser'; # パスワード $password = 'dbpass'; # データベースへ接続 $dbh = DBI->connect($dsn, $user, $password);
# オプション指定 $dbh = DBI->connect($dsn, $user, $password,{ RaiseError => 1, AutoCommit => 0 });
データベースハンドルのprepareメソッドでステートメント(SQL文)を実行できるように準備(prepare)します。
prepareメソッドは、ステートメントハンドルオブジェクトへのリファレンスを返します。ステートメントハンドルはステートメントの属性を取得したり、executeメソッドを起動するために使用できます。prepareを使うとexecuteの実行速度が向上します(ただし、MySQLでは単にSQL文を保存するだけです)。
prepareだけでは何も起こりません。準備されたステートメントを実行(execute)することでSQLが実行されます。このとき、SQLの最後にセミコロンをつける必要はありません。
# $statement 実行したいSQL文 # $dbh connect済みのデータベースハンドル # \%attr メソッドに渡される属性値のハッシュのリファレンス $sth = $dbh->prepare($statement) || die $dbh->errstr; $sth = $dbh->prepare($statement, \%attr) || die $dbh->errstr;
このメソッドはプレースホルダが使えます。
準備(prepare)されたステートメントハンドルに対して、実行(execute)することでそのSQLが実行されます。
executeメソッドは、正常に実行された場合、trueを返し、エラーの場合はundefを返します。
# $sth prepareされたステートメントハンドル $rv = $sth->execute || die $sth->errstr;
prepareでプレースホルダを使用した場合、executeに引数@bind_valuesを指定するとそのステートメントを実行する前にbind_paramが呼び出されます。このようにして結び付けられた値は、SQL_VARCHARタイプとして扱われます(文字列のクォート等の必要はありません)。
# $sth prepareされたステートメントハンドル # @bind_values バインド値 $statement = insert into table (id, name, age) values (?, ?, ?); $sth = $dbh->prepare($statement); $rv = $sth->execute(@bind_values) || die $sth->errstr;
executeされたステートメントハンドル(select文)に対して、fetchメソッドを発行することで、1レコードずつデータを取り出すことができます。
fetchメソッドは、データの次の行を取り出し、フィールドの値をもった配列へのリファレンスを返します。
NULL値はundefで返されます。
$sth->bind_columnsを使っていれば、これがデータを取り出すもっとも早い方法です。
取り出せる列がないか、エラーが発生すると、undefを返します(後で$sth->errをチェックするか、RaiseErrorを使ってください)。
# $sth prepareされたステートメントハンドル $sth->execute; while( my $ref = $sth->fetch ){ print $ref,"\n"; }
データベースとの接続を破棄します。通常、プログラムの終了時に実行されます。
# $dbh connect済みのデータベースハンドル $rc = $dbh->disconnect;
投稿日: