[PHP-users 8991] Re: segfault (was Re: 引数の取得方法)

Moriyoshi Koizumi php-users@php.gr.jp
Sat, 27 Jul 2002 04:31:42 +0900


小泉@町田です。

すいません。
手違いでうっかりメールの題名を segfault にしてしまいましたが
全く動作には問題ありません。
無視してください。

Moriyoshi Koizumi <readjust@deneb.freemail.ne.jp> wrote:

> 小泉@町田です。
> 
> 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
> 
> _______________________________________________
> PHP-users mailing list
> PHP-users@php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users