This question already has answers here:
Search Form with One or More (Multiple) Parameters
(2个答案)
3年前关闭。
我正在尝试创建一个具有多个字段以供搜索的数据库,但是如果有一个空字段,它将显示整个数据库。我怀疑这是因为查询中存在OR,所以我不确定如何解决它。
再往下,我有这个:
然后按照表格等。我想我在这里有所有相关的信息。有什么建议么?请使用英语而不是程序员,我对此很陌生。提前致谢!
假设此处的
现在,如果
因为不仅对于姓氏,对于任何列都是如此,所以将任何条件保留为空白将导致所有行都被选择。
Find more info on SQL Wildcards.
要跳过where子句中的空值,可以动态构建它:
注意:
在必须删除的情况下,将出现尾随的
如果所有条件都为空,这也会导致错误。
但这应该给你一个启发! :-)
边注:
您应该查看prepared statements。将POST变量直接传递到SQL语句中是highly dangerous。
(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 . "%'
假设此处的
$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。
09-05 02:26