[PHP-users 17216]Re: pg_closeについて

Masashi Ohba ooba @ sra-tohoku.co.jp
2003年 8月 7日 (木) 17:00:11 JST


大場です。

#なんか大きなを勘違いしてるような…

In message "[PHP-users 17201] pg_closeについて",
"キャスター マイルド" <caster_mild_49401219 @ hotmail.com> wrote...>こんにちは、キャスターマイルドで
す。
>
>pg_close();について質問ですが、
>一つのスクリプト内で何度も使えないのですか?

再度つないだらいいだけですけど
あまりそういう使い方はしないかなぁ…

>例えば、
>$conn = pg_connect("","","testdb") or die("データベース接続エラー");
>$sql = "SELECT * FROM testtb WHERE id = '1';";
>$res = pg_exec($conn, $sql) or die("データ抽出エラー");
> for ($i = 0; $i < pg_numrows($res); $i++) {
> $row = pg_fetch_array($res, $i, PGSQL_ASSOC);
> $data = $row["data"];
> }
>pg_close($conn);

ここで閉じてるわけだから

>$sql = "INSERT INTO ".$data.") VALUES('".$data."');";
>pg_exec($conn, $sql) or die("データ追加エラー");

なんてやってもエラーが出るのは当たり前です。

>一回目の接続のpg_closeを消すとうまくいきます。

こうすると途中で閉じてないんだから当然そうなります

>うまくいくので、それでいい気もするのですが、
>これを変えて、
>一回目のテーブルに該当データがあったら、別のテーブルにデータを入れる。
>と言った場合など、pg_closeをifなどわけて、条件別に書く必要が出てきますよね?

なんで?
その2つのテーブルは同じデータベースなんでしょ?
それなら接続1回で充分でしょ?

まぁ別の2つのデータベース上のテーブルだとしても

$conn1 = pg_connect(...);
$conn2 = pg_connect(...);
$sql1=hoge;
$sql2=fuga;
$res1 = pg_exec($conn1, $sql1)
$res2 = pg_exec($conn2, $sql2)
pg_close($conn1);
pg_close($conn2);

見たいな感じで、リソースid($conn*)を変えたら
2つのデータベースを同時に処理もできるとは思うけど。

赤マンモス本を見たら
「pg_close()」じゃなくて
「pg_close([resource id])」となってます。
[resource id]と書かれてるのには意味があって
複数の接続を開いた場合は閉じる接続は
[resource id]を指定して決める必要があるってことです。
よく見るサンプルでpg_close()と指定無しなのは
指定しないでも接続が1つしかないからそれを閉じるってことでしょう。

ただ文章を読むとやりたいことはどうもそうじゃなさそうだし…
「一回目のテーブルに該当データがあったら、別のテーブルにデータを入れる」
ってことなら
$conn = pg_connect(データベースを指定);
$sql1=hoge;
$res1 = pg_exec($conn, $sql1)←こっちでselectして
この辺でここで$res1を使ってデータを色々いじって
if(いじった結果を元になんかの条件に一致したら){
    $sql2=fuga;
    $res2 = pg_exec($conn, $sql2)←こっちでinserrtしたい?
}
pg_close($conn);

ってことがしたいんでしょうか?

思うに、せっかく例を書いてくれてますが
2回SQL文を食わせるのに、同じ$sqlや$resの変数名を
使おうとするから「閉じないとダメなんじゃ?」というような
変な疑問がおきてるのかな?と…

それなら、変数名を変えたらいいだけの話です。

-- 
Name  : Masashi Ohba
E-mail: ooba @ sra-tohoku.co.jp


PHP-users メーリングリストの案内