PHP, AJAX &MySQL -从多个<select>更新页面


PHP, AJAX & MySQL - updating page from multiple <select>

我有一个能够选择最低价格显示的当前设置,并且页面将相应地更新,没有问题。但是,我还希望能够设置从不同的<select>显示的最大价格(以及将来的其他选项,如产品类型)。然而,我使用的方法(http://www.w3schools.com/php/php_ajax_database.asp)不工作,当我修改它通过2个值,它不会显示任何结果。我认为,当试图真正获得最大值时,它会失败,但我不知道在哪个点(或为什么)这是失败的。任何帮助将非常感激!我已经花了相当多的时间在试错上,没有任何其他的教程是有用的。如果你能帮助,请解释你的答案,因为我是新的AJAX/JS一般。

HTML:

<select id="price-from" onchange="setPrice(this.value)">
    <option selected value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option value="20000">£20,000</option>
</select>
<p id="to">To</p>
<select id="price-to" onchange="setPrice(this.value)">
    <option value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option selected value="20000">£20,000</option>
</select>
JavaScript:

function setPrice(str) {
if (str == "") {
    document.getElementById("section1").innerHTML = "<p>No Results</p>";
    return;
    alert("error 1");
} else { 
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            document.getElementById("section1").innerHTML = this.responseText;
        }
    };
    xmlhttp.open("GET","priceQuery.php?min=" +str + "max=" +str, true);
    xmlhttp.send();
  }
}
PHP:

<?php
    $con = mysqli_connect('localhost','root','','nbgardens');
    if (!$con) {
    die('Could not connect: ' . mysqli_error($con));
    }
    mysqli_select_db($con,"nbgardens");
    $min = (isset($_GET['min']) ? $_GET['min'] : null);
    $max = (isset($_GET['max']) ? $_GET['max'] : null);
    $sql="SELECT * FROM products WHERE product_price >= '".$min."' AND product_price<= '".$max."'";
    $result = mysqli_query($con,$sql);
    while($row = mysqli_fetch_assoc($result)){
        echo"<div class='browse-image'>
            <a href='#'>
            <p class='price'>£" . $row['product_price'] . "</p>
            <img src='" . $row['product_img'] . "' width='200px' class='thumb'>
            <figcaption>" . $row['product_title'] . "</figcaption></a></div>";
        }                           
    mysqli_close($con);
?>

您当前的代码有几个问题:

设置两个不同的变量

当您选择price-from或当您选择price-to时,您将以相同的单参数启动相同的功能。该函数不知道您给它的参数是price-from还是price-to。其中一种解决方案是不给它任何参数让它获取选定值

&分隔URL参数

对于你给XHR对象的当前url,你的请求看起来像这样(假设str = "1000"):
priceQuery.php?min=1000max=1000

在您的PHP代码中,您的$_GET['min']等于字符串"1000max=1000", $_GET['max']从未设置

对于你当前的PHP代码,我没有看到任何问题,所以这里是

我的修复:

HTML:

<select id="price-from" onchange="setPrice()">
    <option selected value="500">£500</option>
    <option value="1000">£1000</option>
    <option value="2000">...</option>
</select>
<p id="to">To</p>
<select id="price-to" onchange="setPrice()">
    <option value="8000">...</option>
    <option value="10000">£10,000</option>
    <option selected value="20000">£20,000</option>
</select>
Javascript:

function setPrice() {
    var minField = document.getElementById('price-from'),
        maxField = document.getElementById('price-to');
    var min = minField.options[minField.selectedIndex].value,
        max = maxField.options[maxField.selectedIndex].value;
    // We make sure we have both values and that max is greater than min
    if (min == "" || max == "" || parseInt(max) < parseInt(min)) {
        document.getElementById("section1").innerHTML = "<p>No Results</p>";
        return;
        alert("error 1");
    } else { 
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        } else {
            // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                document.getElementById("section1").innerHTML = this.responseText;
            }
        };
    // Don't forget the '&' to separate the two URL parameters
    xmlhttp.open("GET","priceQuery.php?min=" + min + "&max=" + max, true);
    xmlhttp.send();
    }
}

下一个选择覆盖最小/最大。下面是正确的代码:

function setPrice() {
  var min = parseInt(document.getElementById('price-from').value),
      max = parseInt(document.getElementById('price-to').value);
  if(max < min) {
    var maxLocal = max;
    max = min;
    min = maxLocal;
  }
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            document.getElementById("section1").innerHTML = this.responseText;
        }
    };
    xmlhttp.open("GET","priceQuery.php?min=" +min + "max=" +max, true);
    xmlhttp.send();
}
<select id="price-from" onchange="setPrice()">
    <option selected value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option value="20000">£20,000</option>
</select>
<p id="to">To</p>
<select id="price-to" onchange="setPrice()">
    <option value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option selected value="20000">£20,000</option>
</select>

你应该试试这个:

<select id="price-from" onchange="setPrice(this.value)">
    <option selected value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option value="20000">£20,000</option>
</select>
<p id="to">To</p>
<select id="price-to" onchange="setPrice(this.value)">
    <option value="500">£500</option>
    <option value="1000">£1,000</option>
    <option value="2000">£2,000</option>
    <option value="3000">£3,000</option>
    <option value="4000">£4,000</option>
    <option value="5000">£5,000</option>
    <option value="6000">£6,000</option>
    <option value="7000">£7,000</option>
    <option value="8000">£8,000</option>
    <option value="9000">£9,000</option>
    <option value="10000">£10,000</option>
    <option selected value="20000">£20,000</option>
</select>

对于Javascript,你应该像这样尝试jQuery:

<script type="text/javascript">
$(document).ready(function(){
var minValue,maxValue;
    $("#price-from").on("change",function(){
    minValue=$(this).val();
    });
    $("#price-to").on("change",function(){
    maxValue=$(this).val();
    });
    if(minValue!='')
        $.post( "priceQuery.php", { min: minValue, max: maxValue  } );
});
</script>

你的PHP代码是这样的:

<?php
    $con = mysqli_connect('localhost','root','','nbgardens');
    if (!$con) {
    die('Could not connect: ' . mysqli_error($con));
    }
    mysqli_select_db($con,"nbgardens");
    $min = (isset($_POST['min']) ? $_POST['min'] : null);
    $max = (isset($_POST['max']) ? $_POST['max'] : null);
    $sql="SELECT * FROM products WHERE product_price >= '".$min."' AND product_price<= '".$max."'";
    $result = mysqli_query($con,$sql);
    while($row = mysqli_fetch_assoc($result)){
        echo"<div class='browse-image'>
            <a href='#'>
            <p class='price'>£" . $row['product_price'] . "</p>
            <img src='" . $row['product_img'] . "' width='200px' class='thumb'>
            <figcaption>" . $row['product_title'] . "</figcaption></a></div>";
        }                           
    mysqli_close($con);
?>