2016-12-08 6 views
1

私の問題は次のとおりです。SQLテーブルをフィルタリングするために使用される一連の入力があります。 1つの "フィルタ"を使用すると、私のコードは正常に動作しますが、複数の状態(つまり$状態と$キーワード)を使用しようとすると、1つのフィルタしか使用できなくなります。この場合、$状態のみが使用されます。 BE AWARE、以下のコードでは、単純な文字列を使用して(疑似)SQL文がどのように見えるかをテストしています。私は1つ、または "フィルタ"の任意の組み合わせが必要です。私はif文が早期に本当に戻ってくると感じていますか?または多分ちょうど構造が間違っているPHP SQLテーブルをフィルタリングするときにIf文が機能しない

HTML:

<form id="ask-topics" method="post" action="<?php echo $_SERVER['PHP_SELF']?>"> 
<div> 
    <input id="all" type="radio" name="opt" value="all" /><label for="all">ALL documents</label> 
    <input id="new" type="radio" name="opt" value="new"/><label for="new">NEW documents</label> 
</div> 
<div> 
    <input id="keywords" type="text" class="text-box" name="keywords" placeholder="Type keywords..." /> 
</div> 
<div> 
    <input id="conn" type="checkbox" name="state_chk[0]" class="state-chk" value="CT" /><label for="conn">Conn.</label> 
    <input id="nh" type="checkbox" name="state_chk[1]" class="state-chk" value="NH"/><label for="nh">N.H.</label> 
    <input id="nj" type="checkbox" name="state_chk[2]" class="state-chk" value="NJ" /><label for="nj">N.J.</label> 
    <input id="ny" type="checkbox" name="state_chk[3]" class="state-chk" value="NY"/><label for="ny">N.Y.</label> 
    <input id="vt" type="checkbox" name="state_chk[4]" class="state-chk" value="VT" /><label for="vt">VT</label> 
</div> 
<div> 
    <input name="submit" class="button-link" type="submit" value="submit" /> 
</div> 

PHP/SQL(疑似)

if (isset($_POST['submit'])){ 
$keyword = $_POST['keywords']; 
$states = $_POST['state_chk']; 
$doc_opt = $_POST['opt']; 
$query_filter = ""; 
$new_query = "Select `some colunms` 
      FROM `this_table` 
      LEFT JOIN this_other_table 
      ON this_other_table.column = this_table.categoryid"; // Add WHERE/ORDER BY after 
    if ($states){ 
     $query_filter = " A WHERE statement to get state specific documents"; 
    } 
    elseif($keyword){ 
     $query_filter = "a WHERE statemenrt to filter keywords"; 
    } 
    elseif($doc_opt == "new"){ 
     $query_filter = " an ORDER BY statement to show only new documents"; 
    } 
    // USING MULTIPLE FILTERS 
    elseif($keyword && $doc_opt == "new"){ 
     $query_filter = " a WHERE and ORDER BY statement for getting keywords and new documents"; 
    } 
    elseif($doc_opt == "new" && $states){ 
     $query_filter = " a WHERE and ORDER BY statement for getting state specific docs and new docs"; 
    } 
    elseif($keyword && $states){ 
     $query_filter = " a WHERE statement for getting keywords and state specific docs"; 
    } 
    else{ 
     $query_filter = " a generic WHERE AND ORDER BY statement"; 
    } 
      echo $new_query.=$query_filter; 
} 

UPDATED PHP:

// CHECK FOR MULTIPLE FILTERS FIRST! 
    if ($keyword && $doc_opt == "new" && $states){ 
     $query_filter = " a WHERE/ORDER BY statemenrt to filter all three cases"; 
    } 
    elseif($keyword && $doc_opt == "new"){ 
     $query_filter = " a WHERE/ORDER BY statemenrt to filter keywords and new documents"; 
    } 
    elseif($doc_opt == "new" && $states){ 
     $query_filter = " a WHERE/ORDER BY statemenrt to filter new documents by specific states"; 
    } 
    elseif($keyword && $states){ 
     $query_filter = " a WHERE statemenrt to filter keywords and specific states"; 
    } 
    elseif($doc_opt == "new" && $states){ 
     $query_filter = " a WHERE/ORDER BY statemenrt for getting state specific new documents"; 
    } 
    elseif($keyword && $states){ 
     $query_filter = " a WHERE statement for getting keywords in state specific documents"; 
    } 
    // IF NO MULTIPLE CASES CHECK FOR INDIVIDUAL CASES SECOND! 
    elseif ($states){ 
     $query_filter = " A WHERE statement to get state specific documents"; 
    } 
    elseif ($keyword){ 
     $query_filter = "a WHERE statement to filter keywords"; 
    } 
    elseif ($doc_opt == "new"){ 
     $query_filter = " an ORDER BY statement to show only new documents"; 
    } 
    // IF NO FILTER INPUTS WERE USED GET A GENERIC SET OF RESULTS LAST! 
    else{ 
     $query_filter = " a generic WHERE AND ORDER BY statement"; 
    } 
+0

1つのフィルタ - 'WHEREフィルタ' 2つのフィルタ - 'WHERE filter1 AND filter2' - あなたのコードはこのフォーマットに従いません。 – Hogan

+0

elseifを使用する場合、前のステートメントの条件が満たされている場合、elseifステートメントには決して到達しません。 –

答えて

1

あなたはそれELSEIF持っている場合は、おそらくの1つを介して起こっています最初のものではなく、th e倍。だから、一緒にクエリを組み合わせていない。最初に複数を配置し、その後に通常/デフォルトを最後に配置すると、問題が分類されます。

FYI私は、SQLを作るために、これを使用していないだろう - あなたはこのようなhttp://envms.github.io/fluentpdo/

物事はあなたのコードがより安全とSQLクエリを作ることが非常に簡単に作るfluentPDO のようなものを使用する必要があります。

+0

それは本当に問題でした!その洞察に感謝します。私はその考えを反映するように更新しました。また、私はfluentPDOを見て、今私はそのことを知っています。 –