• ベストアンサー

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

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

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

  • ベストアンサー
  • an-gooo
  • ベストアンサー率50% (6/12)
回答No.2

検索して出てきたソースを利用してprintしてる変数を配列にいれるんじゃダメでしょうか? $cnt= $sth->rows; for ($i=0; $i<$cnt; $i++) { @a = $sth->fetchrow_array; push(@result,@a); }

mugakusya
質問者

お礼

このすぐ上の記事で同じ事をしたのですが、ここは一度書くと24時間は消せないみたいなので無駄に手間を取らせてしまいました。ありがとうございました。

その他の回答 (1)

  • 2NN
  • ベストアンサー率40% (143/353)
回答No.1

@result[$i] = ([$work[0],$work[1],$work[2],]); ↓ @result[$i] = @work; print "<p>".$result[$i][0]."/".$result[$i][1]."/".$result[$i][2]."</p>\n"; ↓ print "<p>".join('/',@{$result[$i]})."</p>\n"; これでどうでしょうか。

mugakusya
質問者

お礼

回答ありがとうございます。 この質問はすぐ上の質問に内容が変わりました。24時間以内だと消せないようなのでお手間を取らせてしまいましてすいませんでした。 基本的にデータ構造が以下のようになっていて、自由に配列の要素にアクセスできたほうが望ましいかもしれません。 @result = (["1","1","aaa"], ["1","2","bbb"], ["1","3","ccc"], )

関連するQ&A

  • 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
  • データベースに配列を格納する

    私はデータベースを本で勉強していたのですが物にするため、実際にデータベースのプログラムをくんでみようと設計を考えたのですが、疑問があります。 私はデータベースに、プログラム上で取り扱っているサイズがことなる複数の配列内のデータを格納したいのですが、これはデータベースにどのように格納すればよいのか分からず困っています。 図で説明すると 例えば {1} {12 33 24 21} {13 56 0 1} という3つの配列を同じデータベースに入れようとした場合 ID int1 int2 int3 int4 1 1 null null null 2 12 33 24 21 3 13 56 0 1 という形で入れる事になると思いますが、ここにサイズが5の配列をいれようとした場合は列が増えることになってしまいます。すると色々めんどくさいことになるのではないかと思います。 このようなデータベースに入れるデータのサイズが分からない場合は、どのようにするべきなのでしょうか?(なおJDBCを使い、SQLiteに入れています) やや抽象的かつ、意味がわかりにくい質問ですが不足な点は説明させていただきますので、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 配列に格納された値の変更について

    お世話になります。現在下記のように配列に値を入れています $result=pg_query($db,$sql); $status=pg_result_status($result); $data=array(); while($row=pg_fetch_row($result)){ $data1[]=array("namae_id"=>$row[0],"namae"=>$row[1]); } 値を格納してからnamaeの部分の値を変更したいのですが、どのようにしたらいいでしょうか? 例えばnamae_id=4のnamaeの値を太郎から太郎 様という感じで変更したいのです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースから取得したデータを配列に格納できません。

    jTableにSQL文の結果を表示させようとして結果を以下のように配列に 格納しようとしました。 public String[][] Serch(){ int i=0; String[][] rowData; String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb"; try { // ドライバクラスをロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // データベースへ接続 Connection con = DriverManager.getConnection(str, "", ""); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM ハローテーブル"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // NOを取得 String no = String.valueOf(rs.getInt("NO")); // 言語を取得 String lang = rs.getString("言語"); // メッセージを取得 String msg = rs.getString("メッセージ"); rowData[i][0] = no; rowData[i][1] = lang; rowData[i][2] = msg; i++; } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return rowData; } このメソッドで得た配列を表示させようとすると以下の結果が表示されます。 java.lang.NullPointerException 正常なSQL文の結果は以下の通りです。 1 日本語 こんにちは世界 2 英語 Hello World 3 ドイツ語 Hallo Welt 配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。 どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

    • ベストアンサー
    • Java
  • データベースから多次元連想配列でデータを取得できない

    PHP,MySQLともに初心者です いろんなサンプルプログラムを見て少しずつ進めているのですが、本3冊にネットで検索しても解決できないので・・・ function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } $result=$db->getSelect("*","main","where myouji=$_POST[myouji]"); while($row = mysql_fetch_array($result[result])){ echo "$row[id]"; } こんな感じでmainテーブルからmyoujiに該当するrowを取得したのですが、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in とエラーが出てしまいます。 他のところで、 $result=$db->getSelect("*","main","where id=$_POST[id]"); $rows=mysql_fetch_array($result[result]); としたときはエラーなく行くのですが、上のような多次元連想配列(下の方はidを重複させてないので必ずrowが1つ・・・1次元連想配列?)になるとエラーになってしまいます。 これはどう修正すればいいのでしょうか。 たったこれ1行のつまづきで4時間くらいかかってます。 誰か助けてください

    • ベストアンサー
    • PHP
  • php配列格納

    $lines = file ('db.csv'); 上記でファイルの中身を配列に入れますがその逆で データを配列にして格納したいのですがどうすればいいのでしょうか? ファイルの不要な行を除いて再度変数に配列で格納しファイルを作成 したいのです。

    • ベストアンサー
    • PHP
  • 一回の処理で、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
  • PHPで配列に格納されたデータを表示させるには。

    PHPで配列に格納されたデータを表示させるには。 全ての配列の要素を表示させることは下のようにすればできるのはわかります。 <?php for($i=0;$i<sizeof($data);$i++){ echo $data[$i]; echo "<br>"; } ?> 配列の0~9まで(10個)をまず表示させて、「次へ」のようなリンクで次の10~19までを表示させるようにしたいのですが、どのようにすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • mysql_fetch_arrayで配列に格納する

    例えばtable1というテーブルにtest1というカラムがあったとして、そのtest1に aaa bbb ccc ddd というデータが入っているとき、$item[0]にaaa, $item[1]にbbb・・・・というように格納したいのですが、 $item[0]にしか格納できません・・・。 どのように書けばできますか?もしくはmysql_fetch_arrayでは無理でしょうか?

    • ベストアンサー
    • PHP
  • PerlでMySQLのテーブル一覧取得

    PerlでMySQLのデータベース内のテーブル一覧を取得することはできますか? 自分で以下の様なサブルーチンを作りましたが、返り値に何も入っていませんでした。 コマンドラインでもshow tables;で確認したのでテーブルは確実に存在します。 接続も showでfetchrow_arrayなどは使えないのでしょうか? またselect文でテーブル一覧を取得する方法がありましょうか? Error: failed to connect to DB.とは出てこないので、接続も成功しています。 sub mysql_tablesGet{ my @data=@_; my $db_id = $data[0]; my $db_password = $data[1]; my $dbh = DBI->connect("dbi:mysql:dbname=".$ftp_id.";host=$mysql_host", $db_id,$db_password) or die "$!\n Error: failed to connect to DB.\n"; my $sth = $dbh->prepare("show tables;"); $sth->execute; my @response; my $i=0; while(my @var = $sth->fetchrow_array){ my ($table_name) = $var[0]; $response[$i] = $table_name; $i++; } $dbh->disconnect; return @response; } MySQLのログはこんなのが出ています。 130406 17:11:44 70 Connect test2@192.168.11.22 on test2 70 Query set autocommit=1 特にエラーは出ていないので、show tables;は成功していると思います。

    • ベストアンサー
    • Perl

専門家に質問してみよう