[PHP-users 8970] Re: 引数の取得方法

D.Yamashita php-users@php.gr.jp
Fri, 26 Jul 2002 14:34:12 +0900


こんにちは。山下と申します。

このスレ(というのかな?)は、色々と議論が飛び交っていて興味深く
ROMらせて頂いていました。^^;

> (1) a=1&b&c=1&d
> Array ( [a] => 1 [b] => )
>
> (2) a==1&b&c=1&d
> Array ( [a] => =1 [b] => [c] => 1 )
>
> (3) a===1&b&c=1&d
> Array ( [a] => ==1 [b] => [c] => 1 [d] => )
>
> 「=」を数えて「&」で区切って頭から入れてる様に見えます...

本題からはちょっと離れますが、上記の現象が起こる原因(?)
らしき部分をPHP4.2.2のソースファイルから、探してみました。
あっているかどうかはちょっと疑問ですが、おそらくこれではないかと。

--- /main/php_variables.c l195-215 ---

SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler)
{
    char *var, *val;
    char *strtok_buf = NULL;
    zval *array_ptr = (zval *) arg;

    var = php_strtok_r(SG(request_info).post_data, "&", &strtok_buf);

    while (var) {
        val = strchr(var, '=');
        if (val) { /* have a value */
            int val_len;

            *val++ = '\0';
            php_url_decode(var, strlen(var));
            val_len = php_url_decode(val, strlen(val));
            php_register_variable_safe(var, val, val_len, array_ptr
TSRMLS_CC);
        }
    var = php_strtok_r(NULL, "&", &strtok_buf);
    }
}

---

全文を読んだわけではないのであまり大きな事は言えませんが、
これはおそらく
    var = php_strtok_r(SG(request_info).post_data, "&", &strtok_buf);
で、POST(GET)されたデータ(QUERY_STRING ?)を、前から順番に&で区切ってきて
それを変数varに格納し、今度はその変数varを'='で区切って、その値を変数valに、
その長さを変数val_lenに格納しているのではないでしょうか?

# 間違っていたらすみません。。。>PHP開発者の皆様

ソースがこうなっていると、&で区切ってきた文字列の中に'='がなければ
        val = strchr(var, '=');
の返り値がfalseになってしまい、結果的に(上記の例で言うところの)bやdが
出力されなくる。また、最初に現れた'='で区切っているために、

    > (3) a===1&b&c=1&d
    > Array ( [a] => ==1 [b] => [c] => 1 [d] => )

となるのだと思います。

> ちなみに、(1)のようにして echo $_GET["c"]; とやっても何も表示されま
> せん...当方の環境が変なんでしょうか???

私の環境ではちゃんと表示されましたよ。

OS:Debian GNU/Linux sarge
PHP Ver:4.1.2 (Debian Package)
Apache:1.3.26 (Debian Package)

そうそう、本題ですが、>山本様
おそらくQUERY_STRINGをご自身で分解されるのが最も手っ取り早いと
思われます。^^;

では。
失礼いたします。

国国国国国国国国国国国国国国国国国国国国国国国国
大阪大学大学院 工学部研究科 情報システム工学専攻
                        山 下  大 介
  Mail: yamasan@ise.eng.osaka-u.ac.jp
国国国国国国国国国国国国国国国国国国国国国国国国