我有一个带有查询的 php 代码:
$query = "SELECT * FROM TDdb WHERE status = $status AND occupation =$occupation";
我正在使用客户端应用程序将值状态和职业发送到此 php 代码。这在我发送状态和职业时有效。但是如果我只发送状态而不是职业,我希望它返回行(我的意思是不管职业是什么)。
有没有人有什么建议?我将不胜感激任何帮助。
PS:我想在没有 if 语句的情况下做到这一点,而只是改变查询
就个人而言,我会创建一个基本查询并在任何有条件的地方附加条件,如下所示:
$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);
看起来您有一些不错的选择,可用于如何在 SQL 中执行此操作,或者如何在 PHP 中创建 SQL 字符串变量。
考虑在 PHP 代码中使用“if”来提高数据库访问性能的原因之一。
当您在 SQL 中引入类似的“或”条件时,您将无法获得索引访问权限。与 PHP 代码相比,数据库更难确定它应该采用的路径,因为 SQL 引擎在不知道变量在执行时将解析为什么的情况下优化查询。
您已经在 PHP 中知道您真正想要的查询版本。如果您在那里做出选择,这将表现得更好。
如果您传递职业或 NULL 值,这将起作用。
SELECT *
FROM TDdb
WHERE status = $status
AND ($occupation IS NULL OR occupation = $occupation)
"SELECT * FROM TDdb WHERE status = '$status' AND (occupation = '$occupation' OR occupation IS NULL)";
除了@Tom 和@Damien Legros 提供的解决方案外,您还可以创建两个查询字符串,一个有职业,一个没有职业。就像是:
$query = "SELECT * FROM TDdb WHERE status = $status";
if ($occupation != "") {
/*When you have value for occupation*/
$query .= " AND occupation =$occupation";
}
因此,在这种情况下,如果您只有状态字段,则将返回数据。其次,请检查表中的状态和职业字段是否为varchar,然后您必须将它们括在单引号(')中。
感谢大家的帮助。特别是杰克。最后我像这样创建了我的查询:
$query = 'SELECT * FROM TDdb';
if ($status) {
$query = $query." WHERE status = '".$status."'";
}
if ($occupation) {
$query = $query." AND occupation = '".$occupation."'";
}