首页 > 解决方案 > 动态查询不使用多选过滤器返回数据

问题描述

我的查询有问题。我有一个表单搜索,其中包含多种类型的选择值。一些过滤器是单选,其中一些是多选值(强制性)。我的问题是当我有多项选择并且需要在我的查询子句WHERE中使用LIKE AND OR.

我使用动态查询 PDO 构建我的结果页面,并且WHERE子句是 implode 和 connect with AND,但我不知道如何添加OR,因为使用多项选择不是强制性的。我在 Result.php 上的代码是:

if (isset($_POST["submit"])) {

    $conditions = [];
    $parameters = [];



    if (isset($_POST["reg"])) {

        $conditions[] = 'region = ? ';
        $parameters[] = isset($_POST['reg']) ? $_POST['reg'] : '' ;

    }

    if(isset($_POST["paravilw"])) {

        $conditions[] = 'stt_rsw = ? ';
        $parameters[] = isset($_POST['paravilw']) ? $_POST['paravilw'] : '' ;

    }


    if (isset($_POST["pros_tre"])) {
        $prev_table ='" OR pros_tresit LIKE "'; 

        $value_rank = $_POST["pros_tre"];
        $value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection
        $value_rank_explode = explode('|', $value_rank_implode);


        $conditions[] = ' pros_tresit LIKE ? ';
        $parameters[] = '%'.$value_rank_implode.'%';

        //$parameters[] =  '%' . implode("%' or pros_tresit like '%", $_POST['pros_tre']) .'%';


        var_dump($parameters);
        //print_r($parameters);
    }

    $sql = "SELECT * FROM import ";

    if ($conditions)
    {
        $sql .= " WHERE " .implode(" AND  ", $conditions);

    }



    $stmt = $pdo->prepare($sql);
    $stmt->execute($parameters);
    $data = $stmt->fetchAll();
    $total_row = $stmt->rowCount();
    $output = '';

  }

现在我将解释我试图做什么。我使用 implode 方法OR pros_tresit LIKE手动添加每个选定的新值。

$prev_table ='" OR pros_tresit LIKE "'; 
        $value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection

但不是返回数据我的var_dump($sql)结果是

SELECT * FROM import WHERE region = ? AND stt_rsw= ? AND pros_tresit LIKE ?

var_dump($parameters);的是:

array(3) { [0]=> string(2) "NOS" [1]=> string(4) "TRUS" [2]=> string(43) "%Sil%" OR pros_tresit LIKE "%Unr%"

如果复制粘贴最后一个数组 [2] 并在我的数据库中手动运行它可以工作并返回数据变成这样:

  SELECT * FROM import WHERE region = 'NOS' AND stt_rsw = 'TRUS' AND pros_tresit  LIKE  "%Sil%" OR pros_tresit  LIKE "%Unr%"

我不知道如何通过多选解决这个问题OR table_name LIKE 你能帮我吗?

标签: php

解决方案


嘿伙计们,我找到了一种有效的方法,但不是我期望的那样

  1. 我评论了所有代码
 if (isset($_POST["pros_tre"])) {
        $prev_table ='" OR pros_tresit LIKE "'; 

        $value_rank = $_POST["pros_tre"];
        $value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection
        $value_rank_explode = explode('|', $value_rank_implode);


        $conditions[] = ' pros_tresit LIKE ? ';
        $parameters[] = '%'.$value_rank_implode.'%';

        //$parameters[] =  '%' . implode("%' or pros_tresit like '%", $_POST['pros_tre']) .'%';


        var_dump($parameters);
        //print_r($parameters);
    }

而且我在这里做了类似的事情,其余代码在所有条件下都非常好

    if ($_POST["pros_tre"] && $conditions){

        $sql = "SELECT * FROM import ";

        $sql .= " WHERE " .implode(" AND  ", $conditions);

        $sql .= " AND pros_tresit LIKE  '%" . implode("%' or pros_tresit like '%", $_POST['pros_tre']) ."%'";
    }

我要感谢来自 GitHub 的“noahheck”,因为我安装在我的项目中

E_PDO语句

当您有大量查询并需要查看它在 SQL 中的数据时非常有用。例如,这个函数可以帮助我调试我的查询语句。

我知道这不是完美的解决方案,但暂时它可能会在几周或几个月内起作用,在我获得更多关于 PHP 的知识后,我会弄清楚如何去做。

感谢stackoverflow


推荐阅读