[PHP-users 20695]Re: クラス内での可変変数の配列について

MIYAHARA Yuuki miyahara @ core-techno.co.jp
2004年 3月 9日 (火) 14:36:57 JST


はじめまして、宮原と申します。

> クラス内で配列の可変変数を扱っているのですが、アクセスするとエラー表示も
> なく、ブラウザはサーバーが見つかりませんと返してきます。

「ページが表示できません」などではなく ですか?
「サーバーが見つかりません」というのはそのままの意味なので、
PHPのバグなんかとはちょっと考えにくいと思ったのですが・・・。

>         foreach($colAry as $val) {
>             foreach($this->colVars[$val] as $key=>$dataVal) {
>                 global $$val;
>                 ${$val}[$key] = $dataVal; ←ここが問題?
>             }
>         }
この部分を利用しつつ、クラスを使用しないサンプルを作り、
PHP4.3.4で動作させてみたところ、問題なく動作しました。
(サンプルデータの量が少なかったせいかもしれませんが。)

また、原因とは関係ないだろうとは思ったのですが、
気になったので一応言ってみます。
"global $$val;" の位置についてですが、
foreach($this->colVars[$val] as $key=>$dataVal)ループの中にあると、
同じ変数を何度もグローバルにしようとするという無駄な処理が・・・。
//--
    foreach($colAry as $val) {
        global $$val;
        foreach($this->colVars[$val] as $key=>$dataVal) {
            ${$val}[$key] = $dataVal;
        }
    }
//--
このように一つ外に出すと、
"global $$val;" を通るのは$valの値毎に一度だけなので、よりGoodに思います。
実はこれが原因・・・なんてことは無いでしょうか。

> 引数の$colAryにはDBのフィールド名を配列で入れてます。そしてgetQryDataメ
> ソッドでDBのデータを多次元配列で$colVarsに代入しています。ここまでは問題
> なく動作しています。
もし解決しないのであれば、この際思い切って、
getQryDataメソッドは無視して
下の処理を試してみるのもいいかもしれません。
//--
    function getQryVars($db,$sql,$colAry) {
        $con = pg_connect($db);
        $result = pg_query($con, $sql);
        foreach($colAry as $val) {
            global $$val;
        }
        for($i=1;$row=@pg_fetch_array($result,$i);$i++) {
            foreach($row as $key=>$val) {
                ${$key}[$i] = $val;
            }
        }
        return true;
    }
//--
ほとんど同じ処理をしているつもりです。
せっかくDBのフィールド名が入った$colAryがあるので利用してみました。
# 動作テストをしてないのでバグがあるかもしれませんが(^^;

以上



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