3

ページの内容を変更したいリンクを 2 つ作成しました。問題は、ページ コンテンツではなく URL の変更です。

<h3>Filter Results</h3>
<p><a href="index.php?filter='Action'>Action</a></p>
<p><a href="index.php?filter='Comedy'">Comedy</a></p>
if (isset($_GET['filter']) == 'Action') {
    echo 'Action';  
}
else if (isset($_GET['filter']) =='Comedy') {    
    echo 'Comedy';
}

常に最初のリンク情報「Action」を出力します。

4

10 に答える 10

7

リンクに問題があります:

<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
<!--                         ^    ^ No single quotes (' ') -->

Yogesh Suthar が最初に指摘した

また、ブール値 (または; 変数が設定されているかどうかに基づいて)isset()を返します。ブール値と文字列を比較していると、文字列は常に変換されます(文字列が "false" などでない限り)。したがって、基本的に、変数が設定されている場合、最初の条件は常に一致します。truefalseTRUE

あなたがしたい

if (isset($_GET["filter"]) && $_GET["filter"] === "Action")

の使用に注意してください===。これにより、変数が他のタイプの変数ではなく、あなたが思っているとおりのものであることが確認されます。

さらにいくつかのポイント(他の回答から恥知らずに盗まれた)

  • 考えられるフィルターが複数ある場合は、変数の存在を一度確認し、switch/caseブロックを使用してそれらのどれであるかを判断します。

    if(isset($_GET['filter'])) {
        switch($_GET['filter']) {
            case 'Action':
                echo 'Action';
                break;
            case 'Comedy':
                echo 'Comedy';
                break;
        }
    }
    
于 2013-07-26T09:25:34.417 に答える
5

この関数issetは、変数が存在するかどうかのみをチェックします! その値は返されません。代わりにこれを試してください:

<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter']) && $_GET['filter'] == 'Action'){
    echo 'Action';  
}

else if(isset($_GET['filter']) && $_GET['filter'] == 'Comedy') {
    echo 'Comedy';
}

また、スイッチを使用すると、将来的には簡単になる可能性があります。

<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter'])) {
    switch($_GET['filter']) {
        case 'Action':
            echo 'Action';
            break;
        case 'Comedy':
            echo 'Comedy';
            break;
    }
}
于 2013-07-26T09:25:27.557 に答える
1

issetが返さtrueれ、'Action'is notnullであるため、true と評価されます。

if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Action')) {
    // ...
} else if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Comedy')) {
    // ...
}

ところで、そのようなコードは遅かれ早かれ維持するのに悪夢になるでしょう。

代わりに、たとえば

function preventDirectoryTraversal($requestParam) {
    return preg_replace("/\//", "", $requestParam);
}

// ...

if (isset($_GET['filter'])) {
    $filterName = preventDirectoryTraversal($_GET['filter']);
    include(FILTERS_DIR . "/" .  $filterName . ".php");
}

または似たようなもの。もちろん、これはさらに改善される可能性がありますが、要点を理解していただければ幸いです。

于 2013-07-26T09:25:35.170 に答える
0
//isset will always return true or false
if(isset($_GET['filter'])){

    if($_GET['filter']=='Action')
    {
        echo 'Action';

    }elseif($_GET['filter']=='Comedy'){

        echo 'Comedy';

    }

}
于 2013-07-26T10:19:39.927 に答える