0

ユーザーが独自のカスタム クエリ キーを定義できるフォームを作成しようとしています。フォームの検証機能をテストしているとき%20に、URL クエリ キーが $_GET 配列のアンダースコアに変換されていることに気付きました。 .

$key = 'a b';
$key = rawurlencode($key);
$value = 'value';

print_r($_GET); // output: Array ( [a_b] => value )

echo '<p>key:' . $key . '</p>';
echo '<p>value:' . $value . '</p>';
echo '<p><a href="' . $_SERVER["REQUEST_URI"] . '?' . $key . '=' . $value . '">test</a></p>';

変則的に変換された他の文字はありますか? この動作には規則があるかもしれないので、ここで「不規則」という言葉が正しいかどうかはわかりませんが、これが起こるとは思っていませんでした。

4

2 に答える 2

2

この関数はそれらの文字列を修正します。

$key = 'a b.c[d';
$key = fix_key($key);
$value = 'value';
$_GET[$key] = $value;
print_r($_GET);
echo '<p><a href="' . $_SERVER["REQUEST_URI"] . '?' . $key . '=' . $value . '">test</a></p>';

function fix_key($strKey) {
    $search = array(chr(32), chr(46), chr(91));
    for ($i=128; $i <= 159; $i++) array_push($search, chr($i));
    return str_replace ( $search , '_', $strKey);
}
于 2012-10-06T06:03:09.107 に答える
2

PHP は、特定の文字を変数名に使用できないため、アンダースコアに置き換えます。それらは配列キーでは合法ですが、以前のバージョンの PHP では、フォーム変数を直接変数に入れていました (つまり、 Register Globals$a_bを参照)。そのため、この変換が組み込まれました。これは、スペース、ドット、開き角括弧、および制御文字で行われます。 128 から 159 の間。

http://example.com/foo.php?a[b.%20c]=1これは、配列キーでは任意の文字が有効であるため、配列キー パラメータ (つまり ) などではなく、名前自体でのみ行われます。_(配列パラメーター機能自体は、特定の状況では、上記で暗示されているように、左角括弧が に置き換えられないことを意味することに注意してください。例では$_GET['a']['b. c'] == 1.)

ソース: http://ca.php.net/variables.external

関連する質問: PHP に「.」の置換を停止させる $_GET または $_POST 配列の文字?

于 2012-10-05T04:18:34.907 に答える