This question already has answers here:
Search Form with One or More (Multiple) Parameters
                                
                                    (2个答案)
                                
                        
                                3年前关闭。
            
                    
我正在尝试创建一个具有多个字段以供搜索的数据库,但是如果有一个空字段,它将显示整个数据库。我怀疑这是因为查询中存在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);


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

最佳答案

让我们看一下条件之一:

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

09-05 02:26