所以我的网站有一些过滤器。它们都正确过滤数据,但前提是选择了所有过滤器。 如果我选择一个城市,那么它不会显示任何数据,如果我只选择眼睛颜色,那么它将不起作用,如果我选择种族......什么也没有。我必须选择城市、眼睛颜色、头发颜色和种族,才能显示任何数据。我希望用户能够从每个下拉列表中进行任何选择,它将查询并显示数据。当用户选择某些内容时,它会通过 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/