0

我有一个带有查询的 php 代码:

$query = "SELECT * FROM TDdb WHERE status = $status AND occupation =$occupation";

我正在使用客户端应用程序将值状态和职业发送到此 php 代码。这在我发送状态和职业时有效。但是如果我只发送状态而不是职业,我希望它返回行(我的意思是不管职业是什么)。

有没有人有什么建议?我将不胜感激任何帮助。

PS:我想在没有 if 语句的情况下做到这一点,而只是改变查询

4

6 回答 6

1

就个人而言,我会创建一个基本查询并在任何有条件的地方附加条件,如下所示:

$sql = 'SELECT * FROM TDdb';
$conditions = array();
$args = array();

if ($action) {
    $conditions[] = 'status = :status';
    $args[':status'] = $status;
}

if ($occupation) {
    $conditions[] = 'occupation = :occupation';
    $args[':occupation'] = $occupation;
}

if ($conditions) {
    $sql .= ' WHERE ' . join(' AND ', $conditions);
}

$stmt = $db->prepare($sql);
$stmt->execute($args);
于 2013-04-17T13:39:35.420 回答
1

看起来您有一些不错的选择,可用于如何在 SQL 中执行此操作,或者如何在 PHP 中创建 SQL 字符串变量。

考虑在 PHP 代码中使用“if”来提高数据库访问性能的原因之一。

当您在 SQL 中引入类似的“或”条件时,您将无法获得索引访问权限。与 PHP 代码相比,数据库更难确定它应该采用的路径,因为 SQL 引擎在不知道变量在执行时将解析为什么的情况下优化查询。

您已经在 PHP 中知道您真正想要的查询版本。如果您在那里做出选择,这将表现得更好。

于 2013-04-17T14:03:29.243 回答
0

如果您传递职业或 NULL 值,这将起作用。

SELECT * 
FROM   TDdb 
WHERE  status = $status 
       AND ($occupation IS NULL OR occupation = $occupation)
于 2013-04-17T13:28:58.477 回答
0
"SELECT * FROM TDdb WHERE status = '$status' AND (occupation = '$occupation' OR occupation IS NULL)";
于 2013-04-17T13:30:31.097 回答
0

除了@Tom 和@Damien Legros 提供的解决方案外,您还可以创建两个查询字符串,一个有职业,一个没有职业。就像是:

$query = "SELECT * FROM TDdb WHERE status = $status";
if ($occupation != "") { 
   /*When you have value for occupation*/
   $query .= " AND occupation =$occupation";
}

因此,在这种情况下,如果您只有状态字段,则将返回数据。其次,请检查表中的状态和职业字段是否为varchar,然后您必须将它们括在单引号(')中。

于 2013-04-17T13:42:11.953 回答
0

感谢大家的帮助。特别是杰克。最后我像这样创建了我的查询:

$query = 'SELECT * FROM TDdb';

if ($status) {
    $query = $query." WHERE status = '".$status."'";
}

if ($occupation) {
    $query = $query." AND occupation = '".$occupation."'";
}
于 2013-04-17T14:31:49.420 回答