• 締切済み

Perl Postgres 連想配列化

いつもお世話になっております。 標題についてご教授願えないでしょうか Perl+Postgressqlで取得したレコードを連想配列化にしたいのですが、 @data = (); my $conn = Pg::connectdb(接続情報) my $query = "SELECT * FROM data; my $result = $conn->exec($query) if($result->resultStatus ne PGRES_TUPLES_OK){ exit; } my $cnt = $result->npuples my $fields = $resut->$rset->nfields; for ($i=0; $i<$cnt; $i++){ for(j=0; $j<fields; $j++){ $data[$cnt][$result->fnam($fields)] = $result->getvalue($j,$j) } これではいけないんでしょうか。

  • prr4e
  • お礼率48% (66/136)
  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「連想配列化にしたい」の意味は分かりませんが, 連想配列は使わなくていいのですか? まぁそれ以前に文法的にアウトだけど.

prr4e
質問者

お礼

回答有難うございます 。 返信が遅くなりましたが、 実はあの後、色々調べてやったら、 ものの5分で出来てしまいました。 結果取得したデータをハッシュに生成しました。 $data{$cnt}{$fields}の形式でできました。

関連するQ&A

  • PHP postgres でロールバック処理

    こんにちは。 タイトルの通りなのですが PHPではpostgreを使用してのトランザクション処理で 処理が失敗した時に ロールバック処理を意識しなくていいのでしょうか? $conn=pg_connect("host=dbhost user=dbuser password=password dbname=dbname port=5432"); $query="BEGIN;"; $result=pg_exec($conn,$query); $query="INSRET INTO ....;"; $result=pg_exec($conn,$query); $query="COMMIT;"; $result=pg_exec($conn,$query); pg_close($conn); このコミット時に自動でロールバックされる? どなたかご存知の方、よろしくお願いします。

    • ベストアンサー
    • PHP
  • postgresからの配列を変数に

    postgresから配列を取得して、$nameaddに追加していきたいです。 仮に 山田 斉藤 鈴木 という3レコードがある場合、$nameに渡し それを$nameaddに 山田,斉藤,鈴木 というふうに,区切りで追加して いきたいのですが最後の鈴木しか入ってくれません。 最終レコードで$nameを上書きしているのは分かるのですが 上書きせずに追加していくにはどのようにしたらようのでしょうか。 $sqlSelect = "select * from table "; $result = @pg_Exec($sqlSelect); for($j=0;$j<@pg_Numrows($result);$j++) {  $name = @pg_Result($result, $j, 0);  $nameadd = array($name);  if($j==0){   $nameadd = $name;  } else {   $nameadd = ",".$name;  } } print $nameadd;

    • ベストアンサー
    • PHP
  • PHPとMySQLで配列で検索する方法

    プログラミング初心者です。 PHPとMySQLでデータベースを作成しています。 配列に格納したデータを既に登録してあるデータに参照して、日付と題名が同じものは登録しないようにしたいと思います。 以下がソースなのですが、2行目でエラーがでてしまいます。そうすればよいかご教授お願いします。 for($j=1; $j<$i; $j++){ $query ="select * from data where date=" . $date2[$j]; $result = mysql_query($query) or die(mysql_error()); $query2 ="select * from data where sub=" . $sub[$j]; $result2 = mysql_query($query2) or die(mysql_error()); if(mysql_num_rows($result) != 0 && mysql_num_rows($result2) != 0){ //登録しない } else{      //データベースに登録

    • 締切済み
    • PHP
  • perlでくじ引きプログラムを作りたい

    箱の中に、 akaが14個 aoが21個 kiiが443個 以下続く(__END__以下) という様にさまざまな色のボールが箱に入っているとします。 そこから、80個だけ取り出した場合、 aka=4 ao=9 aka=4 以下続く という様に表示させたいのですがどのようにすればよいでしょうか? ネット上で見つけた色々なプログラムをくっつけてはみたのですがいまいちです。 特に、ballの数がakaが14個ではなく、akaが1000000個、ao300000個のように膨れるとメモリも多く要りそうですし、時間もかかってしまいます・・・ もっとうまくやるやり方があると思うのですが、どうしても思いつきません。 どなたか、教えていただけ無いでしょうか? 宜しくお願い致します。 #!/usr/bin/perl print "Content-Type: text/plain\n\n"; my $cnt = 80; my ($line,@array,@data,$data); foreach $line (<DATA>){ @array = split(/\t/,$line); for(1..$array[2]){ #ここの部分がかなり問題あり・・・ $data[$datacnt++]=$line; } } srand; for (my $i = @data; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @data[$i, $j] = @data[$j, $i]; } foreach(0..($cnt-1)){ #とりあえず表示させる。 print $data[$_]; } #同名を集計して表示させるプログラムを作る予定 #空白はタブ区切りです。 __END__ ball aka 14 ball ao 21 ball kii 443 ball midori 112 ball shiro 122 ball orenji 1

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

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

    こんにちは。質問をさせてください。 PHPでOracleのデータを取得してそのデータを連想配列に格納するとします。 /------- PHP内でのソース -----------------/ (例) $Count:検索データ数  for($cnt=0;$cnt<$Count;$cnt++){ $data[$cnt] = "取得したデータ";  Fech(次のレコードを取得する); } 上記で取得した連想配列の値をJavaScriptでしようしたいのですが うまくいきません。 JavaScriptではArrayに取得したデータを格納したいのです。 (例) /-- JavaScript内のソース Afor2=new Array("取得data1","取得data2",・・・"最後の取得data"); としてHTMLの何かのイベント時にしようしたいと考えています。 今僕は以下のような動きをしたいです。 /----以下、JavaScriptでの記述-----------------/ var New_Array=new Array(5); for(i=0;i<<?=$Count?>;i++){ document.form.cmb_box.options[i] = new Option(<?=$data[i]?>, i); } のようなことをしたいのですが。 (もちろん上記はだめですが・・・) 質問がわかりにくくて大変もうしわけありませんが、 アドバイス、質問などよろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPをまたいだロックの管理

    現在、PHPとMySQLを使ってデータ管理のプログラムを構築しています。 その中で、複数のPHPをまたいで同じデータテーブルを使おうとしたときに デッドロックが起きないようロック用のテーブルを作り、 データテーブルを編集するときにテーブルロック判定をかけようとしているのですが、 エラーが出てしまい上手くいきません。 以下に現状のプログラムを置いておきます。 もしお手隙でしたら、どなたかアドバイスいただけますでしょうか。 どうぞよろしくお願いいたします。 (ここから) $conn = @mysql_connect(DB_HOST, DB_NAME, DB_PASS); if (!$conn || !mysql_select_db(DB_MASTER, $conn)){ echo "DBopenError:DBオープン時エラーが発生しました。<DB>"; } mysql_set_charset('utf8', $conn); mysql_query('SET AUTOCOMMIT = 0;', $conn); mysql_query('START TRANSACTION;', $conn); // テーブルのロック mysql_query('LOCK TABLES tbllock WRITE, tbldata WRITE, temp WRITE;', $conn); // ロックの判定 $lock = checkLock($conn, 'tbldata', $sessID); // テーブルのロックを解除 mysql_query('UNLOCK TABLES;', $conn); $cnt = 0; while ($lock === false) { if ($cnt > 10) break; sleep(1); $lock = checkLock($conn, 'tbldata', $sessID); $cnt++; } if($lock === false) die('タイムアウトしました。'); else{ /* データ編集処理 */ } if (mysql_errno($conn)) mysql_query('COMMIT;', $conn); else mysql_query('ROLLBACK;', $conn); mysql_close($conn); //------------------------------------------------------------------ // 編集ロックチェック //------------------------------------------------------------------ function checkLock($dbID, $selTable, $oldsid) { $sqlstr = sprintf("SELECT * FROM tbllock WHERE tblName = '%s' FOR UPDATE;", $selTable); $result = mysql_query($sqlstr, $conn); $num = mysql_numrows($result); $flg = false; if ($num > 0) { if(mysql_result($result, 0, 'enable') === '0' || strlen(mysql_result($result, 0, 'lockUser')) === 0) $flg = true; else { if(in_array(mysql_result($result, 0, 'lockUser'), $oldsid)) $flg = true; else { $lockedDate = strtotime('-5 minute'); if (strtotime(mysql_result($result, 0, 'lockedDate')) < $lockedDate) { $sqlstr = sprintf("UPDATE tbllock SET enable = '0' WHERE tblName = '%s';", $selTable); $result = mysql_query($sqlstr, $dbID); $flg = true; } } } } if ($flg === true) { $sqlstr = sprintf("UPDATE tbllock SET lockUser = '%s', lockedDate = NOW(), enable = '1' WHERE tblName = '%s';", session_id(), $selTable); $result = mysql_query($sqlstr, $dbID); return true; } else return false; } (ここまで)

    • 締切済み
    • PHP
  • 配列をループさせてUPDATE

    投票システムでチェックボックスから選択されたキーをまとめてUPDATEするには、 どの様なUPDATE文にすれば良いのでしょうか? -------------------------------------------------------------- for ($i = 0; $i < count(@$_POST["answer"]); $i++) { echo $_POST["answer"][$i]."が選択されました"; // ← 一応PHP上で正常に値が返るかを確認しました。 $data = $_POST["answer"][$i]; // ←変数に置き換えました。 $conn = db_conn(); $sql = "UPDATE an SET "; $sql .= " sel" . $data . "cnt = sel" . $data . "cnt + 1"; $sql .= " WHERE id = '" . cnv_sqlstr($id) . "'" ; } -------------------------------------------------------------- という様に書くと、最後にチェックしたキーのみがUPDATEされ、 その他のキーは無視されてしまいます。 echo文でPHP上で正常に走っているかどうかを確認したところ 問題はありませんでしたが、UPDATE文でデータベースに投げると 上手くいきません。 どうかご教示の程よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • Pg::connectdb を用いたsql文の結果参照について

    既存の、カーソルを返すプロシージャを参考にして、 int型(正常:0、異常:3)を返すプロシージャを作成しました。 (プロシージャの単体試験では異常時には3が正しく返却されます) ところが、 Pg::connectdb を用いてDB接続し、sqlを発行した結果 $result = $conn->exec($sql); $result->resultStatus に3が入ってくれません。 このあたりがよくわからないのでよろしくご指導ください。

  • MySQLからCSVファイルのダウンロード

    はじめまして。 MySQLのデータをCSVファイルに書き出しダウンロードする場合に、 文字コードをSJISに変換してダウンロードしたいのですが、下記のソースに何を付け加えればできますでしょうか? お手数ですが、何方かご教授よろしくお願いします。 //tab1表から全行を取り出す $sql = "select * from tab1"; if(!$rs = mysql_query($sql)) { print "error=".mysql_errno()."<br>"; exit; } $fields = mysql_num_fields($rs); $rows = mysql_num_rows($rs); //取り出した行数分繰り返す for($i=0;$i<$rows;$i++){ //列数分繰り返す for($j=0;$j < $fields;$j++){ //列の内容出力する print(mysql_result($rs,$i,$j)); //最終列でない場合は カンマ を出力する if ($j < $fields - 1) print(","); } print("\n"); }

    • ベストアンサー
    • PHP

専門家に質問してみよう