Как совместить 2 разных фильтра - PullRequest
0 голосов
/ 09 мая 2019

Я создал этот простой фильтр для интервала дат и разных уровней (0,1,2).Пока у меня есть этот код:

if(isset($_POST['filtersubmit'])){
    $datex = str_replace('/', '-', $_POST['firstdate']);
    $date1 = date("Y-m-d", strtotime($datex));
    $datey = str_replace('/', '-', $_POST['lastdate']);
    $date2 = date("Y-m-d", strtotime($datey));
    $projects = $_POST['projekt'];



    if(isset($date1) && isset($date2)){
        $query = mysqli_query($conn, "SELECT * FROM zapasy WHERE datum BETWEEN 
        '$date1' AND '$date2' ORDER BY id DESC");
    }  


    if($projects == 0){
        $query = mysqli_query($conn, "SELECT * FROM zapasy WHERE projekt = '0' ORDER BY id DESC") or die(mysqli_errno($conn). '-'. mysqli_error($conn));
    } elseif($projects == 1){
        $query = mysqli_query($conn, "SELECT * FROM zapasy WHERE projekt = '1' ORDER BY id DESC") or die(mysqli_errno($conn). '-'. mysqli_error($conn));
    } elseif($projects == 2){
        $query = mysqli_query($conn, "SELECT * FROM zapasy WHERE projekt = '2' ORDER BY id DESC") or die(mysqli_errno($conn). '-'. mysqli_error($conn));
    } 
}

Теперь, если я выберу только один из этих фильтров, он будет работать хорошо, но если мне нужны фильтры интервалов и уровней, он не будет работать.Я не совсем уверен, как это сделать.Я очень благодарен за любую помощь.

1 Ответ

1 голос
/ 09 мая 2019

Я бы использовал что-то в этом духе, используя подготовленное выражение, чтобы защитить вас от внедрения SQL. В основном мы формируем массивы WHERE предложений, параметров и типов параметров из каждого фильтра, если он присутствует в массиве $_POST. Затем они внедряются в запрос, параметры привязываются и запрос выполняется.

if (isset($_POST['filtersubmit'])) {
    $params = array();
    $paramtypes = array();
    $wheres = array();
    if (isset($_POST['firstdate'], $_POST['lastdate'])) {
        $date1 = date_create_from_format('m/d/Y', $_POST['firstdate']);
        $date2 = date_create_from_format('m/d/Y', $_POST['lastdate']);
        if (!empty($date1) && !empty($date2)) {
            array_push($params, $date1->format('Y-m-d'), $date2->format('Y-m-d'));
            array_push($paramtypes, 's', 's');
            array_push($wheres, 'datum BETWEEN ? AND ?');
        }
    }
    if (isset($_POST['projekt'])) {
        $project = $_POST['projekt'];
        if (is_numeric($project) && $project >= 0 && $project <= 2) {
            array_push($params, $project);
            array_push($paramtypes, 'i');
            array_push($wheres, 'projekt = ?');
        }
    }
    $sql = 'SELECT * FROM zapasy';
    if (count($wheres)) {
        $sql .= ' WHERE ' . implode(' AND ', $wheres);
    }
    $sql .= ' ORDER BY id DESC';
    $stmt = $conn->prepare($sql) or die($conn->error);
    if (count($wheres)) {
        $stmt->bind_param(implode('', $paramtypes), ...$params);
    }
    $stmt->execute() or die($stmt->error);
    // bind results
    $stmt->bind_result(/* variables corresponding to each field in SELECT */);
    while ($stmt->fetch()) {
        // do something with the data
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...