PHP:使用选择选项过滤SQL查询

时间:2014-09-21 02:19:31

标签: php mysql sql

嘿伙计们,我现在有点陷入困境,基本上我试图找出如何过滤我的SQL查询,但是在理解如何完成它时会遇到一些麻烦。

基本上我将我网站上所有品牌的'品牌'列入表格。我只是从我的产品表中获取包含每个产品的列。

以下是代码示例,这是PDO和MySQL的选择:

<?php
include('database.php');
try {
  $results = $db->query("SELECT Make, Model, Colour, FuelType, Year, Mileage, Bodytype, Doors, Variant, EngineSize, Price, Transmission, PictureRefs, ServiceHistory, PreviousOwners, Options, FourWheelDrive FROM import ORDER BY Make ASC");
} catch (Exception $e) {
  echo "Error.";
  exit;
}

try {
  $filterres = $db->query("SELECT DISTINCT Make FROM import ORDER BY Make ASC");
} catch (Exception $e) {
  echo "Error.";
  exit;
}
?>

我已将DISTINCT添加到该代码块中,因为SQL列中存在重复的“Make'”。

这是表单,正如您所看到的,我正在使用while循环将表中的每个make显示为它自己的选项。

<form>
<select class="form-control select-box">
                 <option value="make-any">Make (Any)</option>
                 <?php while($make = $filterres->fetch(PDO::FETCH_ASSOC))
                 {
                 echo '
                 <option value="">'.$make["Make"].'</option>
                 ';
                 } ?>
</select>
<button href="#" class="btn btn-block car-search-button btn-lg btn-success"><span class="glyphicon car-search-g glyphicon-search"></span> Search cars 
</button>
</form>

我正在使用此代码将SQL行显示为列出的结果:

<?php while($row = $results->fetch(PDO::FETCH_ASSOC))
      {
      echo '
        <div class="listing-container">
          <a href="carpage.php"><h3 class="model-listing-title clearfix">'.$row["Make"].' '.$row["Model"].' '.$row["Variant"].'</h3></a>
          <h3 class="price-listing">£'.number_format($row['Price']).'</h3>
        </div>
        <div class="listing-container-spec">
         <img src="'.(explode(',', $row["PictureRefs"])[0]).'" class="stock-img-finder"/>
          <div class="ul-listing-container">
            <ul class="overwrite-btstrp-ul">
              <li class="diesel-svg list-svg">'.$row["FuelType"].'</li>
              <li class="saloon-svg list-svg">'.$row["Bodytype"].'</li>
              <li class="gear-svg list-svg">'.$row["Transmission"].'</li>
              <li class="color-svg list-svg">'.$row["Colour"].'</li>
            </ul>
          </div>
          <ul class="overwrite-btstrp-ul other-specs-ul h4-style">
            <li>Mileage: '.number_format($row["Mileage"]).'</li>
            <li>Engine size: '.$row["EngineSize"].'cc</li>
          </ul>
          <button href="#" class="btn h4-style checked-btn hover-listing-btn"><span class="glyphicon glyphicon-ok"></span> History checked 
          </button>
          <button href="#" class="btn h4-style more-details-btn hover-listing-btn tst-mre-btn"><span class="glyphicon glyphicon-list"></span> More details 
          </button>
          <button href="#" class="btn h4-style test-drive-btn hover-listing-btn tst-mre-btn"><span class="test-drive-glyph"></span> Test drive 
          </button>
          <h4 class="h4-style listing-photos-count"><span class="glyphicon glyphicon-camera"></span> 5 More photos</h4>
        </div>
          ';
      } ?>

我的问题是如何使用selection元素来过滤精确的'Make',例如,如果SQL行包含与用户选择的相同的'Make',那么我希望整行显示在列表和其他任何不显示的内容。

我是如何实现这个的代码示例?

由于

2 个答案:

答案 0 :(得分:3)

你需要有类似的东西:

$where = "";
if (!!$selectedMake) {
    $stmt = $db->prepare("SELECT Make, Model, Colour, FuelType, Year, Mileage, Bodytype, Doors, Variant, EngineSize, Price, Transmission, PictureRefs, ServiceHistory, PreviousOwners, Options, FourWheelDrive FROM import ORDER BY Make ASC");
    $stmt->execute();
} else {
    $stmt = $db->prepare("SELECT Make, Model, Colour, FuelType, Year, Mileage, Bodytype, Doors, Variant, EngineSize, Price, Transmission, PictureRefs, ServiceHistory, PreviousOwners, Options, FourWheelDrive FROM import where Make = ?");
    $stmt->execute(array($selectedMake));
}

请注意,order by块中不需要else,因为您拥有唯一的Make。如果您的Make是文字内容,则查询中可能需要'%?%'而不是?

编辑: 如果我理解得很好,你仍然有一个问题,即你缺乏确定$selectedMake应该是什么的知识。首先,你应该为你的select标签命名,所以你应该这样:

<select class="form-control select-box" name="selected-make">

这样,当您提交表单时,所选标记的值将被发送到服务器。因此,如果要在表单提交时传递值,则应为给定标记指定名称。

表单可以获取或发布。如果是get,那么传递的值应该在get中。试试看:

echo var_dump($_GET);

如果是post,则传递的值应该是post。试试看:

echo var_dump($_POST);

最后,您可以像这样初始化$selectedMake

$selectedMake = "";
if (isset($_GET["selected-make"])) {
    $selectedMake = $_GET["selected-make"];
} else if (isset($_POST["selected-make"])) {
    $selectedMake = $_POST["selected-make"];
}

答案 1 :(得分:0)

有很多方法可以实现这一点,但您可以在此处使用ajax请求。 将ajax post请求发送到您的sql查询页面,并将所选选项作为post参数。

在查询页面上,您可以将该post参数传递给sql查询的where子句。 然后填写关于ajax成功响应的表格。