Php 如何基于HTML选项标记进行搜索

Php 如何基于HTML选项标记进行搜索,php,mysql,search,mysqli,Php,Mysql,Search,Mysqli,我有我的搜索表单,从数据库中获取城市,但是当我选择某个选项时,如何使搜索工作正常?我需要把那个特定城市所有房子的所有信息都打印出来 HTML格式: Search.php 我不知道如何将所选选项与查询连接起来。有什么办法可以最好地处理这个问题吗?这里似乎缺少一些东西: HTML表单中缺少该值,因此不会发布任何内容 您不应该使用cities名称,因为有许多城市的字符有问题,但其值有一个数字id 这也意味着您需要一个单独的带有城市和城市id的查找表,并将其与houses表连接起来 > 然后,您的第二个

我有我的搜索表单,从数据库中获取城市,但是当我选择某个选项时,如何使搜索工作正常?我需要把那个特定城市所有房子的所有信息都打印出来

HTML格式:

Search.php


我不知道如何将所选选项与查询连接起来。有什么办法可以最好地处理这个问题吗?

这里似乎缺少一些东西:

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

您不应该使用cities名称,因为有许多城市的字符有问题,但其值有一个数字id

这也意味着您需要一个单独的带有城市和城市id的查找表,并将其与houses表连接起来

> 然后,您的第二个脚本search.php不使用发布的值

 $city_id = $_POST['city_id'];
[……] 现在,您可以在查询中使用$city\u id:

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

但事实上,这并不是正确的方法——而是使用准备好的语句。

首先更改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";
    }

?>

select中使用的{}是什么意思?不要直接在SQL中使用发布的输入!了解SQL注入和预处理语句+绑定变量。@GerardH.Pille为了帮助他理解问题,它只重复了原始海报的原始语法。在答案中引入新概念可能会使理解问题及其解决方案变得过于复杂,因为有些人还不了解html表单的基本概念。这只是我的意见。请随意回答一个完整的新代码,包括准备好的语句。我想知道无效语句对OP.@GerardH.Pille有什么帮助。在语句中什么是无效的?荣誉,花括号?我相信它们被框架使用,但SQL不知道它们。因此,您将查找city_id={500},MySQL可能对此不满意。但再次强调:永远不要直接使用输入,始终使用绑定变量。由于OP使用的是真实的城市名称,请告诉我我是否正确:my2美分:如果城市是S'Hertogenbusch-是的,我在我的数据库的真实生活中经历过这一点,HTML输出将是垃圾。-至少它应该逃脱此外,似乎不再推荐使用模具。我很好奇:因为他想展示特定城市中所有房屋的所有信息,绑定结果功能是最好的方法吗?所以他会把每一个字段都扔掉?@AlexanderDobernig是的,绑定结果$col1,$col2,。。。。还有一种替代方法,使用get_结果,然后从该结果中使用while fetch_数组。数字fetch_数组允许您不使用单个变量,但您肯定不会赢得可读性。@AlexanderDobernig更正了城市名称应该转义的说法,之后搜索可能需要再次取消对它们的转义。我不会更正我的答案,正如您在您的文章中指出的,使用名称是不正确的。我将使用关联fetch_数组作为默认值,并且可读性将等于未准备好的结果。您有一个错误。需要一个论点。请考虑切换错误模式。
<?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
    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";
    }

?>