Php 带有可选过滤器的MySQL查询

Php 带有可选过滤器的MySQL查询,php,mysql,Php,Mysql,我在我的表中有一列“x”,它是1或0。我需要一个MySQL查询,返回所有行,或者x=1或x=0的行 我想要这三个结果中的哪一个是在变量$type中设置的。我所做的是创建三个查询和一个if子句: if ($type == 'all') $query = "SELECT * FROM contracts"; elseif ($type == 'n') $query = "SELECT * FROM contracts WHERE x = '0'"; elseif ($type == 'f') $qu

我在我的表中有一列“x”,它是1或0。我需要一个MySQL查询,返回所有行,或者x=1或x=0的行

我想要这三个结果中的哪一个是在变量$type中设置的。我所做的是创建三个查询和一个if子句:

if ($type == 'all') $query = "SELECT * FROM contracts";
elseif ($type == 'n') $query = "SELECT * FROM contracts WHERE x = '0'";
elseif ($type == 'f') $query = "SELECT * FROM contracts WHERE x = '1'";
这是可行的,但我似乎不是最好的解决方案,因为我必须对一个几乎相同的查询编写3次,如果我想更改某些内容,我必须更改3次

我试图使$type=''、0或1,然后
其中x='$type'
,但这不起作用

仅使用一个MySQL查询如何实现这一点

if ($type = 'all') {
    $filter = '';
} elseif ($type == 'n') {
    $filter = "WHERE x = '0'";
} elseif ($type == 'f') {
    $filter = "WHERE x = '1'";
} else {
    die("Invalid filter type: $type");
}
$query = "SELECT * FROM contracts $filter";
如果使用方案,其中
$type=''、0或1
,则可以执行以下操作:

$query = "SELECT * FROM contracts";
if ($type !== '') {
    $query .= " WHERE x = '$type'";
}
试试这个

$query = "SELECT * FROM contracts" . ($type != 'all' ? (" where x = '" . intval( $type == 'n') . "'") : '')

由于要将n转换为0,f转换为1等,因此在mysql查询中执行此操作将需要不必要的复杂CASE语句。我只希望包含必要的字符串:

if ($type == 'all') $typeLimiter = " ";
elseif ($type == 'n') $typeLimiter = " AND x = '0' ";
elseif ($type == 'f') $typeLimiter = " AND x = '1' ";
通过这种方式,您可以在查询中堆叠无限和/或语句:

 $query = "SELECT * FROM contracts 
    WHERE 1 = 1 
    $typeLimiter";

请注意,我将
其中1=1
作为第一句话,这样您的任何/所有/任何限制都可以应用,或者不应用。

几乎所有的回答都是好的和类似的。我选了这个。谢谢
if ($type == 'all') $typeLimiter = " ";
elseif ($type == 'n') $typeLimiter = " AND x = '0' ";
elseif ($type == 'f') $typeLimiter = " AND x = '1' ";
 $query = "SELECT * FROM contracts 
    WHERE 1 = 1 
    $typeLimiter";