【问题标题】:Search Form Ability To Ignore Blank Fields搜索表单忽略空白字段的能力
【发布时间】:2013-11-07 10:56:23
【问题描述】:

我制作了一个 HTML 搜索表单,它根据表单的内容创建对 MySql 数据库的查询。如果用户将该特定表单字段留空,我想做的是忽略搜索参数。网上有很多答案,尤其是在这个网站上,但我一个都找不到。

我已经尽可能地剥离了我的代码粘贴到这里:

HTML 输入:

<form action="deletesearchresults.php" method="GET">
  <p><b>First Part Of Postcode</b>
  <input type="text" name="searchpostcode"></b>  </p>
  <p><b>Category</b>
    <input type="text" name="searchfaroukcat"></b>


    <input type="submit" value="Search">
  </p>
</form>

PHP结果显示:

<?php
    mysql_connect("myip", "my_username", "my_password") or die("Error connecting to database: ".mysql_error());


    mysql_select_db("my_db") or die(mysql_error());



   $sql = mysql_query("SELECT * FROM 
GoogleBusinessData
INNER JOIN TblPostcodeInfo ON GoogleBusinessData.BusPostalCode = TblPostcodeInfo.PostcodeFull WHERE PostcodeFirstPart = '$_GET[searchpostcode]' and FaroukCat = '$_GET[searchfaroukcat]' LIMIT 0,20");


   while($ser = mysql_fetch_array($sql)) {

      echo "<p>" . $ser['BusName'] . "</p>";
      echo "<p>" . $ser['PostcodePostalTown'] . "</p>";
      echo "<p>" . $ser['PostcodeArea'] . "</p>";
      echo "<p>" . $ser['FaroukCat'] . "</p>";
      echo "<p> --- </p>";

}

?>

这很好用,直到我将一个字段留空,在这种情况下,它不会返回任何结果,因为它认为我正在询问该字段为空或 null 的结果,我不知道。我想要该表单字段为空的所有结果。

我尝试组合类似 % [myfeild] % 等,但我只希望结果准确显示字段中的内容,而不仅仅是包含字段中内容的结果,例如搜索邮政编码“TR1”将返回 TR1、TR10、TR11 等的结果。

我相信我可能需要一个数组,但经过 3 天的尝试,我就是不知道如何完成这项工作。

任何帮助都会令人惊叹。

编辑:另外,我最终将在此表单中添加最多十个字段,而不仅仅是本示例中的两个,因此请记住这一点,并提出您可能有的任何建议。

【问题讨论】:

  • 停止使用mysql_函数!这是不安全的,你很容易被这个脚本注入 sql 并且它已经被贬值了!
  • @LiamSorsby 我实际上只是在关注这个guide 来尝试将 MS Sql 数据库转移到一个可用的仪表板中,以便少数人可以在线使用。我正在慢慢到达那里,但我的 php 知识非常基础。
  • 你需要编辑它,因为你还没有发布链接

标签: php mysql forms search


【解决方案1】:

尝试使用isset()

例子

if(isset($_GET[searchpostcode]) && isset($_GET[searchfaroukcat])){
 $fields = "WHERE PostcodeFirstPart = '$_GET[searchpostcode]' and FaroukCat = '$_GET[searchfaroukcat]'";
}elseif(isset($_GET[searchpostcode]) && !isset($_GET[searchfaroukcat])){
 $fields = "WHERE PostcodeFirstPart = '$_GET[searchpostcode]'";
}elseif(!isset($_GET[searchpostcode]) && isset($_GET[searchfaroukcat])){
 $fields = "WHERE FaroukCat = '$_GET[searchfaroukcat]'";
}else{
 $fields = "";
}

$sql = "SELECT * FROM 
GoogleBusinessData $fields
INNER JOIN TblPostcodeInfo ON GoogleBusinessData.BusPostalCode = TblPostcodeInfo.PostcodeFull  LIMIT 0,20";

您确实需要转义您的 $_GET 变量,但我强烈建议使用 PDO/mysqli 准备语句 http://php.net/manual/en/book.pdo.phphttp://php.net/manual/en/book.mysqli.php

或尝试一个 foreach 循环

foreach($_GET as $keys=>$value){
$values .= $keys."='".$value."' and"; 
}
$values = rtrim($values, " and");

if(trim($values) != "" || trim($values) != NULL){
$query = "WHERE ".$values;
}else{
$values = "";
}

$sql = "SELECT * FROM `test`".$values;

【讨论】:

  • 是的,我之前曾尝试使用类似的代码来完成这项工作,但由于字段比我的示例中的要多,我认为所需的代码量会很大。跨度>
  • 你确实需要改变 mysql_ 因为你会发现使用 \ 或 " 或 ' 会破坏你的代码,除非你转义,如果你升级你的 php 版本,你可能会发现它不再工作了
  • 我添加了一种不同的处理方式。 (虽然没有测试过)
  • 它给了我:意外的 T_CONSTANT_ENCAPSED_STRING。 Dreamweaver 不喜欢 $values .= $keys"='".$value."' 和";行
  • 将 $keys" 更改为 $keys。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多