php - 使用多个过滤器过滤数据时,只有选择一个特定过滤器后,所有过滤器才会显示数据

标签 php mysql

所以我的网站有一些过滤器。它们都正确过滤数据,但前提是选择了所有过滤器。 如果我选择一个城市,那么它不会显示任何数据,如果我只选择眼睛颜色,那么它将不起作用,如果我选择种族......什么也没有。我必须选择城市、眼睛颜色、头发颜色和种族,才能显示任何数据。我希望用户能够从每个下拉列表中进行任何选择,它将查询并显示数据。当用户选择某些内容时,它会通过 ajax 更新页面。 这是我的过滤器。很抱歉这篇文章很长...有一些过滤器。

<小时/>

更新:我正在尝试从 2 个表(ADS 表和 USERS 表)中提取数据。问题是,当我仅选择查询 ADS 表的下拉列表时,一切正常,一旦我将用户表过滤器添加到组合中,那么我需要在显示查询之前使用每个表中的下拉列表。

// Set conditions for search 
$whereSQL = $orderSQL = '';
//City selection
if(isset($_POST['city']) || !empty($_POST['city'])){    
    $city = $filter->filter($_POST['city']);
    $whereSQL .= " AND ads.ad_city = :city "; 
}else{
    $city = '';
    $whereSQL .= " AND ads.ad_city != :city "; 
}
//Rate Filter
if(isset($_POST['rateSelect']) || !empty($_POST['rateSelect'])){
    $rate = $_POST['rateSelect'];
    if($rate == "all"){
        $whereSQL .= "AND ads.ad_rate >= 0 ";
    }
    else if($rate == "rate1"){
        $whereSQL .= "AND ads.ad_rate BETWEEN 0 AND 150 ";
    }
    else if($rate == "rate2"){
        $whereSQL .= "AND ads.ad_rate BETWEEN 151 AND 250 ";
    }
    else if($rate == "rate3"){
        $whereSQL .= "AND ads.ad_rate BETWEEN 251 AND 350 ";
    }
    else if($rate == "rate4"){
        $whereSQL .= "AND ads.ad_rate BETWEEN 351 AND 5000 ";
    }else{
        $whereSQL .= "AND ads.ad_rate >= 0 ";
    }
}
//Keywords Filter
if(isset($_POST['keywords']) || !empty($_POST['keywords'])){    
    $keywords = $filter->filter($_POST['keywords']);
    $whereSQL .= "AND ads.ad_content LIKE :keywords "; 
}else{
    $keywords = '';
    $whereSQL .= "AND ads.ad_content LIKE :keywords ";
}
//Ethnicity Filter
//So once these filters from the USERS table are added, the query wont return anything until I select the city and other dropdowns with it.
if(isset($_POST['ethnicity']) || !empty($_POST['ethnicity'])){
    $ethnicity = $filter->filter($_POST['ethnicity']);
    if($ethnicity == "ethnicityall"){
        $whereSQL .= "AND users.ethnicity != :ethnicity ";
    }else{
        $whereSQL .= "AND users.ethnicity = :ethnicity ";
    }
}else{
    $ethnicity = '';
    $whereSQL .= "AND users.ethnicity != :ethnicity ";
}
//Eye color filter
if(isset($_POST['eyeColorSelect']) || !empty($_POST['eyeColorSelect'])){ 
    $eyeColor = $filter->filter($_POST['eyeColorSelect']);
    if($eyeColor == "eyeColorAll"){
        $whereSQL .= "AND users.eyeColor != :eyeColor ";
    }else{
        $whereSQL .= "AND users.eyeColor = :eyeColor ";
    } 
}else{
    $eyeColor = '';
    $whereSQL .= "AND users.eyeColor != :eyeColor ";
}
//Hair color filter
if(isset($_POST['hairColor']) || !empty($_POST['hairColor'])){
    $hairColor = $_POST['hairColor'];
    if($hairColor == "hairColorAll"){
        $whereSQL .= "AND users.hair != :hairColor ";
    }else{
        $whereSQL .= "AND users.hair = :hairColor ";
    }
}else{
    $hairColor = '';
    $whereSQL .= "AND users.hair != :hairColor ";
}
//Height in inches
if(isset($_POST['height']) || !empty($_POST['height'])){
    $height = $filter->filter($_POST['height']);
    if($height == "heightAll"){
        $whereSQL .= "AND users.height >= 0 ";
    }else if($height == "lessFive"){
        $whereSQL .= "AND users.height > 1 AND users.height < 152 ";
    }else if($height == "five"){
        $whereSQL .= "AND users.height > 151 AND users.height < 168 ";
    }else if($height == "fiveSix"){
        $whereSQL .= "AND users.height > 167 AND users.height < 183 ";
    }else if($height == "sixplus"){
        $whereSQL .= "AND users.height > 182 ";
    }
}
//Female filter
if(isset($_POST['female']) || !empty($_POST['female'])){
    $female = $_POST['female'];
    if($female == '1'){
        $whereSQL .= "  AND ads.ad_female >= '1'";
    }else if($female = false){
        $whereSQL .= "  AND ads.ad_female == '0'";
    }
}
//male filter
if(isset($_POST['male']) || !empty($_POST['male'])){
    $male = $_POST['male'];
    if($male == '1'){
        $whereSQL .= "  AND ads.ad_male >= '1'";
    }else if($male = false){
        $whereSQL .= "  AND ads.ad_male = '0'";
    }
}
//Sort results
if(!empty($_POST['sortBy']) && (strtoupper($_POST['sortBy']) == 'ASC' || strtoupper($_POST['sortBy']) == 'DESC')){ 
    $sortBy = $filter->filter($_POST['sortBy']);
}else{ 
    $sortBy = 'DESC';
} 
$orderSQL = " ORDER BY ad_date $sortBy "; 
//Query for displaying results
$querySelectCount = "SELECT COUNT(ads.ad_id) as rowNum,
            ads.ad_id,
            ads.ad_title,
            ads.ad_content,
            ads.ad_date,
            ads.ad_user,
            ads.ad_photo,
            ads.ad_photo_thumb,
            ads.ad_age,
            ads.ad_city,
            ads.ad_rate,
            ads.ad_plan,
            ads.ad_approved,
            ads.adminPost,
            ads.ad_female,              
            ads.ad_male,
            users.user_id,
            users.username,
            users.user_picture,
            users.userAge,
            users.height,
            users.hair,
            users.ethnicity,
            users.eyeColor,
            users.type,
            users.industryName              

            FROM
                ads
            INNER JOIN
                users
            ON
                ads.ad_user = users.user_id
            WHERE 
                ads.ad_approved = '0'
            $whereSQL $orderSQL                 
            ";

