【问题标题】:How to search based on HTML option tag如何基于 HTML 选项标签进行搜索
【发布时间】:2020-12-26 15:21:01
【问题描述】:

我有我的搜索表单,其中的城市是从数据库中获取的,但是当我选择某个选项时如何使搜索工作?我需要“打印”该特定城市中所有房屋的所有信息

HTML 表单:

<form action="./server/Search.php" method="post">

<div class="col-auto mt-5">
  
<select name="city" class="form-select" aria-label="Default select example ">
  <option selected disabled>City</option>
  <?php  
    $query = $conn->query("SELECT * FROM `houses`") or die(mysqli_error());
    while($fetch = $query->fetch_array()){
    ?>
  <option value=""><?php echo $fetch['city']?></option>
  <?php
    }
    ?>
</select>
</div>

  <div class="col-auto mt-5">
    <button type="search" name="search" class="btn btn-primary"><i class='bx bx-search-alt-2'></i></button>
  </div>
</form>

Search.php

<?php
    $con= new mysqli("localhost","root","","KBHestate");
    $name = $_post['search'];

    if (mysqli_connect_errno())
      {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
      }

$result = mysqli_query($con, "SELECT * FROM houses
    WHERE city LIKE '%{$city}%'");

while ($row = mysqli_fetch_array($result))
{
        echo $row['city'];
        echo "<br>";
}
    mysqli_close($con);
    ?>

我不知道如何将所选选项与查询联系起来。有没有办法以最好的方式处理这个问题?

【问题讨论】:

标签: php mysql search mysqli


【解决方案1】:

先更改html表单,避免选择不需要的列和行:

<?php
  $query = $link->query("SELECT distinct city FROM `houses`");
  while($fetch = $query->fetch_array(MYSQLI_ASSOC)){
    echo "<option value='{$fetch['city']}'>{$fetch['city']}</option>\n";
  }
?>

然后用绑定变量搜索.php。

<?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = new mysqli("localhost","root","","KBHestate");
    
    $name = $_POST['city'];
    $query = $link->prepare("SELECT id FROM houses where city = ?");
    $query->bind_param("s", $name);
    $query->execute();
    $query->bind_result($id);
    while($query->fetch()){
        echo "{$id}</br>\n";
    }

?>

【讨论】:

  • 由于 OP 使用真实的城市名称,请告诉我我是否正确:my2 cents: If the city is "S' Hertogenbusch" - (是的,我在我的数据库中的现实生活中经历过) HTML 输出将是垃圾。 ——至少应该逃脱。 -- 似乎也不再推荐使用 die() 了。 thisinterestsme.com/dont-use-die-statement
  • 我很好奇:正如他想要显示“关于特定选定城市中所有房屋的所有信息”,bind_result() 函数会是最好的方法吗?所以他会把每一个字段都装箱?
  • @AlexanderDobernig 是的,bind_result($col1,$col2,...)。还有一种替代方法,使用 get_result 后跟该结果的 while fetch_array。数字 fetch_array 将允许您不使用单个变量,但您肯定不会赢得可读性。
  • @AlexanderDobernig 更正了城市名称应该被转义,之后搜索可能需要再次对它们进行转义。正如您在您的回答中指出的那样,我不会更正我的答案,使用该名称尚未完成。
  • 我会使用关联的 fetch_array,因为php.net/manual/de/mysqli-result.fetch-array.php 默认同时提供,并且可读性将等于未准备好的结果。
【解决方案2】:

这里似乎缺少一些东西:

HTML 表单中缺少该值,因此没有发布任何内容

您不应该使用城市名称(因为有很多城市的字符有问题),而是使用数字 id 作为值。

这也意味着您需要一个包含城市和城市 ID 的单独查找表,并将其与房屋表连接起来。

">

那么你的第二个脚本 search.php 不使用发布的值

 $city_id = $_POST['city_id'];

[...]
现在您可以在查询中使用 $city_id 了:

$result = mysqli_query($con, "SELECT * FROM houses
    WHERE city_id ='{$city_id}'");

但实际上这不是正确的方法 - 改用准备好的语句。

【讨论】:

  • select中使用的“{}”是什么意思?永远不要直接在 SQL 中使用发布的输入!了解 SQL 注入和预处理语句 + 绑定变量。
  • @GerardH.Pille 它只是重复了原始发布者的原始语法以帮助他理解他的问题。对于尚未了解 html 表单基本概念的人来说,在答案中引入新概念可能会使理解问题及其解决方案变得过于复杂。这只是我的意见。请随意使用完整的新代码(包括准备好的语句)来回答。
  • 我想知道无效的声明将如何帮助 OP。
  • @GerardH.Pille 声明中究竟是什么无效?
  • 荣誉,花括号?我相信它们被框架使用,但 SQL 不知道它们。因此,您会寻找“city_id = '{500}',而 MySQL 可能对此不满意。但同样:永远不要直接使用输入,始终使用绑定变量。
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2010-12-06
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多