显示整个数据库的多字段搜索表单

时间:2016-02-02 19:26:27

标签: php html mysql database forms

我正在尝试创建一个包含多个字段进行搜索的数据库,但如果有一个空字段则显示整个数据库。我怀疑这是因为查询中的OR,我不知道如何解决它。

<?php
if (isset($_POST['Submit']))
{ 
$con = mysqli_connect();
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$surname = $_POST['surname'];
$firstname = $_POST['firstname'];
$maiden = $_POST['maiden'];
$birth = $_POST['birth'];
$death = $_POST['death'];
$keyword = $_POST['keyword'];

$sql = "SELECT * FROM obits WHERE  surname LIKE '%" . $surname . "%' OR firstname LIKE '%" . $firstname  . "%' OR maiden LIKE '%" . $maiden . "%'  OR birth LIKE '%" . $birth . "%' OR death LIKE '%" . $death . "%' OR obittext LIKE '%" . $keyword . "%'";

$result = mysqli_query($con, $sql);

进一步向下我有这个:

if (isset($result) && $result->num_rows > 0);

然后跟随表等。我想我在这里有所有相关的信息。有什么建议?请使用英语而不是程序员,我对此很新。提前谢谢!

1 个答案:

答案 0 :(得分:1)

让我们看看其中一个条件:

surname LIKE '%" . $surname . "%'

假设此处$surnameMiller,则选择所有姓氏为%Miller%的行。 %标志是通配符,基本上可以代表任何。这意味着您要选择姓氏包含Miller的所有行,其中包含任何字符串,包括空字符串。

现在,如果Miller在这种情况下为空,那么你正在寻找%%,所以一个空字符串包含之前或之后的任何内容 - 所以实际上是任何可能的字符串。因此,将选择每一行。

由于这不仅适用于姓氏,而且适用于任何列,因此将任何条件留空将导致所有行都被选中。

Find more info on SQL Wildcards.

跳过where子句中的空值,您可以动态构建它:

$condition = "WHERE";

if(!empty($surname)){
    $condition .= "surname LIKE '$surname' OR";
}

if(!empty($firstname)){
    $condition .= "firstname LIKE '$firstname' OR";
}

// ...

$sql = "SELECT * FROM obits " . $condition;

注意:

  • 如果您必须删除,则会有一个尾随OR
  • 如果所有条件均为空白,则也会导致错误。

但它应该给你一个启发! : - )

旁注: 你应该研究prepared statements。将POST变量直接传递给SQL语句是highly dangerous