//Query for pagination results
$querySelect = "SELECT
            ads.ad_id,
            ads.ad_title,
            ads.ad_content,
            ads.ad_date,
            ads.ad_user,
            ads.ad_photo,
            ads.ad_photo_thumb,
            ads.ad_age,
            ads.ad_city,
            ads.ad_rate,
            ads.ad_plan,
            ads.ad_approved,
            ads.adminPost,
            ads.ad_female,
            ads.ad_male,
            users.user_id,
            users.username,
            users.user_picture,
            users.userAge,
            users.height,
            users.hair,
            users.ethnicity,
            users.eyeColor,
            users.type,
            users.industryName              

            FROM
                ads
            INNER JOIN
                users
            ON
                ads.ad_user = users.user_id
            WHERE 
                ads.ad_approved = '0'
            $whereSQL $orderSQL                 
            ";      

// Count all records 
$query = $conn->prepare($querySelectCount); 
$query->bindParam(":city", $city);
$query->bindValue(':keywords', '%' . $keywords . '%');
$query->bindParam(":hairColor", $hairColor);
$query->bindParam(":ethnicity", $ethnicity);
$query->bindParam(":eyeColor", $eyeColor);
$query->execute();
$row = $query->fetch();
$rowCount = $row['rowNum']; 

//var_dump($query);

// Initialize pagination class 
$paginationConfig = array( 
    'baseURL' => $baseURL, 
    'totalRows' => $rowCount, 
    'perPage' => $limit, 
    'currentPage' => $offset, 
    'contentDiv' => 'postContent', 
    'link_func' => 'searchFilter' 
); 
$pagination =  new Pagination($paginationConfig); 

// Fetch records based on the offset and limit 
$querySelect .= " LIMIT $offset,$limit";
$query = $conn->prepare($querySelect);
$query->bindParam(':city', $city);
$query->bindValue(':keywords', '%' . $keywords . '%');
$query->bindParam(":hairColor", $hairColor);
$query->bindParam(":ethnicity", $ethnicity);
$query->bindParam(":eyeColor", $eyeColor);
$query->execute();
$results = $query->fetchAll();

