【问题标题】:Searching multiple MySQL tables from an HTML form and returning the data in alphabetical order从 HTML 表单中搜索多个 MySQL 表并按字母顺序返回数据
【发布时间】:2016-01-25 18:05:09
【问题描述】:

我想搜索我从 1 个表单创建的 3 个单独的表,并按字母顺序返回数据。目前,我可以使用下拉框(从我的表单)分别搜索 3 个表来选择一个表,但我无法同时查询它们并按字母顺序返回所有数据。我一直在努力解决它,但我很挣扎。

目前我的程序通过单独的表格搜索用户之前输入到我的表单中的内容。现在我希望能够一次性搜索所有表格并按字母顺序返回信息,这意味着表格中的某些值可能会散开。

我有 3 个表:“Insecttable”、“birdtable”和“butterflytable”

有 3 个控制器:“ControllerInsectTable”、ControllerBirdTable 和“ControllerButterflyTable”

我正在尝试制作另一个控制器:“ControllerAllTables”,它可以搜索所有表。

HTML:

<form name="searchForm" id="searchForm" method="POST" action="ControllerAllTables.php"> 
  Search for: <input type="text" name="aSearch"> 
  <input type="submit" name="searchButton" value="Search">
</form>

PHP:

    // Collect Data
// If an input has been given
if(isset($_POST["aSearch"])) {
  $searchq = $_POST["aSearch"];
  $searchq = preg_replace("#[^0-9a-z]#i","",$searchq); //Can only search words

// Select statements if keywords match
$sql = "SELECT * FROM insecttable WHERE insectName LIKE '%$searchq%'";
$sql1 = "SELECT * FROM butterflytable WHERE butterflyName LIKE '%$searchq%'";
$sql2 = "SELECT * FROM birdtable WHERE birdName LIKE '%$searchq%'";
}

// Tests if the code been inserted
if ($conn->query($sql && $sql1 &&sql2)=== TRUE){
  echo "The rows you have searched for are:";
} else {
  echo "Connection failed: ";
  echo $conn->error;
}

// Show fields
$result = $conn->query($sql && $sql1 &&sql2);

// Output data of each row
if ($result-> num_rows> 0) {
  readfile("ViewReturn.html");
  while($row = $result-> fetch_assoc()) {
    // echo "ID: ".$row["id"]. "<br>";
    echo "Insect: ".$row["insectName"]. "<br><br>";
    echo "Bird: ".$row["birdName"]. "<br><br>";
    echo "Butterfly: ".$row["butterflyName"]. "<br><br>";
  }
} else {
  echo "0 results";
}

我删掉了一些不影响我的问题的代码片段,比如建立连接等等。

目前,我不知道如何按顺序返回值,而且我严重卡在从一个查询中搜索多个表。我看过“joins”,但我真的不明白;不明白。

如您所知,我不太擅长 PHP,我希望我能尽快摆脱它。我在我的程序的这一部分完全不成功,我正在寻求帮助和批评。我知道有很多问题要问,但我真的被困住了,谢谢。

【问题讨论】:

    标签: php mysql sql forms


    【解决方案1】:

    您需要使用UNION 运算符来组合查询结果,确保在组合后对数据进行排序。这可能会影响性能,但希望您的结果集不要太大。

    SELECT name  -- because we NEVER use select *
    FROM
    (
        SELECT insectName AS name FROM InsectTable WHERE insectName LIKE '$searchq%'
        UNION ALL
        SELECT butterflyName AS name FROM ButterflyTable WHERE butterflyName LIKE '$searchq%'
        UNION ALL
        SELECT birdName AS name FROM BirdTable WHERE birdName LIKE '$searchq%'
    )
    

    此外,您可能需要考虑重新设计数据库。如果表中的项目都是相关的,那么它们实际上是一个超类。如果您在 Google 上搜索“SQL 超类设计”,您应该能够找到一些很好的模式。

    此外,通常不会在所有表名的末尾添加“Table”一词。如果您的表包含有关昆虫的数据,那么它是“昆虫”或“昆虫”(我现在将忽略单数/复数辩论)。它是一张桌子的事实已经不言而喻了。

    【讨论】:

    • 感谢您的回答,但我仍然对一些事情感到困惑: - 您使用的“名称”标识符是否已经分配为变量还是关键字? - 这是否也替换了我当前的 $sql 语句?抱歉这么无知,只是 SQL/PHP 让我有点困惑另外感谢您的建议,我目前正在研究使用超类设计来设计我的数据库:¬)
    • “名称”只是一个别名。我基本上是在告诉 SQL,对于这个特定查询,使用“名称”作为该列的名称,而不是实际的列名称。
    • 感谢汤姆的帮助,我对我的数据库进行了一些更改。我现在唯一的问题是我真的不知道那个 SQL 语句在我的代码中的位置,我应该用那个替换我当前的 $SQL 语句
    • 我对您的申请了解不多,无法回答这个问题,但如果您有具体问题,您可以在此处开始另一个问题。
    • 您应该发布一个全新的问题。该网站的设计目的是让其他人可以使用这些问题/答案来找到他们自己问题的答案。如果一个问题包含扩展对话和多个问题/答案,那就更难了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多