【问题标题】:filter html table results after clicking on dropdown entry单击下拉条目后过滤 html 表格结果
【发布时间】:2019-02-24 13:06:49
【问题描述】:

单击我的 sql 表中填充的下拉条目后,我可以过滤我的表。默认情况下,该表向我显示数据库中“完成”和“打开”的结果。我想要的是我的下拉列表中的一个静态条目,它向我显示“所有”结果以及“正在进行”结果。

这是我的 sql 表:

+--------+------+----------+
|StatusID| name |  status  |
+--------+------+----------+
|      1 | TC   | open     |
|      2 | HTS  | on going |
|      3 | HTOL |finished  |
+--------+------+----------+

这是我的 html 下拉列表,带有 php 代码,它提供了 sql 表中的条目。

<th>
    <td>
        <label class="wmfg_label_a" for="chk_Status">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
    </td>
    <td>
        <select name="StatusIDSuch[]" multiple="multiple">
            <option disabled selected value> </option>;
            <option value="alle" <?php if ($StatusIDSuch=="alle") echo 'selected="selected"'; ?>>alle</option>;                  
            <?php 
                foreach($result as $m)
                {
                    echo "<option value=\"" . $m['StatusID'] . "\">" .$m['Status'] . "</option>";
                }
            ?>
        </select>
    </td>
</th>

这里尝试显示所有条目 1、2 3,不仅是我的默认 1,2,而且它不起作用。重点是带有“alle”这个词的行。

if(isset($_POST['StatusIDSuch'])) {
    if ($StatusIDSuch == "alle"){
        $search .= "WHERE StatusID IN ('1', '2', '3')";
        var_dump($StatusIDSuch);
    } else {
        $i = 0;
        $selectedOptionCount = count($_POST['StatusIDSuch']);
        $selectedOption = "";

        while ($i < $selectedOptionCount) {
            $selectedOption = $selectedOption . "'" . $_POST['StatusIDSuch'][$i] . "'";

            if ($i < $selectedOptionCount -1){
                $selectedOption = $selectedOption . ", ";
            }
            $i ++;
        }

        $search .= " WHERE StatusID IN (".$selectedOption.")";
    }
}

感谢您的帮助。

【问题讨论】:

  • 向我们展示您的实际完整查询。现在我只能看到您正在尝试在仅包含 PK_ID 的表中选择 StatusID
  • 完全抛弃if(isset($_POST['StatusIDSuch'])) { 部分,您将能够看到所有内容
  • 表格已编辑。并且 .$search 被添加到完整的查询中。
  • 另外,请检查您的 HTML 标记。它包含错误(选择和 th 元素未关闭)。如果您使用正确的代码缩进,您将来可以防止这种情况发生。
  • @cemal 不知道如果我理解正确,我应该删除该部分吗?重点是默认情况下我只想显示结果打开并持续进行。

标签: php html search drop-down-menu filter


【解决方案1】:

根据你的代码,变量$StatusIDSuch之前没有设置,所以它永远不能等于"alle"

if(isset($_POST['StatusIDSuch']) && is_array($_POST['StatusIDSuch']) && count($_POST['StatusIDSuch']) > 0) {
    $show_default = false;
    for($i=0,$count=count($_POST['StatusIDSuch']);$i<$count;$i++) if ($_POST['StatusIDSuch'][$i] == "alle") $show_default = true;

    if ($show_default){
        $search .= "WHERE StatusID IN ('1', '2', '3')";
    } else {

        $i = 0;
        $selectedOptionCount = count($_POST['StatusIDSuch']);
        $selectedOption = "";

        while ($i < $selectedOptionCount) {
            if (!is_numeric($_POST['StatusIDSuch'][$i])) continue; //only numeric values must be accepted to prevent sql injection
            $selectedOption = $selectedOption . "'" . $_POST['StatusIDSuch'][$i] . "'";

            if ($i < $selectedOptionCount -1){
                $selectedOption = $selectedOption . ", ";
            }
            $i ++;
        }

        $search .= " WHERE StatusID IN (".$selectedOption.")";
    }
}

对于查询的构建,以下更好、更快、更安全

if ($show_default){
    $search .= "WHERE StatusID IN ('1', '2', '3')";
} else {
   $vals = array_filter($_POST['StatusIDSuch'],'is_numeric');

   if (count($vals)) $search .= " WHERE StatusID IN (".implode(',', $vals).")";
}

【讨论】:

  • 对.. 抱歉,我错过了那部分,因为我正在查看您的代码。我的错!
  • 当我选择“alle”并提交时,我没有得到结果。 var_dump($StatusIDSuch) 向我展示了 array(1) { [0]=> string(4) "alle" }
  • 更新后,我似乎忘记了用$_POST['StatusIDSuch'] 替换变量$StatusIDSuch。我现在已经更正了。我发布的代码中没有$StatusIDSuch,因为不需要它。
  • 恕我直言,语义上使用alle(德语对吧?)显示默认StatusIDs,可能不是最佳选择。
  • 为什么“alle”不是一个好词。但我更新了所有喜欢你的代码。当我回显 $_POST['StatusIDSuch'];它说数组,它不应该用值“alle”填充以显示 ID 1,2 和 3?
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 2020-10-15
  • 2021-07-03
  • 2019-12-16
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多