[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