如何用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
相关产品推荐
相关产品推荐

