• ベストアンサー

DBIを使用してデータを連想配列に「入れたい。

MySQLとDBIを使って、テーブルから取り出したデータの、カラムの名前をキー、フィールド値をバリューとした連想配列を作りたいのですが、どうすればいいでしょうか?? fetchrow_arrayの使い方は分かっているのですが、fetchrow_arrayだと配列しか作れないみたいなので・・ハッシュにしたいのです。 分かる方いらっしゃいましたらご教授よろしくお願いします。

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

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

  • ベストアンサー
  • vsba23895
  • ベストアンサー率58% (18/31)
回答No.2

while(my $hash= $result->fetchrow_hashref()) { while(my($field,$value)= each(%$hash)) { .. } } なお、SELECT table1.field,table2.field,... のように複数テーブルで同じフィールド名があると、うまくいかないという問題があります。

その他の回答 (2)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

連想配列にするなら、fetchrow_arrayではなくfetchrow_hashrefを使うと1行で済みます。 %HOGE = %{$result->fetchrow_hashref}; ↑こうするだけでご希望通りの結果を得られます。

miraikako
質問者

お礼

お礼遅れて申し訳ありません。教えていただいてた方法を色々試して解決しました。回答くださった方々ありがとうございましたm(__)m

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

my %hash; $hash["カラムの名前"]=フィールド値; とすればいいですけど、、 連想配列の場合、1つのキーに基本1つの値なので、 複数のフィールド値の場合は、バリューを配列にする必要があります

