1. ホーム
  2. php

[解決済み] PHP に $_GET や $_POST 配列の '.' 文字を置換させないようにさせるには?

2023-05-14 19:02:45

質問

PHP の変数を . を含む PHP 変数を $_GET で渡した場合、PHP はそれらを自動的に _ 文字に置き換わります。例えば

<?php
echo "url is ".$_SERVER['REQUEST_URI']."<p>";
echo "x.y is ".$_GET['x.y'].".<p>";
echo "x_y is ".$_GET['x_y'].".<p>";

...は以下のように出力します。

url is /SpShipTool/php/testGetUrl.php?x.y=a.b
x.y is .
x_y is a.b.

... 私の質問はこれです:そこに はあるのでしょうか? はあるのでしょうか?私はこれに値するために何をしたのか、私の人生のために把握することはできません。

私が使用している PHP のバージョンは、5.2.4-2ubuntu5.3 です。

どのように解決するのですか?

PHP.netの説明で、なぜそうなるのかを説明しています。

入力される変数名におけるドット

通常、PHP は変数名が変更されることはありません。 変数がスクリプトに渡されたときに、変数名を変更することはありません。 スクリプトに渡される変数名を変更することはありません。しかし ドット (ピリオド。 フルストップ) は有効な文字ではないことに注意しましょう。 は PHP の変数名として有効な文字ではないことに注意しましょう。その理由は を見てください。

<?php
$varname.ext;  /* invalid variable name */
?>

さて、パーサーが見るのは という名前の変数が見つかります。 という変数と、それに続く文字列 連結演算子、そして 素文字列 (つまり、引用符で囲まれていない文字列) 既知のキーや予約語にマッチしない ext'です。明らかに、これは は意図した結果にはなりません。

このような理由から、重要なのは PHPは自動的に は入力された変数名のドットをアンダースコアに置き換えます。 をアンダースコアに置き換えます。

それは http://ca.php.net/variables.external .

また、曰く このコメント によると、これらの他の文字はアンダースコアに変換されます。

<ブロッククオート

PHP が _ (アンダースコア) に変換するフィールド名文字の完全なリストは以下のとおりです (ドットだけではありません)。

  • chr(32) ( ) (スペース)
  • chr(46) (.) (ドット)
  • chr(91) ([) (開き角括弧)
  • chr(128)~chr(159)(各種)

で、引っかかったようなので、スクリプト内でアンダースコアをドットに戻すには、以下の方法で変換する必要があります。 dawnerd の提案 を使ってください (私なら str_replace を使いますが)。