阿贾克斯& PHP:MySQL查询没有获取任何行

时间:2011-08-24 17:23:50

标签: php mysql ajax jquery

我设置了3个组合框来过滤MySQL数据库的结果。在加载时,所有结果都以正确的顺序显示,但是当我尝试从3个组合框中选择任意1个,或者从3个组合框中选择任意2个时,不会显示任何结果(行)。如果我选择所有3个组合框,则会显示结果。

我希望有人能弄明白我的查询代码有什么问题。我已经尝试了一切,但似乎无法找到任何问题。我也想知道我是否以最好的方式做到这一点。我是PHP的新手,因此我不知道所有可用的不同方法。

PHP:

//Define Refine Data Values
$imgFamily = $_GET['imgFamily'];
$imgClass = $_GET['imgClass'];
$imgGender = $_GET['imgGender'];



//Define Refine Values as True of False
$imgFamilyTrue = (($imgFamily != 1) || ($imgFamily != null));
$imgFamilyFalse = (($imgFamily == 1) || ($imgFamily == null));

$imgClassTrue = (($imgClass != 1) || ($imgClass != null));
$imgClassFalse = (($imgClass == 1) || ($imgClass == null));

$imgGenderTrue = (($imgGender != 1) || ($imgGender != null));
$imgGenderFalse = (($imgGender == 1) || ($imgGender == null));



include"db.php";

//Database queries based on refine selections
if($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyTrue && $imgClassTrue && $imgGenderTrue) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgClass='$imgClass' AND imgGender='$imgGender' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyTrue && $imgClassFalse && $imgGenderFalse) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyFalse && $imgClassTrue && $imgGenderFalse) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgClass='$imgClass' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyFalse && $imgClassFalse && $imgGenderTrue) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgGender='$imgGender' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyFalse && $imgClassTrue && $imgGenderTrue) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgClass='$imgClass' AND imgGender='$imgGender' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyTrue && $imgClassFalse && $imgGenderTrue) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgGender='$imgGender' ".
    "ORDER BY `imgDate` DESC";

} else if($imgFamilyTrue && $imgClassTrue && $imgGenderFalse) {
    $query_pag_data = "SELECT `imgURL`,`imgTitle` FROM `images` WHERE imgFamily='$imgFamily' AND imgClass='$imgClass' ".
    "ORDER BY `imgDate` DESC";
}

我很确定问题出在PHP上,因为没有从javascript端调用错误,当我只有两个组合框时,一切都正常工作,但我会发布我的jQuery Ajax查询,以防出现问题就是这样。

Ajax:

function loadData(imgFamily, imgClass, imgGender){
    $.ajax
    ({
        type: "GET",
        url: "filter_test.php",
        data: {imgFamily:imgFamily, imgClass:imgClass, imgGender:imgGender},
        success: function(msg) {
            $("#gallery_container").html(msg);
        },
        error: function(jqXHR, textStatus, errorThrown) {
        },
        complete: function() {
        }
    });
}

4 个答案:

答案 0 :(得分:2)

多么可怕的烂摊子。你一定要清理它:

$where_clauses = array();

$where_clauses[] = "1=1"; // default do-nothing clause

if ($_GET['imgFamily']) {
   $where_clauses[] = "imgFamily='$imgFamily'";
}
if ($_GET['imgClass']) {
   $where_clauses[] = "imgClass='$imgClass'";
}
if ($_GET['imgGender']) {
   $where_clauses[] = "imgFamily='$imgFamily'";
}

$clause = implode(' AND ', $where_clauses);
$sql = "SELECT imgURL, imgTitle FROM images WHERE $clause ORDER BY imgDate DESC";

答案 1 :(得分:1)

在您的真实情况下,您会说“如果值不等于1或者值不为空”。但是,如果值IS等于1,则它不为null,因此您将获得true。如果该值为null,则它不等于1,因此您将得到真实。

问题:

$imgFamilyTrue = (($imgFamily != 1) || ($imgFamily != null));
$imgFamilyFalse = (($imgFamily == 1) || ($imgFamily == null));

修正:

$imgFamilyTrue = $imgFamily != 1 && $imgFamily != null;
$imgFamilyFalse = !$imgFamilyTrue;

答案 2 :(得分:0)

您没有得到结果的原因是因为您使用的是AND运算符

如果其AB以及C然后获取结果,那么当您从3个组合框值中选择3个或2个时,条件失败并且您没有结果

实施例

if(A && B && C)
  // do something

并选择两个值BC,因此条件返回false

答案 3 :(得分:0)

我无法从上述答案中选择“正确”的回答,因为Marc B&詹姆斯的回答有助于创建一个有效的代码。

詹姆斯的回答本身就可以纠正原始代码,但是Marc B在清理代码方面做出了巨大帮助,并使其更有效率。两道道具。

除了他们的建议之外,我还必须将$where_clauses[] = "1=1"包装在if条件下,其中没有来自Ajax的可用数据。

我还必须将mysql_real_escape_string($_GET[]包装在单引号中,以便在MySQL查询中使用。

我最后的PHP:

//Define Refine Data Values
$imgFamily = $_GET['imgFamily'];
$imgClass = $_GET['imgClass'];
$imgGender = $_GET['imgGender'];



//Define Refine Values as True of False
$imgFamilyTrue = $imgFamily != 1 && $imgFamily != null;
$imgFamilyFalse = !$imgFamilyTrue;

$imgClassTrue = $imgClass != 1 && $imgClass != null;
$imgClassFalse = !$imgClassTrue;

$imgGenderTrue = $imgGender != 1 && $imgGender != null;
$imgGenderFalse = !$imgGenderTrue;



//where clauses
$where_clauses = array();

if ($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) {
    $where_clauses[] = "1=1"; // default do-nothing clause
}

if ($imgFamilyTrue) {
   $where_clauses[] = 'imgFamily=' . "'" . mysql_real_escape_string($_GET['imgFamily']) . "'";
}
if ($imgClassTrue) {
   $where_clauses[] = 'imgClass=' . "'" . mysql_real_escape_string($_GET['imgClass']) . "'";
}
if ($imgGenderTrue) {
   $where_clauses[] = 'imgGender=' . "'" . mysql_real_escape_string($_GET['imgGender']) . "'";
}



include"db.php";


$clause = implode(' AND ', $where_clauses);


$query_pag_data = "SELECT imgURL, imgTitle FROM images WHERE $clause ORDER BY imgDate DESC";


$result_pag_data = mysql_query($query_pag_data) or die('MySql Error' . mysql_error());


$num_rows = mysql_num_rows($result_pag_data);


if(!$result_pag_data) {
    echo "Cannot retrieve information from database.";
} else if($num_rows == 0) {
    echo "<div id='no_result'>Sorry, there are no items matching your request.</div>";
} else { 
    echo "<ul class='new_arrivals_gallery'>";
    while($row = mysql_fetch_assoc($result_pag_data)) { 
        echo "<li><a target='_blank' href='new_arrivals_img/".$row['imgURL']."' class='gallery' title='".$row['imgTitle']."'><img src='new_arrivals_img/thumbnails/".$row['imgURL']."'></a></li>";
      }
    echo "</ul>";   
}