• ベストアンサー

レコードの取得について

Postgres + PHPの事で質問させて頂きます。 SELECT文で特定のレコードを選択し、 その値を別のテーブルに、それぞれのフィールドに 個別に格納したいのですが、上手くいきません。 現状では、レコードの選択はできて、 別のテーブル(zテーブルと仮定)にも格納はできるのですが、 例えば、選択したレコードがaa/bb/ccと、3件あった場合でも 最初のaaしか格納されないのです。 これを3件ともzテーブルに個別に格納したいと思っております。 while($row = pg_fetch_array($result)) 文を使って、連想配列で読み出しているのですが 何かが足りないのでしょうか?ご教授お願い致します。

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

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

「最初に SELECT 文で特定のレコードを選択し・・・」 という処理で、$result に結果を入れているのですよね? で、その後の while ループ内で mose テーブルへの SELECT, INSERT/UPDATE クエリの実行結果も 同じ $result に入ってしまいます。 そのままループ判定すると、 「最初に SELECT 文で特定のレコードを選択し・・・」 の結果(3件?)ではなくて mose へのクエリ結果で判定してしまっているのではないでしょうか? while ループ内の pg_query の結果を $result ではないところへ格納してみては いかがでしょうか? 適当に、$res_mose としてみました・・・ ----- $row_num = 0; while($row = pg_fetch_array($result,$row_num)){ $hoge = "'".$row['hoge']."'"; $query = "SELECT hoge FROM mose WHERE hoge = ".$hoge; $res_mose = pg_query($db,$query); if( pg_num_rows($res_mose) == 0 ) { $query = 'INSERT INTO mose (hoge, mose) VALUES ('.$hoge.', 1) '; } else{ $query = 'UPDATE mose SET mose = mose + 1 WHERE hoge = '.$hoge; } $res_mose = pg_query($query); $row_num++; }

gantz77
質問者

お礼

出来ました! 成る程…while内では、前の$resultを代用してはダメなのですね。 親切丁寧に教えて頂き、頭の悪い私でも理解できました。 誠に有難う御座います。

その他の回答 (1)

  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

$rownum = 0; while($row = pg_fetch_array($result,$rownum)){  // 何か処理  $rownum++; } でいかがですか? 注意: 4.1.0以降、rowはオプションです。 だそうです。

参考URL:
http://jp.php.net/pg_fetch_array
gantz77
質問者

お礼

情報有難う御座います。 教えて頂いた通りに修正してみましたがダメでした…。 一応、while文の前にpg_num_rows == 3で という条件式を付けて見ましたが、ちゃんと通ります。 通って、一件のレコードだけが修正されます。 現在のソースはこんなカンジになっております。 $row_num = 0; while($row = pg_fetch_array($result,$row_num)){ $hoge = "'".$row['hoge']."'"; $query = "SELECT hoge FROM mose WHERE hoge = ".$hoge; $result = pg_query($db,$query); if( pg_num_rows($result) == 0 ) { $query = 'INSERT INTO mose (hoge, mose) VALUES ('.$hoge.', 1) '; } else{ $query = 'UPDATE mose SET mose = mose + 1 WHERE hoge = '.$hoge; } $result = pg_query($query); $row_num++; } これは、単に各ページのカウント数を記録しているようなプログラムです。 moseがカウント数(とテーブル名)だと思ってください。 どうすれば宜しいのか、ご教授お願い致します。