首页 > 解决方案 > elseif 当 mysql 查询没有返回任何行时

问题描述

我正在制作一个简单的时钟系统,允许员工记录他们的工作时间。

我有一个存储时间戳和天气的表,这是一个打卡或打卡操作。根据给定用户的最后一个操作,会显示相反的选项。例如,如果最后一个动作是打卡,那么呈现的动作应该是打卡。

在用户没有使用系统的情况下,他们应该看到一个打卡选项。

$sql_status = "SELECT * FROM timeclock WHERE employeeid = $employee_number ORDER BY id DESC LIMIT 1";
if ($result=$mysqli->query($sql_status)) {
    while ($row = $result->fetch_row()){
        $timeclock_action = $row[2];
        $timeclock_timestamp = $row[3];
            if($timeclock_action=="out") {
                $forward_action = "clockin";
                $forward_action_label = "Clock in";
                $timeclock_status_label = "Last clock out: ";
            } elseif($timeclock_action=="in") {
                $forward_action = "clockout";
                $forward_action_label = "Clock out";
                $timeclock_status_label = "Clocked in: ";
            }
    }
} elseif(mysql_num_rows($result)==0) {
    $forward_action = "clockin";
    $forward_action_label = "Clock in";
    $timeclock_status_label = "You've never clocked in before";
} else {
    echo "Error: " . $sql . "<br>" . $mysqli->error;
}

我的思考过程是 elseif mysql 查询返回 0 行,变量将被相应地设置,但它们根本没有被设置。我的想法哪里错了?谢谢!

标签: phpmysqlmysqli

解决方案


您当前的逻辑是,如果查询失败- 即查询返回false(不是它没有返回任何结果,而是执行完全失败),您检查返回的行数是否为零。

相反,您应该先执行查询,然后检查是否有任何行返回。您也不需要循环多行,因为您只希望LIMIT 1查询中有一行。

您还应该考虑使用准备好的语句而不是直接在查询中注入变量,并进行其他一些错误处理;因为错误不应该直接显示给用户(记录错误,并显示一般的“出错了”消息)。

// The query to be executed
$sql_status = "SELECT * FROM timeclock WHERE employeeid = $employee_number ORDER BY id DESC LIMIT 1";

// See if the query was successful or not
if ($result = $mysqli->query($sql_status)) {
    // If there are any rows returned
    if ($result->num_rows) {
        // Fetch rows - no need for a loop since you only expect one record (LIMIT 1 in the query)
        $row = $result->fetch_row();
        $timeclock_action = $row[2];
        $timeclock_timestamp = $row[3];

        if ($timeclock_action=="out") {
            $forward_action = "clockin";
            $forward_action_label = "Clock in";
            $timeclock_status_label = "Last clock out: ";
        } elseif ($timeclock_action=="in") {
            $forward_action = "clockout";
            $forward_action_label = "Clock out";
            $timeclock_status_label = "Clocked in: ";
        }
    } else {
        $forward_action = "clockin";
        $forward_action_label = "Clock in";
        $timeclock_status_label = "You've never clocked in before";
    }
} else {
    // The query failed
    echo "Error: " . $sql . "<br>" . $mysqli->error;
}

推荐阅读