[PHP-users 4975] Re: バグ?仕様?複数のpostgre 接続リソースを定数にできない?

Naofumi Kondoh php-users@php.gr.jp
Fri, 25 Jan 2002 14:44:20 +0900


ソフト工房の近藤です。

Yasuo Ohgaki wrote:
> 
> 大垣です。
> 
> Y.Watanabe wrote:
> > わたなべです。

...略...

> > <?php
> >   define ("DBCONN01",pg_connect("dbname=db01 user=username"));
> >   pg_exec("DBCONN01","select * from hogehoge");
> > ?>
> > のように定数としてのpostgreリソースがひとつしかない場合には
> > 正常に作動します。
> 
> これが動作する事自体がおかしいです。確認してみます。
> (多分、デフォルトコネクションのハンドリングがおかしい為と思います)
> 
> ZendEngineの動作もおかしいのでこちらも確認してみます。

define ("DBCONN01",pg_connect("dbname=db01 user=username"));
は、エラー処理もんだいと、コードが読みにくいので
推奨できないですが、一度変数に入れて、

$DBcon1 = pg_connect("dbname=idb") or die('ERROR');  
define ("DBCONN01", $DBcon1);

とするなら、正しい使い方ではないのでしょうか。

> > しかし、
> > <?php
> >   define ("DBCONN01",pg_connect("dbname=db01 user=username"));
> >   $dbconn02 = pg_connect("dbname=db02 user=username");
> >   pg_exec(DBCONN01,"select * from hogehoge");
> >   pg_exec($dbconn02,"select * from fugafuga");
> > ?>
> > のように、ふたつの接続リソースの片方を定数として、もう片方を
> > 通常の変数とした場合にも、やはりWEBサーバが反応しなくなります。
> 
> pg_exec()の第一引数はPostgreSQLのコネクションリソースを必ず
> 渡してください。
> 
> このメールの様にdefineをマクロの様に使ったコードが動くこと自体
> がバグです。

私の理解では、所謂マクロではなく、pg_connect() の
返信値(コネクションリソース) を READ ONLY の変数の
かわりに define で定数にしているんだと思います。

このメリットは、
(1)コネクション値を変更できなくさせる
   (READ ONLY の const 変数として扱える)
(2)global 宣言が不要になる

ではないかと推察します。

PHP 4.04p11 では、下記コードで動きます。

この使い方なら正しいと思いますが、如何でしょう。

pg_exec() などで使う コネクションリソース値は、値い
渡しだと思いますが違いますか。参照渡しでリソース値が
変更可能でなければならないとしたらかえっておかしいと
思います。
# 私の理解不足ならご指摘賜わりたく。

<?php
    $DBcon1 = pg_connect("dbname=webpg") or die('ERROR');  
    $DBcon2 = pg_connect("dbname=kon") or die('ERROR');  

    define ("DBCONN01", $DBcon1);
    define ("DBCONN02", $DBcon2);

    echo "DBCONN01 = ".DBCONN01."   :  DBCONN02 = ".DBCONN02." <hr>";

    $exe1 = pg_exec(DBCONN01,"select * from zipmst limit 5;") or die ('err');;
    $exe2 = pg_exec(DBCONN02,"select * from aa limit 5;") or die ('err');;

    echo "EX1: [ ".implode(' ][ ', pg_fetch_row($exe1, 0)). " ]<hr>";
    echo "EX2: [ ".implode(' ][ ', pg_fetch_row($exe2, 0)). " ]<hr>";

    pg_close(DBCONN01);
    pg_close(DBCONN02);
?>


_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 (株)ソフト工房   近藤直文        Email:  nkon@shonan.ne.jp 
PostgreSQL+PHP ソースコードジェネレーター セミナースライド
          http://www.shonan.ne.jp/~nkon/cslpg.a.semi/
          http://www.SOFTKOUBOU.co.jp/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/