[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
国国国国国国国国国国国国国国国国国国国国国国国国