• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列に入った変数を二度使いたい)

perlでDBデータをセレクトし表示させるプログラムで二度目の表示ができない

moon_nightの回答

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

DBから直接処理した配列は一回使用すると消えてしまうみたいですねー。 もう一回Selectするか、 一回目のforの時に別の配列に入れるしかないのかもしれないです。

関連するQ&A

  • SQLが応答しなくなっているのか、CGIが読み込み中のままになってしまいます。

    SQLを約1600回実行したら、5秒後にページを再読み込みします。 print "<html><body onload=\"setTimeout('location.reload()',5000)\">"; foreach ... {   ...   # 約1600回繰り返す   @result = select("SQL文");   ... } sub select{   my @result = ();   my($dbh, $sth);   $dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;   $sth = $dbh->prepare("$_[0]");   $sth -> execute() or return 0;   $num_rows = $sth->rows;   $num_of_fields = $sth->{NUM_OF_FIELDS};   $result[0] = $sth->rows;   for ($i=1; $i<=$num_rows; $i++) {     @fetchrow_array = $sth->fetchrow_array;     $result[$i] = join ',', @fetchrow_array   }   $sth -> finish();   $dbh -> disconnect();   return @result; } 最初の1,2回は期待通りに動くのですが、 2,3回ほど再読み込みをすると、「読み込み中」のままになってしまいます。 (期待通りに動く場合、1回の読み込みは20秒程度です。) タスクマネージャを見ると、 期待通りに動いているときは、CPU使用率が60%くらいになっていますが、 「読み込み中」のままの時は1%程度になっています。 SQLサーバーから応答がなくなっているのでしょうか? (簡単なSQLにしてみても同じでした。) 原因がわかる方、よろしくお願いします。 WindowsXP SP2 Apache1.3 ActivePerl5.6 MySQL3.23

    • ベストアンサー
    • CGI
  • 検索結果テーブルの背景色を変更したい

    質問があります。 以下のようにperlで検索結果を表示させているのですが、<td>の背景色を変えたいのです。 ところがbgcolorタグを挿入するとinternal server error を起こしてしまいます。 以下のようなループのなかにbgcolorタグを挿入するのは無理なのでしょうか? perl初心者なもので単純な質問かもしれませんが教えていただけたらと思います。 よろしくお願いします。 ちなみに結果は正常に表示されます。 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; print "<tr>\n"; print "<td>" . $ar[0] . "</td>\n"; print "<td>" . $ar[1] . "</td>\n"; print "<td>" . $ar[2] . "</td>\n"; print "<td>" . $ar[3] . "</td>\n"; print "<td>" . $ar[4] . "</td>\n"; print "<td>" . $ar[5] . "</td>\n"; print "</tr>\n"; }

    • ベストアンサー
    • Perl
  • データベースから取得したデータを配列に格納

    データベースから取得したデータを配列に格納することができません。 唯一、以下の方法で格納できたのですが、この場合データベースの項目の数が、あらかじめ分かっている場合にしか使用できません。googleで検索して出てくるサンプルは全てループ内でprintしているので参考になりませんでした。 やりたいことは単純で、データベースにクエリーを発行した結果の複数レコードをそのまま配列に格納することです。perlに詳しい方がおられましたらよろしくお願いします。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ■データベース内のデータ id=1,subid=1,data1=aaa id=1,subid=2,data1=bbb id=1,subid=3,data1=ccc ■期待する結果 @result = ("1","1","aaa", "1","2","bbb", "1","3","ccc", ) _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ■実際のソース ********************************************************** use DBI; #//■DB接続 $db = DBI->connect("DBI:mysql:$DbName:$DbHost", $DbUser, $DbPass); $sth = $db->prepare($sql); $sth->execute; $cnt = $sth->rows; for($i=0; $i<$cnt; $i++){ @work = $sth->fetchrow_array; @result[$i] = ([$work[0],$work[1],$work[2],]); } #//■CLOSE $sth->finish; $db->disconnect; for($i=0; $i<$cnt; $i++){ print "<p>".$result[$i][0]."/".$result[$i][1]."/".$result[$i][2]."</p>\n"; } **********************************************************

    • ベストアンサー
    • Perl
  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • Perl
  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • CGIでマイSQLからデータを取得できない。

    Perl初心者です。レンタールサーバでmysqlからデータを取得して表示するプログラムを作りたいのですインターネットで捜したのですがよく分かりませんでした。申し訳ありませんが駄目出しでも結構ですので直すポイントになるようなアドバイス、お願い致します。 #!/usr/bin/perl #変数宣言 print "Content-type: text/html;\n\n"; use DBI; $ds = 'DBI:mysql:XXXXXXXXXXX:localhost'; $user = 'XXXXXXXXXX'; $pass = 'XXXXXXXXXX'; print "test<br>\n"; $db = DBI->connect($ds, $user, $pass) || die "Got error $DBI::errstr when connecting to $ds\n"; print "test<br>\n"; #$sth = $db->prepare("SELECT mei FROM name"); #$sth->execute; # バス経路票の中身を表示したかったたのですが出来ませんでした。 $sth= $db->prepare(qq(SELECT * FROM 'バス経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 経路票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '駅バス停関係票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # バス経路票の中身を表示したかったたのですが出来ませんでした。 print "@basskeiro<br>\n"; # 経路票の中身を表示したかったたのですが出来ませんでした。 print "@keiro<br>\n"; # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 print "@bassteikeiro<br>\n"; print "test<br>\n"; $rc = $sth->finish; $rc = $db->disconnect; exit;

    • ベストアンサー
    • Perl
  • MySQLを使って値を引っ張ってきているのですが、1つしかとってこれません。

    HPを作っている者です。 perlとMySQLを使ってデータをHPに表示させているのですが、下記のような方式でデータを取出した場合に問題がおきました。  掲示板を作成しています。 Aテーブルから掲示されたデータを取ってくる際に、一覧表示させました。 一覧表示から「詳細」をクリックすると詳細掲示と詳細掲示に対して意見を述べる書込みが表示されています。(意見の述べる所はBテーブルから引っ張ってきています。)  一番最初に記述したとおりAテーブルから掲示されたデータを取出して一覧表示する際に、個々の掲示情報に「意見を述べる書込み」Bテーブルが何件あるのかも表現しようと思ったのですが、値を表示することもできず、あげくのはてに一覧表示どころか1番目のデータしかとってこなくなり、後のでーたは空白表示されるようになってしまいました。 どうかどんな情報でも良いのでアドバイスをいただけないでしょうか?お願いします。 ソース開始---------------------------------- *ここにAテーブルからデータを取ってくる処理をしています。(省略) ###$num件分処理を繰り返す(一覧) for ($i=0; $i<$num; $i++) { ###データを吐き出す @buffer = $Com::sth->fetchrow_array; ###Bテーブルの件数を吐き出す $COUNT=qq{SELECT count(*) }; $COUNT.=qq{FROM Atable,Btable }; $COUNT.=qq{WHERE Atable.A = Btable.B}; &Com::DB_ExecuteNofinish($COUNT,$err); @Kakikomi = $Com::sth->fetchrow_array; $Com::sth->finish; *ここにAテーブルのデータとBテーブルのデータを引き出したHTMLが表示されます。 一覧表示(省略)

  • fetchrow_arrayとfetchrow_hashrefの使い方

    Jやまとです。 PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。 (1)fetchrow_array使用 (2)fetchrow_hashref使用 以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。 原因が全く分かりません。 分かる方いらしゃいましたら、ご教授願います。 OS:TurboLinux6.2 DB:Oracle8i Apache,PerlはTurboLinux6.2に入っているものをそのまま使用 以下、ソースを記載します。 --------------- (1)fetchrow_arrayを使用して行の値を取得(こっちは動く) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $sql = "SELECT SYSDATE FROM DUAL \n"; $sth = $dbh->prepare( $sql ); $sth->execute or die "Cannot execute. " . $sth->errstr(); $cnt1 =1; while (@row = $sth->fetchrow_array()) { @{$get_date[$cnt1]} = @row; $cnt1++; } --------------- (2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $query = qq{ SELECT SYSDATE FROM DUAL }; $sth = dbh->prepare($query); $sth->execute(); # 実行 if($sth->rows() != 1){ # 該当する行数 # エラー処理 } $rhash = $sth->fetchrow_hashref(); %hash = {%{$rhash}}; $sth->finish(); $get_date = $hash{SYSDATE}; --------------- (2)実行時のerror_log Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30. Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi --------------- (本文長くてすみません)

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl