フェッチでデータが上書きされる問題について

このQ&Aのポイント
  • perl + html + mysqlのコーディングで、複数フィールド+複数件のデータをテーブルから取得するためのSELECT文で、フェッチでデータが上書きされる問題が発生しています。
  • フェッチで取得したデータを配列に格納する段階で、上書きが発生しているため、表示されるデータが3件とも最後のデータになってしまっています。
  • 具体的にどこが上書きされているのかがわからず、問題を解決できません。ご教授いただけないでしょうか?
回答を見る
  • ベストアンサー

フェッチでデータが上書きされます

こんにちは。perl + html + mysqlのコーディングで悩んでいるので質問させてください。 複数フィールド+複数件(例えば13フィールド+3件)のデータがテーブルに存在する時、SELECT文でそのデータを取得したいとします。 分からない所はフェッチの部分なのですが、 $i=0; while($selectdata[$i]=$sth->fetchrow_arrayref( $i++; } ----[中略]----- for($i=0;$i<$rows;$i++){ print "[SELECTデータ->$i]\n"; for($j=0;$j<13;$j++){ print "$selectdata[$i][$j]\n"; } print "<BR>\n"; } 表示されたデータが3件とも、3番目のデータが表示されます。 フェッチで取得したデータを配列にいれる段階で、上書きしているような気がするのですが、具体的にどこが悪いか分かりません。 ご教授お願いいたします。

  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

いや、 >$i=0; >while($selectdata[$i]=$sth->fetchrow_arrayref( >$i++; >} これを my @selectdata; while ( my $array_ref = $sth->fetchrow_arrayref ) { push @selectdata, [ @{$array_ref} ]; } みたいな感じで受け取ったリファレンスを一旦デリファレンスして、 その要素を含む新しい無名配列を生成すれば良いと思いますけど。

cup_10
質問者

お礼

返信ありがとうございます。 デリファレンス⇒無名配列でうまくできました。

その他の回答 (1)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

多分、 $sth->fetchrow_arrayref で取得した配列のリファレンスは全て同じだからだと思いますよ。多分。

cup_10
質問者

補足

返信ありがとうございます。 すると、通常perlを使用してデータのフェッチを行った後、 配列へデータの保存はできないのでしょうか。

関連するQ&A

  • データベースから取得したデータを配列に格納

    データベースから取得したデータを配列に格納することができません。 唯一、以下の方法で格納できたのですが、この場合データベースの項目の数が、あらかじめ分かっている場合にしか使用できません。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
  • 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
  • DB検索の結果について

    PerlでDB検索をし、結果を画面に表示させるというプログラムを作成しているのですが、なぜか検索結果が1件の時は結果の表示がされないという現象が起こっています。複数件の時は、表示されるのですが。 プログラムは下記のようなものです。 ●入力画面から検索する文字列($name)を取得します。 #my $sql = "SELECT AAA FROM PRODUCT WHERE XXX '%$name%'"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ●一致したデータを書き出します。 print "検索製品は、$name<P>"; while(@results = $sth->fetchrow) { @results = $sth->fetchrow; print @results, "\n<P>"; print $count, " 件完了<P>"; $count++; } print "合計 $count 件、見つかりました!"; <一件の結果> 検索製品は、12345で 1 件見つかりました! <複数件の結果> 検索製品は、12345で 12345製品A 件完了 12345製品B 2件完了 12345製品C 3件完了 12345製品D 4 件見つかりました! 上記のような結果です。検索結果1件の時はデータが表示されず、2件以上の時も表示件数、合計件数は合っていますが、$countの動作がおかしいです。("件完了"になってしまう) コードの記述の仕方に問題があるのでしょうか?おわかりの方がいらっしゃいましたら、ご教授頂けると幸いです。宜しくお願い致します。

  • 配列データの受け取り

    下記配列を受け取ることが出来ません。 エラーになります。 受け取り側にARRAY[0],ARRAY[1]と 表示されます。 実際は送信側のinputboxに入力した値を 受け取り側で表示させたいのですが・・・ おかしい箇所ご指摘いただけないでしょうか? それとも、PHPでは出来ないことなのでしょうか? //送信側 <html> <head><title>session.html</title></head> <body> 請求書 <form action="teke.php" method="post"> <table border="1"> <tr align="center"> <td>月</td> <td>日</td> <td>明細</td> <td>単価</td> <td>数量</td> <td>金額</td> </tr> <?php for($q=0;$q<10;$q++){ print"<tr>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($i=1; $i<13; $i++){ print"<option value=$i>$i</option>\n"; } print"</select>"; print"</td>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($j=1; $j<32; $j++){ print"<option value=$j>$j</option>\n"; } print"</select>"; print"</td>"; for($o=0;$o<4;$o++){ print"<td><input type='text'name='".$data[$q][$o]."'></td>"; } print"</tr>"; } ?> </table> <input type="submit" value="登録"> </body> </html> //受け取り側 <html> <head><title>session.html</title></head> <body> 請求書 <table border="1"> <tr align="center"> <td>月</td> <td>日</td> <td>明細</td> <td>単価</td> <td>数量</td> <td>金額</td> </tr> <?php for($q=0;$q<10;$q++){ print"<tr>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($i=1; $i<13; $i++){ print"<option value=$i>$i</option>\n"; } print"</select>"; print"</td>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($j=1; $j<32; $j++){ print"<option value=$j>$j</option>\n"; } print"</select>"; print"</td>"; for($o=0;$o<4;$o++){ $data[$q][$o]=$_POST["$data[q][o]"]; $_SESSION["$data[q][o]"].=$_POST["data[$q][$o]"]; print"<td>$data[$q][$o]</td>"; } print"</tr>"; } ?> </table> <input type="submit" value="登録"> </body> </html>

    • 締切済み
    • PHP
  • 配列に入った変数を二度使いたい

    perlでDBデータをセレクトし表示させるプログラムで 以下のように一回目のforループでは正常に表示されます。 二度目に表示させようとすると何もデータがなくなっているようです。 print でも、もちろんなにも表示しません。 配列名を変えてもだめでした。とこが原因なのかわかりません。 ステートメントハンドルとかが関係あるのでしょうか? いろいろ調べたのですが、ちょっとわかりませんでした。 申し訳ないのですが、教えてください。 話をまとめるとDBからセレクトした同じ行のデータを2回表示させたいということです。 よろしくお願いします。 my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS); my $sth=$db->prepare(" select * from server where no = $no "); $sth->execute; #一回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; #二回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array;

    • ベストアンサー
    • 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
  • QNo.3258883データベースから取得したデータを配列に格納(解決)

    何か、ここの質問掲示板は自己レスが出来ないシステムらしいので(自己解決は放置推奨?)、同じような問題で躓く方のためにここに質問内容と解決方法を記述しておきます。 ■環境 サーバ:Apache 言語 :Perl DB :MySql ■質問内容 データベースから取得したデータを配列に格納することができません。 唯一、以下の方法で格納できたのですが、この場合データベースの項目の数が、あらかじめ分かっている場合にしか使用できません。googleで検索して出てくるサンプルは全てループ内でprintしているので参考になりませんでした。 やりたいことは単純で、データベースにクエリーを発行した結果の複数レコードをそのまま配列に格納することです。perlに詳しい方がおられましたらよろしくお願いします。 ■解決方法 #以下の一行を @result[$i] = ([$work[0],$work[1],$work[2],]); #以下に変更 push @result, [@work]; ※但し、実行速度などのパフォーマンスまでは実験していません。取得するレコード数が多くなった場合のパフォーマンスの低下など考慮が必要なことがあるかもしれませんし、もっと効率的なやり方があるかもしれません。もしより完成度の高い解決方法をご存知の方がおられましたら、後学のためにも回答をお願いいたします。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ■データベース内のデータ 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],]); #以下に変更 push @result, [@work]; } #//■CLOSE $sth->finish; $db->disconnect; for($i=0; $i<$cnt; $i++){ print "<p>".$result[$i][0]."/".$result[$i][1]."/".$result[$i][2]."</p>\n"; } ********************************************************** ■表示 1/1/aaa 1/2/bbb 1/3/ccc

    • ベストアンサー
    • Perl
  • 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
  • DBIを使ってSelect文 複数のカラム、複数のレコードを取得するには?

    Perl DBIを使用してDB検索する部分で質問させてください。 検索してきた複数のレコードの中のカラムを全て取得したいのですが うまくできません。 テーブルAAAに フィールドa,b,cがあり、レコードが3つ入っているとします。 テーブルAAA a b c ------ 1 2 3 4 5 6 7 7 7 $sqlState= "select a,b,c from AAA"; $sth= $dbh->prepare($sqlState); $sth->execute; @row = $sth->fetchrow_array; foreach (@row){ ($a,$b,$c,)= @row; print $a; print $b; print $c; } このようなコードでいいのかと思うのですが 出力結果は111 222 333 となってしまってまるで期待通りの結果にはなりませんでした。 上記の例では 123 456 777 という出力結果を望むとすると、どのように記述すればよろしいのでしょうか?

  • 配列の中のデータの表示(1件分ずつ)

    いつもお世話になっております。 教えていただいた方のおかげで少しずつ出来上がりつつありますm(__)m またお力をお貸しいただければ嬉しいです。。 POST で取得された配列があります。 [i][handle][sex][body] ↓ (例) [0][][][][]→データなし [1][たくみ][男][晴れが好き] [2][あゆみ][女][雪が好き] [3][みゆ][女][曇りが嫌い] : この配列を、一番目の人($が1)から表示させたいと思っていのですが・・・ for ($i = 1; $i <= count ($handle); $i++) { print $i . "人目の名前:" . $_POST['handle'][$i] . "<br>\n"; print $i . "人目の性別:" . $_POST['sex'][$i] . "<br>\n"; print $i . "人目のPR:" . $_POST['body'][$i] . "<br>\n"; print "<br>\n"; } にすると、同じページに3人分のデータが表示されてしまいます。 そうではなく、1ページ目には1番目の人、2ページ目には2番目の人の表示という風にはできないのでしょうか? 教えてくださいm(_)m

    • ベストアンサー
    • PHP

専門家に質問してみよう