<?
$xm="1?x=1";
if($_GET["x"]=="1" || $_GET["x"]=='$xm'){ ?>
String Works
<? } ?>
基本的に、URL は次のようになります。
http://site.com/shop/category/product?x=1?x=1
これは、フォームが送信されたときに発生します。次のように変更するアクセス権がありません:
http://site.com/shop/category/product?x=1&x2=1
次のように変更します。
<?
$xm="1?x=1";
if($_GET["x"]=="1" || $_GET["x"]=="{$xm}"){ ?>
String Works
<? } ?>
URL が のように見える場合...product?x=1?x=1、$_GET配列は次のようになります。
array(1) {
["x"] => string(5) "1?x=1"
}
したがって、条件は次のようにする必要があります。
if ($_GET["x"] == '1?x=1')
問題は、変数$xmを一重引用符で囲み、文字通り文字列「$xm」になることです。
明らかに、これはかなり壊れた URL です。その中で何回発生するかわからない場合?x=1、一定のものと比較することは困難です。
あなたが持っているものは、次のように'$xm'評価されない変更で機能するはずです"1?x=1":
if (isset($_GET['x']) && ($_GET['x'] == 1 || $_GET['x'] == $xm)) {
echo 'string works';
}
引数が常に数値である場合は、これを書いて$_GET['x']比較前に整数に強制することもできます:
if (isset($_GET['x']) && $_GET['x'] == 1) {
echo 'string works';
}
これは機能しますが'1?x=1' == 1、それが'1?x=2' == 1望ましい動作でない場合はお知らせください。
リンクを作成したいときはいつでもhttp_build_queryを使用してください
等号は、URL コンテキストで特別な意味を持ちます。urnencode() または rawurlencode() または base64 エンコードを使用して、リテラル値のように扱うためにエンコードする必要があります。