提问人:John Arzaga 提问时间:10/20/2021 最后编辑:John Arzaga 更新时间:10/20/2021 访问量:67
在 PHP MySQL 中使用查询的嵌套 IF
Nested IF using query in PHP MySQL
问:
我在这个代码上遇到了问题。它不会基于查询转到第三个条件。 我有 5 列可以使用。
AMIN AMOUT PMIN PMOUT 状态
第一个条目创建记录是没有该日期和学生的记录。列:状态为 0 的 AMIN 它应在 AMOUT 列和 STATUS 上更新为 1 接下来,应将 PMIN 更新为 STATUS 为 2 最后更新状态为 3 的 PMOUT。
此代码仅适用于 PMIN,然后更新 AMOUT,更新 PMIN。它不会进入 PMOUT
我有这个代码:
<?php
$sql ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date'";
$query=$conn->query($sql);
if($query->num_rows>0){
$sql1 ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date' AND STATUS='1'";
$query1=$conn->query($sql1);
if($query1->num_rows>0){
$sql2 ="SELECT * FROM attendance WHERE STUDENTID='$id' AND LOGDATE='$date' AND STATUS='2'";
$query2=$conn->query($sql2);
if($query2->num_rows>0){
$sql = "UPDATE attendance SET PMOUT='$time', STATUS='3' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
$_SESSION['success'];
}
else{
$sql = "UPDATE attendance SET PMIN='$time', STATUS='2' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
$_SESSION['success'];
}
}
else{
$sql = "UPDATE attendance SET AMOUT='$time', STATUS='1' WHERE STUDENTID='$studentID' AND LOGDATE='$date'";
$query=$conn->query($sql);
}
}else{
$sql = "INSERT INTO attendance(STUDENTID,AMIN,LOGDATE,STATUS) VALUES('$studentID','$time','$date','0')";
if($conn->query($sql) ===TRUE){
$_SESSION['success'];
}else{
$_SESSION['error'] = $conn->error;
}
}
有没有更好的方法可以做到这一点?
答:
1赞
Akina
10/20/2021
#1
看来你需要:
- 按学生和日期创建唯一索引:
CREATE UNIQUE INDEX idx_student_date ON attendance (studentid, logdate);
- 使用下一个查询:
INSERT INTO attendance (studentid, logdate, amin, amout, pmin, pmout, status)
VALUES ($id, CURRENT_DATE, CURRENT_TIME, NULL, NULL, NULL, 0)
ON DUPLICATE KEY UPDATE
amout = CASE WHEN status = 0 THEN CURRENT_TIME ELSE amout END,
pmin = CASE WHEN status = 1 THEN CURRENT_TIME ELSE pmin END,
pmout = CASE WHEN status = 2 THEN CURRENT_TIME ELSE pmout END,
status = status + 1;
如果当前学生和日期的行不存在,则将创建它,如果存在,则将根据您的算法进行更新。不需要 PHP 中的嵌套 IF。
此外,我建议您更改必须与存储的数据相匹配的数据类型。
logdate
应该是DATE NOT NULL
amin, amout, pmin, pmout
应该是TIME
status
应该是TINYINT CHECK (status BETWEEN 0 AND 3)
评论
0赞
John Arzaga
10/20/2021
所以它只会一个查询?我将尝试。。。
0赞
Akina
10/20/2021
@JohnArzaga 所以它只会一个查询吗? 是的。通过提供的链接查看小提琴。
0赞
John Arzaga
10/20/2021
这些太棒了!谢谢你,伙计。非常好和安全的技术。我总是想做这个程序。现在我开始学习了。我想了解更多关于sql过程的信息。再次感谢你。它节省了我的一天。
0赞
Akina
10/20/2021
@JohnArzaga 您可以使用查询本身,而不是存储过程。我创建 SP 只是为了不重复这个长 SQL 文本目的。
评论
attendance
ID
STUDENTID
AMIN
AMOUT
PMIN
PMOUT
LOGDATE
STATUS