以下のリンクは問題ですが、「.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);