[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