Ajax和PHP:MySQL查询未获取任何行

8 浏览
0 Comments

Ajax和PHP:MySQL查询未获取任何行

我有3个下拉框可以用来过滤MySQL数据库中的结果。加载时,所有的结果按照正确的顺序显示,但是当我尝试选择其中任意一个下拉框,或者其中任意两个下拉框时,没有结果(行)显示出来。只有当我选择了所有3个下拉框时,结果才会显示出来。

我希望有人能找出我的查询代码有什么问题。我已经尝试了所有的方法,但似乎找不到任何问题。我也想知道是否以最佳方式进行。我对PHP还比较新,所以不知道所有可用的不同方法。

PHP代码:

//定义过滤数据的值
$imgFamily = $_GET['imgFamily'];
$imgClass = $_GET['imgClass'];
$imgGender = $_GET['imgGender'];
//将过滤值定义为真或假
$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";
//根据过滤选择的数据库查询
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() {
        }
    });
}

0
0 Comments

问题出现的原因是使用了AND运算符,当选择了3个条件中的1个或2个时,条件不满足,因此没有结果。解决方法是修改条件判断部分的代码,使用OR运算符,只要满足其中一个条件即可。

示例代码:

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

对于提到的if else条件,我理解你的意思,但是在之前的代码中,那些值为false的变量(例如$imgFamilyFalse)在定义时已经被设置为等于1或为空,如果在客户端没有选择,则会满足这些条件。这样是否能解决你所提出的问题呢?

0
0 Comments

问题出现的原因是在条件判断中使用了错误的逻辑运算符。当值等于1时,不是null,所以条件判断为真。当值为null时,不等于1,所以条件判断也为真。因此,无论值是什么,条件判断始终为真。

解决方法是将逻辑运算符从"||"改为"&&"。这样,只有当两个条件都为真时,条件判断才为真。

代码修正如下:

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

有趣的是,我一直以为"||"表示或者的意思。但是我明白你的意思。使用"&&"会使得两个条件都必须为真。在这种情况下,当没有选择结果时,值要么是1,要么是null。它永远不可能两者兼有。但是如果我理解错了,请纠正我。

对,但你使用了否定。imgFamily == null满足imgFamily != 1,imgFamily == 1满足imgFamily != null,明白吗?所以这个或条件对于任何imgFamily的值都返回true。

0
0 Comments

问题出现的原因:代码中存在错误的拼接和赋值,导致查询条件不正确,无法获取到任何行。

解决方法:修复代码中的语法错误,并添加数据的过滤和验证,以防止SQL注入攻击。

文章内容如下:

Ajax & PHP:MySQL查询未获取到任何行的问题解决方法

问题的出现原因是代码中存在错误的拼接和赋值,导致查询条件不正确,无法获取到任何行。为了解决这个问题,我们需要修复代码中的语法错误,并添加数据的过滤和验证,以防止SQL注入攻击。

首先,让我们来看一下出现问题的代码:

$where_clauses = array();
$where_clauses[] = "1=1"; // default do-nothing clause
if ($_GET['imgFamily']) {
   $where_clauses[] = "imgFamily='".$_GET['imgFamily']."'";
}
if ($_GET['imgClass']) {
   $where_clauses[] = "imgClass='".$_GET['imgClass']."'";
}
if ($_GET['imgGender']) {
   $where_clauses[] = "imgFamily='".$_GET['imgFamily']."'";
}
$clause = implode(' AND ', $where_clauses);
$sql = "SELECT imgURL, imgTitle FROM images WHERE ".$clause." ORDER BY imgDate DESC";

以上代码存在多处语法错误,修复后的代码如下:

$where_clauses = array();
$where_clauses[] = "1=1"; // default do-nothing clause
if ($_GET['imgFamily']) {
   $where_clauses[] = "imgFamily='".mysql_real_escape_string($_GET['imgFamily'])."'";
}
if ($_GET['imgClass']) {
   $where_clauses[] = "imgClass='".mysql_real_escape_string($_GET['imgClass'])."'";
}
if ($_GET['imgGender']) {
   $where_clauses[] = "imgGender='".mysql_real_escape_string($_GET['imgGender'])."'";
}
$clause = implode(' AND ', $where_clauses);
$sql = "SELECT imgURL, imgTitle FROM images WHERE ".$clause." ORDER BY imgDate DESC";

修复后的代码使用了`mysql_real_escape_string()`函数对用户输入的数据进行了过滤和验证,以防止SQL注入攻击。同时,通过将用户输入的数据与数据库中的字段进行比较,确保查询条件的正确性。

此外,文章还提到了一个关于数据过滤和验证的链接,以供读者进一步了解如何对用户数据进行安全处理。

通过修复代码中的语法错误,并添加数据的过滤和验证,我们成功解决了查询未获取到任何行的问题。在编写代码时,我们应该始终注意数据的安全性,并采取适当的措施来防止恶意用户的攻击。

0