関連するQ&A

  • 連想配列でこういう処理をする関数を探しています

    PHP5.2.4を使用しています。 どういうふうに説明してよいのか分かりませんが、 $arr = array(  'key1' => array('value1'=>1,'value2'=>11),  'key2' => array('value1'=>2,'value2'=>22),  'key3' => array('value1'=>3,'value2'=>33), ); という連想配列を例えばキー'value2'の値だけが欲しく、 $arr = array(  'key1' => 11,  'key2' => 22,  'key3' => 33, ); と、変換したいのですが、そのような関数はあるのでしょうか? またこのような処理をする関数を自作する場合、 どのような関数名が適切でしょうか?(array_○○○)

    • ベストアンサー
    • PHP
  • 連想配列を処理するにあたって

    お世話になっております。 連想配列について質問させて頂きます。 以下のような、キーに文字列、インデックスに数字を指定している連想配列があるとします。 Array([あいうえお] => 0 [かきくけこ] => 0 [さしすせそ] => 0 [たちつてと] => 0) この連想配列のキーを指定し、そのキーに対するインデックスの数字を別の数字に置換したく思っています。 仮に、「あいうえお」のキーを指定して、そのキーに対するインデックス「0」を「1」に変更したいのです。 array_fill()やarray_fill_keys()などの関数を調べて試してみましたができませんでした。確実にプログラムが間違っているとしか言いようがないのですが、どなたかアドバイスをお願い致します。 以下のコード中にその処理を持ってきたく思っています。 /* foreach($mystery_noun as $mystery_key => $mystery_value){ __foreach($mecab_noun as $mecab_key => $mecab_value){ ____if($mystery_key == $mecab_key){ ______ここにその質問の処理を記述する。 ____} __} } */ ある連想配列のキー(文字列)が一致した場合、そのキーに対するインデックスを0→1に変更します。 尚、$mystery_noun、$mecab_nounの連想配列全てのインデックスには、それぞれ1,0が格納されています。

    • ベストアンサー
    • PHP
  • 連想配列と添字配列の違いについて

    MySQL初心者です。 mysql_fetch_arrayとmysql_fetch_assocの違いがいまいち理解できません。 ネットで調べると mysql_fetch_array — 連想配列、添字配列、またはその両方として結果の行を取得する mysql_fetch_assoc — 連想配列として結果の行を取得する と書かれていますが、連想配列と添字配列の違いが理解できませんでした。 全くの初心者でもわかるようにそれぞれの違いを教えていただけませんか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 思うような連想配列ができない・・

    省略して説明します。 関東,東京,神奈川,千葉 中部,愛知,静岡,岐阜 関西,大阪,兵庫,京都 というCSVデータがあり これを以下のような、連想配列にしたいのですがどうすればよいのでしょうか?? Array (   [0] => Array    (      [0] => 関東      [1] => 東京      [2] => 神奈川      [3] => 千葉    )   [1] => Array    (      [0] => 中部      [1] => 愛知      [2] => 静岡      [3] => 岐阜    )   [2] => Array    (      [0] => 関西      [1] => 大阪      [2] => 兵庫      [3] => 京都    ) ) --------------------------------- CSVデータを、feofで終端まで読み込み feofで一行ずつ取得 explodeでコンマで分解まではできるのですが 上記のような、連想配列ができません・・。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • MYSQLとPHPによって取得する多次元配列

    はじめてご質問させていただきます。 現在以下のようなテーブルが3つあります。 [ tbl1 ] | tbl1Key | title | | 1 | a | | 2 | b | | 3 | c | | 4 | d | [tbl2] | tbl2Key | tbl1Key | tbl3Key | | 1 | 2 | 2 | | 2 | 3 | 1 | | 3 | 3 | 4 | | 4 | 1 | 3 | [tbl3] | tbl3Key | value | | 1 | aaa | | 2 | bbb | | 3 | ccc | | 4 | ddd | 上記のデータソースを元に以下のような結果を得たいと考えています。 array( array( 'tbl1Key'=>1, 'title'=>'a', 'values' => array( array( 'tbl3Key'=>3, value='ccc' ) ), array( 'tbl1Key'=>2, 'title'=>'b', 'values' => array( array( 'tbl3Key'=>2, value='bbb' ) ), array( 'tbl1Key'=>3, 'title'=>'c', 'values' => array( array( 'tbl3Key'=>1, value='aaa'), array( 'tbl3Key'=>4, value='ddd' ) ), array( 'tbl1Key'=>4, 'title'=>'d', 'values' = > array( array( 'tbl3Key'=> , value='' ) ) ) この場合phpによって $sql = ("select * from `tbl1`"); $res = mysql_query( $sql, $con ); $data = array(); while( $row =mysql_fetch_object( $res ) ) { $sql = ("select * from `tbl3` inner join `tbl2` on `tbl3`.`tbl3Key`=`tbl2`.`tbl3Key` where `tbl2`.`tbl1Key`={$row->tbl1Key}"); $res2 = mysql_query( $sql, $con ); $tmp = array(); while( $r = mysql_fetch_object( $res2 ) ) { $tmp[] = $r->value; } $row->values = $tmp; $data = $row; } まずtbl1のデータをすべて取り、配列dataに格納する段階で、tbl1と関連付けされたtbl3のvalueを取得し配列tblに格納、それを新しい要素として配列dataにプッシュしている状況です。 こういったテーブルでいうところの1カラムのみ配列で返すような事は、こういったループを使って以外にも可能なのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。

    SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。 (カラム名を連想配列のキーにします。) また、値をHTMLエスケープ処理したいと考えています。 下記のソースを書いてみましたが、配列$all[]にうまく入りません。 $qresult = mysql_query($qstring); $all = array(); while (list ($key, $val) = mysql_fetch_assoc($qresult)){  $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP); } また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、 「Variable passed to each() is not an array or object」エラーが出ます。 mysql_fetch_assocの戻り値は連想配列では無いのでしょうか。 $qresult = mysql_query($qstring); $all = array(); while ($rec = mysql_fetch_assoc($result)){  $all[] = $rec; } 上記だと問題なく取得出来るのですが。。。 何が悪いのでしょうか。

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

    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
  • SQLのデータから連想配列を作成したい

    あるPHPがあります。 このPHPは配列$food = array('orange','apple','sugar','spice','cake');を基にさまざまな処理を行っているのですが、 配列内部の要素の数が大きくなってきたので、sqlを使用して$foodを作成しようと思います。 データベース名dbname、テーブル名Tableとして、nameカラムのデータから$foodを作成…つまり、 ---------------------- Table  ------+ name | ------+ orange apple sugar spice cake ---------------------- ↓ ↓ $food = array('orange','apple','sugar','spice','cake'); などとしたいのです。 mysql_fetch_arrayなどを使用すればできると思うのですが、自分ではどうにもうまくいきません。 ↓はgoogleでの検索条件を基に、私が書いたコードです <?php $link = mysql_connect( $hostname, $uname, $upass); mysql_select_db( $dbname, $link) $res = mysql_query( "SELECT * from {$name}", $link); while( $food = mysql_fetch_assoc( $res ) ){ } ?> どこのコードがおかしいのか教えてください。 また、できれば上のデータベースから$foodを作成するPHPを教えてください。 どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • 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と言われてしまうのですが、何か記述の仕方等何か間違ってる部分などあれば指摘お願い致します。 ちなみにデータベースへの接続等は出来ています。

    • ベストアンサー
    • Perl

専門家に質問してみよう