0

$_GET リクエストを文字列に変換する際に非常に奇妙な問題が発生します。 (PHP 5.2.17)

以下は、print_r() からの配列の問題領域の小さなスニペットです。

_GET (array)
  ...
  [address_country_code] => GB
  [address_name] => Super Mario
  [notify_version] => 3.7
  ...

_GET データが使用される 2 つのケースがあります。

ケース 1):保存して後で使用:

// Script1.php

$data = json_encode($_GET);
# > Save to MySQL Database ($data)


// Script2.php (For Viewing & Testing URL later)

# > Load from Database ($result)
echo http_build_query(json_decoded($result,true));

上記の配列スニペットの結果: (正しい出力)

address_country_code=GB&address_name=スーパー+マリオ¬ify_version=3.7

ケース 2):ケース 1) で保存される直前に、ケース 1) と同じスクリプトで使用されます。

// Script1.php

echo http_build_query($_GET);

結果: (誤った出力)

address_country_code=GB&address_name=Super+Mario¬ify_version=3.7

ケース 2 で ¬ としていくつかの文字が出力される可能性はありますが、ケース 1 は問題ありません! それは私を狂わせています:(

また、http_build_query を使用する代わりに、foreach ループのキーと値で urlencode() を使用して URL を生成するカスタム関数を使用しようとしましたが、テスト ケースの 1 つで ¬ が %C2%AC に変更されました!

4

3 に答える 3

0

ほとんどの場合、このデータを Web ブラウザーに表示しており、それが解釈されています。

&not

特別な HTML エンティティとして。

Pls はこれを参照してください: https://code.google.com/p/doctype-mirror/wiki/NotCharacterEntity

やってみる

var_dump(http_build_query($_GET))

それ以外の:

echo http_build_query($_GET)

実際の文字列を取得/検証するには、HTML ソースを参照してください。

于 2013-06-21T15:28:24.907 に答える
0

データはすべて問題ありません。次の場合に確認できます。

$query = http_build_query($_GET);
parse_str($query, $data);
print_r($data);

破損していない正しいデータが得られます。

シンボルが表示される理由¬は、ブラウザが html エンティティを解釈する方法です。¬ は次のように表され¬ますが、ブラウザは最後にセミコロンがなくてもレンダリングします。

于 2013-06-21T15:24:45.193 に答える
0

したがって、どちらの場合も Web ブラウザーに出力され、両方とも http_build_query() を使用して配列から変換されます。

http_build_query (ケース 1 ではまだ使用されています) を次の関数に置き換えることで、ケース 2 の問題を修正しました。

htmlspecialchars(http_build_query($_GET));
于 2013-06-21T15:59:43.877 に答える