AJAX 到 MySQL WHERE IN ($_GET) 请求。排除某些结果

Posted

技术标签:

【中文标题】AJAX 到 MySQL WHERE IN ($_GET) 请求。排除某些结果【英文标题】:AJAX to MySQL WHERE IN ($_GET) request. Exclude certain results 【发布时间】:2012-03-28 11:47:38 【问题描述】:

当我点击“Asus”复选框时,结果是“Asus”的所有型号都带有所有“尺寸”,很好。但是当我同时点击“Asus”和“15''”复选框时,结果是所有这种尺寸的型号,包括“Acer”等等。它必须如何工作(至少在我的想象中:)) - 点击“Asus”和“15''”并获取仅与点击(选中)复选框相关的数据。

谢谢。

复选框:

    <input type="checkbox" name="Acer"> Acer
    <input type="checkbox" name="Asus"> Asus
...
    <input type="checkbox" name="15.6"> 15''
    <input type="checkbox" name="17"> 17''

JQuery/Ajax:

$("input[type=checkbox]").click(function() 
    var ids = [];
    $("input[type=checkbox]:checked").each(function() 
    ids.push($(this).attr("name"));
    );
    ids = ids.join(",");

    $.get("mysql.php", q: ids, 
    function(result) 
    $("div#output").html(result);

    ); 
);

MySQL 查询:

$g = $_GET['q'];
if(isset($g))   
    $param = "" . str_replace(",", "','", $_GET['q']) . "";
    $sql = "SELECT * FROM `notebook` WHERE `trademark` IN ('$param') OR `size` IN ('$param') ORDER BY `trademark`";
    $query = mysql_query($sql) or die(mysql_error());
    while($row = mysql_fetch_array($query)) 
        echo '<p>'.$row['trademark'].' = '.$row['size'].'</p>';
    

【问题讨论】:

在将 $_GET 变量直接运行到 SQL 查询中之前,您可以先看看 xkcd.com/327 【参考方案1】:

您有 2 个参数来过滤结果,您必须单独使用它们。

我的建议:

复选框:

    <input type="checkbox" name="trademark" value="Acer"> Acer
    <input type="checkbox" name="trademark" value="Asus"> Asus
....    
    <input type="checkbox" name="size" value="15.6"> 15''
    <input type="checkbox" name="size" value="17"> 17''

jquery:

$("input[type=checkbox]").click(function() 
    var trade = [];
    var sizes= [];
    $("input[type=checkbox]:checked").each(function() 
       if($(this).attr("name")=="trademark")
            trade.push($(this).val());
       
       else
            sizes.push($(this).val());
       
    );
    trade = trade.join(",");
    sizes= sizes.join(",");
    $.get("mysql.php", q: trade,p: sizes, 
    function(result) 
    $("div#output").html(result);
    ); 
);

mysql:

$g = $_GET['q'];
$h = $_GET['p'];
$wheresql="";
$where=0;
if(isset($g))   
    $where=1;
    $param = "" . str_replace(",", "','", $_GET['q']) . "";
    $wheresql.="`trademark` IN ('$param')";

if(isset($h))   
    if($where==1)$wheresql.=" AND ";
    $where=1;
    $param = "" . str_replace(",", "','", $_GET['p']) . "";
    $wheresql.="`size` IN ('$param')";

if($where==1)
    $sql = "SELECT * FROM `notebook` WHERE ".$wheresql." ORDER BY `trademark`";
    $query = mysql_query($sql) or die(mysql_error());
    while($row = mysql_fetch_array($query)) 
        echo '<p>'.$row['trademark'].' = '.$row['size'].'</p>';
    


小解释:您有 2 组按名称区分的复选框,并在 jquery 代码中分别使用它们,从而可以将它们发送到 mysql 搜索中的 2 个变量,然后在 mysql 搜索脚本中,为每个变量执行它的“在哪里”进行搜索,$where 变量有两个用途:首先将" AND " 添加到 sql 是否检查任何商标和尺寸,第二:检查是否有任何搜索条件(如果有不带参数调用,它不会进行搜索)。

我没有测试过代码:P

对不起我的英语

【讨论】:

巴勃罗非常感谢。你的代码很完美。我刚刚为我的 localhost MySQL 版本修复了 mysql 语法。格拉西亚斯。 Creo que la pregunta está cerrada)对不起我的西班牙语。【参考方案2】:

您不想使用 AND 而不是 OR 吗?

如果您要获得所有匹配商标和所有匹配尺寸的结果,那么您应该使用 AND,它仅在匹配商标 AND 尺寸时返回结果。

【讨论】:

使用 AND 不能解决问题。当您单击第一个参数“Asus”时,它将等待第二个参数“size”。但我想在每次点击后获取数据。 两个选项。要么使用 javascript 将当前结果集过滤为仅选择尺寸,要么重新发送商标和尺寸并获取新的模型列表,然后清除当前列表并使用新列表重建它。

以上是关于AJAX 到 MySQL WHERE IN ($_GET) 请求。排除某些结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - WHERE IN 将列表放入字段

mysql_where条件

mysql子查询在where in子句中

mysql查询where IN语句

在 mysql WHERE 子句中使用 GROUP_CONCAT 和 FIND_IN_SET

MySQL在where子句中选择查询