You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP导出MySQL数据并将数字请假状态转为字符串

解决PHP导出CSV/XLS时MySQL数字状态转字符串的问题

嘿,我一眼就发现你代码里的问题啦!状态转换逻辑没生效的核心原因是**$sta的赋值语句写错了**,导致判断条件永远不成立,所以导出的还是数据库里的原始数字1和2。

先看你的错误点

你写了:

$sta='.$row["sta"].';

这行代码会把$sta变成一个字符串".$row["sta"].",而不是从数据库里取到的数字值!这样后续的if($sta==1)和if($sta==2)判断永远为假,$status变量要么没被赋值,要么用了之前的残留值,自然显示不对。

修正后的代码(直接改PHP逻辑)

把状态判断的部分改成下面这样,就能正常转换了:

while($row = mysqli_fetch_array($result)) {
    // 直接获取数据库中的数字状态,不要加多余的字符串拼接符号
    $sta = $row["sta"];
    
    // 用更严谨的判断,覆盖所有可能的状态
    if ($sta == 1) {
        $status = "Approved";
    } elseif ($sta == 2) {
        $status = "Rejected";
    } else {
        // 处理其他未定义的状态,比如待审批(如果业务里有这个状态的话)
        $status = "Pending";
    }

    // 下面的表格拼接代码保持不变,直接用$status即可
    $output .= ' <tr>
    <td>'.$row["id"].'</td>
    <td>'.$row["EmpId"].'</td>
    <td>'.$row["LastName"].' '.$row["FirstName"].'</td>
    <td>'.$row["EmailId"].'</td>
    <td>'.$row["Phonenumber"].'</td>
    <td>'.$row["LeaveType"].'</td>
    <td>'.$row["FromDate"].'</td>
    <td>'.$row["ToDate"].'</td>
    <td>'.$row["duration"].'</td>
    <td>'.$row["descr"].'</td>
    <td>'.$status.'</td> <!-- 这里现在会显示正确的字符串 -->
    <td>'.$row["PostingDate"].'</td>
    <td>'.$row["adminRemark"].'</td>
    <td>'.$row["AdminRemarkDate"].'</td>
    </tr> ';
}

额外的两种优化方案

方案1:直接在SQL查询中转换状态

如果不想在PHP里写判断,可以在MySQL查询时用CASE表达式直接把数字转成字符串,这样PHP代码更简洁:

SELECT 
    tblemployees.FirstName,
    tblemployees.LastName,
    tblemployees.EmpId,
    tblemployees.Gender,
    tblemployees.Phonenumber,
    tblemployees.EmailId,
    applyleave.id,
    applyleave.LeaveType,
    applyleave.FromDate,
    applyleave.duration,
    applyleave.ToDate,
    applyleave.descr,
    applyleave.PostingDate,
    -- 这里直接把sta字段转成对应的字符串
    CASE applyleave.sta 
        WHEN 1 THEN 'Approved' 
        WHEN 2 THEN 'Rejected' 
        ELSE 'Pending' 
    END AS leave_status,
    applyleave.adminRemark,
    applyleave.AdminRemarkDate 
FROM applyleave 
INNER JOIN tblemployees ON applyleave.employeeID = tblemployees.EmpId

之后在PHP里直接取$row["leave_status"]就行,不用再写判断逻辑。

方案2:导出标准CSV文件(替代HTML转XLS)

你当前的代码是生成HTML表格然后伪装成XLS文件,其实如果要导出标准CSV,可以用PHP的fputcsv函数,格式更规范,不会有HTML标签:

// 打开输出流
$output = fopen('php://output', 'w');
// 输出CSV表头
fputcsv($output, [
    'No', 
    'Employee ID', 
    'Employee Name', 
    'Employee Email', 
    'Employee Contact Number', 
    'Leave Type', 
    'From Date', 
    'To Date', 
    'Duration', 
    'Reason', 
    'Leave Status', 
    'Request Date', 
    'Admin Remark', 
    'Admin Remark Date'
]);

// 循环输出每一行数据
while($row = mysqli_fetch_array($result)) {
    $status = match($row["sta"]) {
        1 => "Approved",
        2 => "Rejected",
        default => "Pending"
    };

    // 组装一行CSV数据
    $csvRow = [
        $row["id"],
        $row["EmpId"],
        $row["LastName"] . ' ' . $row["FirstName"],
        $row["EmailId"],
        $row["Phonenumber"],
        $row["LeaveType"],
        $row["FromDate"],
        $row["ToDate"],
        $row["duration"],
        $row["descr"],
        $status,
        $row["PostingDate"],
        $row["adminRemark"],
        $row["AdminRemarkDate"]
    ];
    fputcsv($output, $csvRow);
}

// 设置CSV响应头
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='. date('Y-m-d') .' Leave Balance.csv');
exit;

这样修改后,导出的文件里就能正确显示Approved和Rejected啦!

内容的提问来源于stack exchange,提问作者user12977446

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:17:45