【问题标题】:PHP If statements not working when filtering SQL table过滤SQL表时PHP If语句不起作用
【发布时间】:2017-04-23 23:39:57
【问题描述】:

这是我的问题:我有一组用于“过滤”SQL 表的输入。当使用一个“过滤器”时,我的代码可以正常工作,但是当我尝试使用多个(即 $states 和 $keywords)时,它只会给我一个过滤器。在这种情况下,仅使用 $states。请注意,在下面的代码中,我使用简单的字符串来测试(伪)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;
}

更新的 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";
    }

【问题讨论】:

  • 一个过滤器 -- WHERE filter 两个过滤器 -- WHERE filter1 AND filter2 -- 您的代码不遵循这种格式。
  • 在使用elseif的时候,如果前面语句的条件都满足了,那么就永远不会到达elseif语句。

标签: php html mysql sql


【解决方案1】:

如果你有 elseif,它可能会通过第一个而不是多个。因此,因此不将查询组合在一起。首先放置多个,然后放置更正常/默认的最后一个应该对问题进行排序。

仅供参考,我不会用它来制作 sql - 你应该使用 fluentPDO 之类的东西 http://envms.github.io/fluentpdo/

这样的事情使您的代码更安全,更容易进行 SQL 查询。

【讨论】:

  • 确实是这个问题!感谢您的洞察力。我更新以反映这个想法。另外,既然我知道它是一件事,我将研究 fluentPDO。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多