Ajax和PHP:MySQL查询未获取任何行
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() { } }); }
问题出现的原因是在条件判断中使用了错误的逻辑运算符。当值等于1时,不是null,所以条件判断为真。当值为null时,不等于1,所以条件判断也为真。因此,无论值是什么,条件判断始终为真。
解决方法是将逻辑运算符从"||"改为"&&"。这样,只有当两个条件都为真时,条件判断才为真。
代码修正如下:
$imgFamilyTrue = $imgFamily != 1 && $imgFamily != null; $imgFamilyFalse = !$imgFamilyTrue;
有趣的是,我一直以为"||"表示或者的意思。但是我明白你的意思。使用"&&"会使得两个条件都必须为真。在这种情况下,当没有选择结果时,值要么是1,要么是null。它永远不可能两者兼有。但是如果我理解错了,请纠正我。
对,但你使用了否定。imgFamily == null满足imgFamily != 1,imgFamily == 1满足imgFamily != null,明白吗?所以这个或条件对于任何imgFamily的值都返回true。
问题出现的原因:代码中存在错误的拼接和赋值,导致查询条件不正确,无法获取到任何行。
解决方法:修复代码中的语法错误,并添加数据的过滤和验证,以防止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注入攻击。同时,通过将用户输入的数据与数据库中的字段进行比较,确保查询条件的正确性。
此外,文章还提到了一个关于数据过滤和验证的链接,以供读者进一步了解如何对用户数据进行安全处理。
通过修复代码中的语法错误,并添加数据的过滤和验证,我们成功解决了查询未获取到任何行的问题。在编写代码时,我们应该始终注意数据的安全性,并采取适当的措施来防止恶意用户的攻击。