提前致谢。

最佳答案

所以我解决了这个问题,这是我用来正确查询多个表的代码,现在它工作得很好。问题是,当通过 AJAX 将值发送到 PHP 页面时,任何空值要么被发送为“null”,要么被发送为空,因此我必须对两者进行检查,并更改 SELECT 查询本身。

$.ajax({
    type: 'POST',
    url: 'getData.php',
    data:'page='+page_num+'&city='+city+'&rateSelect='+rateSelect;
    success: function (html) {
        $('#displayPage').html(html);
    }
});

这里是一些更新的代码:

if(isset($_POST['city']) || !empty($_POST['city']) && $_POST['city'] !== 'null'){    
    $city = $filter->filter($_POST['city']);
    $adsSQL .= " AND ads.ad_city = :city "; 
}else{
    $city = '';
    $adsSQL .= " AND ads.ad_city != :city "; 
}
//Rate Filter
if(isset($_POST['rateSelect']) || !empty($_POST['rateSelect']) && $_POST['rateSelect'] !== 'null'){
    $rate = $_POST['rateSelect'];
    if($rate == "all"){
       $adsSQL .= "AND ads.ad_rate >= 0 ";
    }
    else if($rate == "rate1"){
        $adsSQL .= "AND ads.ad_rate BETWEEN 0 AND 150 ";
    }
    else if($rate == "rate2"){
        $adsSQL .= "AND ads.ad_rate BETWEEN 151 AND 250 ";
    }
    else if($rate == "rate3"){
        $adsSQL .= "AND ads.ad_rate BETWEEN 251 AND 350 ";
    }
    else if($rate == "rate4"){
        $adsSQL .= "AND ads.ad_rate BETWEEN 351 AND 5000 ";
    }else{
        $adsSQL .= "AND ads.ad_rate >= 0 ";
    }
}

if(isset($_POST['eyeColorSelect']) || !empty($_POST['eyeColorSelect'])){ 
    $eyeColor = $filter->filter($_POST['eyeColorSelect']);
    if($eyeColor == "eyeColorAll"){
        $usersSQL.= "AND users.eyeColor != :eyeColor ";
    }else{
        $usersSQL.= "AND users.eyeColor = :eyeColor ";
    } 
}else{
    $eyeColor = '';
    $usersSQL.= "AND users.eyeColor != :eyeColor ";
}

我需要根据每个表拆分查询,因为我要从 2 个表中提取数据。广告和用户。所以我需要创建 2 个变量 $adSQL 和 $userSQL 以便分别查询这两个表。我摆脱了单个查询 $whereSQL。现在,当我将查询放在一起时,它看起来像这样......

$querySelectCount = "SELECT COUNT(ads.ad_id) as rowNum,
            ads.ad_id,
            ads.ad_title,
            ads.ad_content,
            ads.ad_date,
            ads.ad_user,
            ads.ad_photo,
            ads.ad_photo_thumb,
            ads.ad_age,
            ads.ad_city,
            ads.ad_rate,
            ads.ad_plan,
            ads.ad_approved,
            ads.adminPost,
            ads.ad_female,              
            ads.ad_male,
            users.user_id,
            users.username,
            users.user_picture,
            users.userAge,
            users.height,
            users.hair,
            users.ethnicity,
            users.eyeColor,
            users.type,
            users.industryName          

            FROM
                ads
            INNER JOIN
                users
            ON
                ads.ad_user = users.user_id 
            $usersSQL
            WHERE 
                ads.ad_approved = '0'               
            $adsSQL $orderSQL                   
            ";

$usersSQL 值位于 WHERE 子句之前,$adsSQL 值位于之后。不确定这是否是最理想的情况,但它在我的情况下效果完美。

关于php - 使用多个过滤器过滤数据时,只有选择一个特定过滤器后,所有过滤器才会显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59450234/

相关文章:

php - 是否可以使用 MySQL 触发器发送电子邮件?

php - 使用php编写的mysql查询

php - 如何通过 php 创建一个空的 zip 存档

php - Silverstripe 条件验证

PHP 在上传前显示选择的图像

MySQL MIN/MAX 所有行

mysql - 为什么变量 _count 总是返回 -1?

php - 从 mysql 数据库检索数据

php - 与 php SELECT 作斗争

php - codeigniter JOIN 返回错误的 id