【问题标题】:multiple field search form displaying entire database [duplicate]显示整个数据库的多字段搜索表单[重复]
【发布时间】:2016-05-11 18:31:25
【问题描述】:

我正在尝试创建一个包含多个搜索字段的数据库,但如果有一个空字段,它会显示整个数据库。我怀疑这是因为查询中的 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);

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

【问题讨论】:

  • “请使用英语而不是程序员,” - 那部分让我大声笑,嗯。回到正题。不确定您所说的“显示整个数据库”是什么意思 - 但是是的,由于您的 Query 中有大量 ORs 并在每一列上进行 Wildcard 搜索,它会产生很多结果。
  • 如果有空白字段,则显示数据库中的每个条目
  • 为什么不在将值发送到查询之前验证值?

标签: php html mysql database forms


【解决方案1】:

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

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

假设$surname 在这里是Miller,您选择所有姓氏为%Miller% 的行。 % 符号是通配符,基本上可以代表 anything。这意味着您将选择姓氏包含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

【讨论】:

  • 好吧,有道理,我该如何解决这个问题?
  • 好吧,让我更具体一点。我想要一些拼写错误的缓冲区,这就是为什么我认为 LIKE 可能是要走的路。如果它导致了这个问题,我将如何解决它,同时仍然有一点拼写错误的缓冲区?
  • 只检查发布数据中的空值。如果它不为空,则运行查询。否则不要运行。
  • @aloeveraking24 - 他基本上是在告诉您检查以确保传递给Query 的所有值都不是Empty
  • 再次,新的。是否有关于如何仅在不为空的情况下运行的教程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2012-03-08
  • 2013-08-21
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
相关资源
最近更新 更多