我正在尝试创建一个包含多个字段进行搜索的数据库,但如果有一个空字段则显示整个数据库。我怀疑这是因为查询中的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);
然后跟随表等。我想我在这里有所有相关的信息。有什么建议?请使用英语而不是程序员,我对此很新。提前谢谢!
答案 0 :(得分:1)
让我们看看其中一个条件:
surname LIKE '%" . $surname . "%'
假设此处$surname
为Miller
,则选择所有姓氏为%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。