AJAX to MySQL запрос WHERE IN ($_GET). Исключить определенные результаты

Когда я нажимаю на флажок "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>';
    }
}

2 ответа

Решение

У вас есть 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 Переменная имеет 2 цели: сначала добавьте " AND " к SQL, если есть какие-либо товарный знак и проверенный размер, во-вторых: проверьте, есть ли какие-либо критерии для поиска (если вызываются без параметров, поиск не будет).

Я не проверял код:P

Извините за мой английский

Разве вы не хотите использовать И вместо ИЛИ?

Если вы получаете результаты по всем соответствующим товарным знакам и по всем соответствующим размерам, вам следует использовать AND, которое возвращает результаты только тогда, когда оно соответствует товарному знаку и размеру.

Другие вопросы по тегам