【问题标题】:Nested IF using query in PHP MySQL在 PHP MySQL 中使用查询嵌套 IF
【发布时间】:2021-12-06 22:08:04
【问题描述】:

我在处理这段代码时遇到了问题。它不会根据查询进入第三个条件。 我有 5 列要处理。

AMIN AMOUT PMIN PMOUT 状态

第一个条目创建记录是没有该日期和学生的记录。列:AMIN,状态为 0 它应该在 AMOUT 和 STATUS 列上更新为 1 接下来,应该将 PMIN 更新为 STATUS 2 最后将 PMOUT 更新为状态 3。

此代码仅在 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;
            }   
        }

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我有 5 列可以使用。 不,提供完整的 CREATE TABLE 脚本。
  • 创建表 attendance ( ID int(11) NOT NULL, STUDENTID varchar(250) NOT NULL, AMIN varchar(250) NOT NULL, AMOUT varchar(250 ) 非空,PMIN varchar(50) 默认空,PMOUT varchar(50) 默认空,LOGDATEvarchar(250) 非空,STATUSvarchar(2) 非空,) ENGINE=InnoDB 默认字符集=utf8mb4;
  • 请不要将事实作为 cmets 发布 - 将它们添加到问题文本中(使用下方的编辑链接)。

标签: php mysql nested conditional-statements


【解决方案1】:

看来你需要:

  1. 按学生和日期创建唯一索引:
CREATE UNIQUE INDEX idx_student_date ON attendance (studentid, logdate);
  1. 使用下一个查询:
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)

fiddle

【讨论】:

  • 所以只有一个查询?我会尝试...
  • @JohnArzaga 所以只有一个查询? 是的。通过提供的链接查看小提琴。
  • 这些太棒了!谢谢你,兄弟。非常好的和安全的技术。我总是想着做这个程序。现在我已经开始学习了。我想了解更多关于 sql 过程的信息。再次感谢你。它节省了我的时间。
  • @JohnArzaga 您可以使用查询本身,而不是存储过程。我创建 SP 只是为了不重复这个长 SQL 文本的目的。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 2016-05-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 2012-10-12
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多