• ベストアンサー

DBIを使ってのデータの取り出しについて

自分で作ったmysqlからデータを参照し様として #!/usr/bin/perl print "Content-type: text/html \n\n"; use DBI; #######DBIパス編集########## $DB='****' $DBusr='****' $DBpass='****' $DBtable='****' #########DBI操作############ $FIND = "SELECT a,b,c,d,e,f,g,h,i FROM $DBtable WHERE a=\'****\' limit 1"; $dbh = DBI->connect($DB,$DBusr,$DBpass); $serch = $dbh->prepare($FIND); $serch->execute; $serch = $serch->fetch; #######取り出したデータを配列に代入######## $r = 0; while( @rows = $serch->fetchrow_array ) { for( $f = 0; $f < $serch->{NUM_OF_FIELDS}; $f++ ) { $data{$serch->{NAME_lc}->[$f]}{$r} = $rows[$f]; } $r++; } while( ($key, $val) = each %data ) { while( ($key2, $val2) = each %{$val} ) { $hash{$key} = $val2; } } $a = $hash{'a'}; $b = $hash{'b'}; $c = $hash{'c'}; $d = $hash{'d'}; $e = $hash{'e'}; $f = $hash{'f'}; $g = $hash{'g'}; $h = $hash{'h'}; ##########テスト用に表示############# print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=Shift_JIS\">"; print "<HTML><HEAD>"; print "<TITLE></TITLE>"; print "</HEAD>"; print "<BODY BGCOLOR=$bgc TEXT=\"$txtc\" LINK=\"$lic\">"; print "テスト:$bgc,$txtc,$lic,$button,$sight_name,$sight_tit,$bun1,$sex"; print "</BODY></HTML>"; と書いてるのですが、実行するとデータが取り出せません。 調べてみると while( @rows = $serch->fetchrow_array ) の部分でエラーが出ます。 Can't call method "fetchrow_array" on unblessed reference atと言われてしまうのですが、何か記述の仕方等何か間違ってる部分などあれば指摘お願い致します。 ちなみにデータベースへの接続等は出来ています。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> $serch = $serch->fetch; これは何をしようとしているのでしょう? 少なくともこれによって $serch はDBIオブジェクトでなくなるでしょうから、 >while( @rows = $serch->fetchrow_array ) { ここでインスタンスメソッドの fetchrow_arrayは 呼び出せなくて当然のような気がしますが。

tamanele
質問者

お礼

ありがとうございます!解決しました。 単純に間違えていただけでした…。

その他の回答 (1)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

$serch->fetch;と$serch->fetchrow_arrayを同時に実行しているのが問題では? 提示されたスクリプトの場合、$serch = $serch->fetch;の1行を削除するのが一番簡単かと。 あと、###取り出したデータを配列に代入###の部分が、ずいぶん複雑になっていますが、素直に$search->fetchrow_hashrefを使った方が自然な気がします。 カラム数を数えるための変数$rが用意してありますが、limit1にしてあるので、常に$r=1なので必要ないのでは?

tamanele
質問者

お礼

確かにそうですね。 Cを書いてた時のくせで繰り返し文で配列にいれると言うのがあたりまえになってしまってて…。 ありがとうございます。

関連するQ&A