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