表中的一列已设置为NULL
,将包含或不包含值。
现在,如果用户输入为NULL
,则选择包含null
的所有行。如果是非空输入,则进行相应选择。
WHERE student.section = NULL // tried like '', 'NULL'
但是我发现这不是有效的方法
因此,我遵循以下逻辑,但是我认为它的结构不合理,我认为可以缩短以防止重复的代码。
如果section
为空
if(empty($_POST['section'])){
$result=$con->prepare(
"SELECT
...
FROM student
WHERE student.class=:cid AND student.section IS NULL"
)
$result->bindParam(':cid',$_POST['class']);
$result->execute();
} else {
$result=$con->prepare(
"SELECT
...
FROM student
WHERE student.class=:cid AND student.section=:sid"
)
$result->bindParam(':cid',$_POST['class']);
$result->bindParam(':sid',$_POST['section']);
$result->execute();
}
答案 0 :(得分:2)
删除表的使用情况。如果没有联接,则无需再次加入,这会使它“更短”,但保持相同的逻辑。
SELECT
...
FROM student
WHERE class=:cid AND section=:sid
我在那里为您节省了大约14次击键,0<14
被“减少了”。
我知道我在评论中说过IS NOT NULL
,但从逻辑上讲,两者之间是有区别的
AND student.section=:sid
AND
AND student.section IS NOT NULL
如果student.section = 10
和:sid
为20,则不会获得该记录,但是如果将其更改为IS NOT NULL
,则会因为10
当然不是null ,但它也不是20,因此逻辑已更改。在一种情况下,您不会获得另一种记录。
更新
这是我唯一能想到的
$sql = 'SELECT
...
FROM student
WHERE class=:cid AND section';
if(empty($_POST['section']))
$sql .= ' IS NULL';
else
$sql .= ' = :sid';
$result=$con->prepare($sql);
$result->bindParam(':cid',$_POST['class']); //this is wrong
$result->execute();
UPDATE1
但是,您也不应该这样做。
$result=$con->prepare($sql); //this is PDOStatment not a result
$result->bindParam(':cid',$_POST['class']); //this is wrong
$result->execute(); //your not setting a result variable
此外,很难有条件地绑定到stmt (PDOStatment object)
,因为在构造查询时您还没有绑定。您可以执行prepare
2x并绑定到cid
2x。您可以执行条件2x,然后在第二个条件中进行绑定。但是,我们正在做短它,幸运的是我们可以将参数作为execute
的数组传递。
所以我将其更改为使用参数数组
$sql = 'SELECT
...
FROM student
WHERE class=:cid AND section';
$param = [':cid' => $_POST['class']];
if(empty($_POST['section'])){
$sql .= ' IS NULL';
}else{
$sql .= ' = :sid';
$param[':sid'] = $_POST['section'];
}
$stmt=$con->prepare($sql);
$result = $stmt->execute($param);
$data = $result->fetchAll(PDO::FETCH_ALL);
问题的措辞很难理解。基本上,这只是DRY(不要重复自己)原则,这很好。不像WET(两次写入所有内容)...大声笑。因此,当有人说您的编码全是WET时,您就知道他们的意思了。 :)
事实上,我是如此困惑,我几乎错过了$result
问题。
干杯!
答案 1 :(得分:0)
选择NULL值时,不应使用等号语句。您应该使用IS语句,如下所示:
对于空值
SELECT foo
FROM bar
WHERE status IS NULL;
或非空值
SELECT foo
FROM bar
WHERE status IS NOT NULL;