[PHP-users 8990] segfault (was Re: 引数の取得方法)
Moriyoshi Koizumi
php-users@php.gr.jp
Sat, 27 Jul 2002 04:29:15 +0900
小泉@町田です。
mbstr_enc_trans が有効なときは、
ext/mbstring/mbstring.c 内の php_mbstr_encoding_handler() 関数で処理する
みたいですね。
コードを見ていると、確かに "=" の個数によって処理をしているようです。
"D.Yamashita" <yamasan@ise.eng.osaka-u.ac.jp> wrote:
> こんにちは。山下と申します。
>
> このスレ(というのかな?)は、色々と議論が飛び交っていて興味深く
> 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
> 国国国国国国国国国国国国国国国国国国国国国国国国
>
> _______________________________________________
> PHP-users mailing list
> PHP-users@php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users