2

以下のリンクは問題ですが、「.amp;」(投稿する前にこの質問を表示すると、貼り付けたリンクが表示されないことがわかります。これは、まさに $_GET 変数名でやろうとしていることです。パラメーター名から amp; を削除します)

index.php?SearchResults&SearchString=aliquippa&AllWords=off

$_GET 要素には amp; という名前が付けられます。私が期待する名前の前に。たとえば、$_GET[amp;AllWords'] は変数の命名方法です。$_GET['AllWords'] 形式が必要です。

私の「サイト」のすべてのリンクは、最終的な戻り値に htmlspecialchars を適用する標準クラス関数によって構築され、返されます。各リンクは、必要なタスクに固有のクラス関数によって構築され、この標準関数を呼び出すことによって返されます。すべてのリンクは同じ標準関数を介して返されますが、リンクの誤動作は 1 つだけです。

このリンクは、ユーザー入力を受け取り、それを $_GET パラメーターを介して (リダイレクト?) 戻そうとしたのは初めてです。& が二重になっているようなものです。コードが 2 番目のアンパサンドを追加していないことは確かです。

解決策として、私はすぐに POST 変数に対して htmlspecialchars_decode() を見つけて試しました。$_GET パラメーターに割り当てられた名前と違いはありませんでした。エンコードされたものをデコードしてロジックを実行する以外に、私は理解に途方に暮れています。エラーのあるリンクを作成するコードは、正常に機能するリンクを作成するコードと同じように見えます。すべてのリンクは、htmlspecialchars を適用する標準関数を介して返されます。すべてのリンクが機能するか機能しないかのどちらかであり、混合ではないと思います。

以下は、$_GET 配列に 'Search' という名前のパラメーターが含まれている場合にリダイレクトに使用されるコードです。この関数にログ ファイルへの書き込みを追加したところ、Link::ToSearchResults からの戻り値に "2 つの &" が含まれています。

if (isset($_GET['Search']))
{
    $this->mSearchString = $_POST['search_string'];
$this->mAllWords = isset($_POST['all_words']) ? $_POST['all_words'] : 'off';

    ob_clean();

    header('HTTP/1.1 302 Found');
header('Location: ' . Link::ToSearchResults($this->mSearchString, $this->mAllWords));

    flush();
    ob_flush();
    ob_end_clean();
    exit;
}

ToSearchResults 関数のコードは次のとおりです。

$link = 'index.php?SearchResults';
if (empty($searchString))
$link .= '/';
else
    $link .= '&SearchString=' . $searchString;

$link .= '&AllWords=' . $allWords;

return self::Build($link);

以下は、標準クラス関数 Build() からの戻り値です。すべてのリンクは、呼び出し元に戻る前にこの関数を通過します。

return htmlspecialchars($link, ENT_QUOTES);
4

1 に答える 1

1

この問題は、'&' を含む値をBuildメソッドに渡すと発生します。このメソッドは、HTML エンティティで HTML 特殊文字をエスケープしています。結果のリンクは次の形式になります。

index.php?SearchResults&SearchString=aliquippa&AllWords=off

PHP の URL パーサーは HTML エンティティに遭遇することを想定していません。したがって、クエリ文字列を で正しく分割し&、末尾amp;をキーの一部として扱います。この問題を解決するには、URL を に渡さないでくださいhtmlspecialchars()

于 2013-07-31T14:24:36.003 に答える