[PHP-users 21478]pg_fetch_arrayにて取得した値の保持について

Kaoru Tsuchiya kaoru-t @ yf7.so-net.ne.jp
2004年 4月 24日 (土) 20:17:12 JST


はじめまして、土屋と申します。

以下のような環境で、プログラムしています。
コード自体は Windows 上で作成し、以下の実行環境に
アップしてテストしています。

環境
OS       :Fedora Core 1
WEBサーバ:Apache 2.0.48-1.2
PHP      :4.3.4-1.1
DB       :PostgreSQL 7.3.4-11

ちょっと説明しづらいのですが...

あるデータを検索してその結果を表示するというよくある処理ですが
最初は、以下のようなクエリ結果リソースを返す関数(get_user)を呼んで、
呼び出し側でそのリソースを元に pg_fetch_array で、各レコードの値を
表示していました。
1つのページで 1回ループ(表示)するだけならこの方法でも良いのですが、
2回以上ループしたい場合があります。この場合、また結果リソースを返す
関数を呼ぶよりは、DB へのアクセスが 1回で済むように予め検索結果を
配列にセットして、その配列を返すように変更しましたが、このような
作り方はおかしいでしょうか?
みなさんは、もし、ある検索結果をあちこちで使いまわす場合は、
このように配列等に保持するうようにしているのでしょうか?

また、このような配列を受け取った場合、表示する側では
foreach でループしても(for で添え字を指定してループしなくても)
先頭から順に要素を取り出してくれるという認識は間違ってないですよね?


$t_users = get_user();
while ($rc = pg_fetch_array($t_info_def)) {
    print "name: " . $rc['name'] . "<br>";
}
                 ↓
// 連想配列ではないので for でなくても追加した順に
// 表示する
foreach($t_users as $user) { 
    print "name: " . $rc['name'] . "<br>";
}

// これでも OK
for($i=0; $i < sizeof($t_users); $i++) { 
   print "name: " . $rc[$i]['name'] . "<br>";
}

function get_user() {
    $dbh = get_connection($GLOBALS['db_info']);
    if ($dbh == false) {
        error_exit("データベースに接続できません。理由: $php_errormsg");
    }
    
    $sql = "select * from t_user";

    $res = pg_query($dbh, $sql);
    if ($res == false) {
        error_exit("SQLの実行に失敗しました。理由: $php_errormsg");
    } else {
        // return $res;  <-- はじめは結果リソースを返していた

        // リソースではなく、配列に各レコードの値をセットして
        // その配列を返す
        $list = array();
        while($rc = pg_fetch_array($res)) {
            array_push($list, $rc);
        }        
        return $list;
    }

}

function get_connection($db_info) {
    $conn_string = "host=" . $db_info[DB_HOST] . 
                   " dbname=" . $db_info[DB_NAME] .
                   " user=" . $db_info[DB_USERNAME] .
                   " password=" . $db_info[DB_PASSWORD];
    $conn = pg_connect($conn_string) or die ("Nao consegui conectar ao PostGres --> " . pg_last_error($conn));
    return $conn;
}


********************************************
    Kaoru Tsuchiya                        
    e-mail: kaoru-t @ yf7.so-net.ne.jp     
********************************************




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