SELECT

 $sql = 'select num, str from t1 where num > ?';
 $sth = $dbh->prepare($sql);
 $sth->execute(2);
 while ($row = $sth->fetchrow_hashref()){
     print $row->{num},"\n";
     print $row->{str},"\n";
 }
 die $sth->errstr if $sth->err;
  • fetchrow_xxx()が途中でエラーを起こした場合、返値がundefなためwhile()ループを抜ける。
  • 全行走査できたのかエラーだったのか調べるためには、
  • $sth->errを使うか、
  • RaiseErrorで例外をキャッチする。

1行をハッシュで取得

 $hash_ref = $dbh->selectrow_hashref( 'SELECT * FROM user WHERE id = ? AND passwd = ?', {}, ( $id, $passwd ) );

全行をハッシュの配列で取得

 $arr_ref = $dbh->selectall_arrayref( 'SELECT * FROM user ORDER BY id', {Columns=>{}} );

必ず{Columns=>{}}を付ける。詳しくは、http://blog.scrapcode.net/article/598613.html

1行ずつ取得

 @row_ary  = $sth->fetchrow_array; 
 $ary_ref  = $sth->fetchrow_arrayref; # $sth->fetchと書いても同じ
 $hash_ref = $sth->fetchrow_hashref;  # fetchrow_hashref('NAME_uc')とするとカラム名が大文字になる

まとめて取得

 $ary_ref = $sth->fetchall_arrayref;
 $ary_ref = $sth->fetchall_arrayref([0]);                # 各行の先頭のカラムだけ取り出す
 $ary_ref = $sth->fetchall_arrayref([-2,-1]);            # 各行の一番後ろとその直前の列
 $ary_ref = $sth->fetchall_arrayref({});                 # 各行をハッシュリファレンスとして取り出す
 $ary_ref = $sth->fetchall_arrayref({ foo=>1, bar=>1 }); # 各行のfooとbarというカラムだけ

プライマリキーをハッシュのキーにして取得

 $sth = $dbh->prepare("SELECT id, name FROM table");
 $sth->execute;
 $hash_ref = $sth->fetchall_hashref('id');
 print "Name for id 42 is $hash_ref->{42}->{name}\n";
 $sth = $dbh->prepare("SELECT foo, bar, baz FROM table");
 $sth->execute;
 $hash_ref = $sth->fetchall_hashref( [ qw(foo bar) ] );
 print "For foo 42 and bar 38, baz is $hash_ref->{42}->{38}->{baz}\n";

prepare()とexecute()とfetchXXX()をまとめて行う

 $ref = $dbh->selectrow_array($sql,undef,(3));         # (3)はプレースホルダに渡す値
 $rows = $dbh->selectall_arrayref($sql, {Slice => {}});
 $ref = $dbh->selectall_hashref($sql,'num',undef,(3));

高速なSELECT

fetchrow_arrayrefとbind_columnsを使う。

 $sth->bind_columns(\($num, $str));
 while ($row = $sth->fetchrow_arrayref){
     print "$num,$str\n";
 }

影響した行数

$sth->rowsはすべてfetchし終わった後しか使えない。よって、あらかじめ行数を得るにはSELECT COUNT(*)を使う。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS