PHP标签生成程序打印时默认过期日期错误,求正确显示有效期的方法
PHP标签生成软件过期日期显示错误的修正方案
问题核心原因
当前代码中,过期日期普遍显示默认值的关键问题是Oracle日期格式与PHP strtotime函数兼容性差,导致日期解析失败;同时未处理日期字段为空的场景,进一步引发默认日期显示。
修正方案
方案一:SQL端直接格式化日期(推荐)
利用Oracle的TO_CHAR函数在查询时直接将日期格式化为DD/MM/YYYY,避免PHP端解析出错:
SELECT mvs.pro_in_codigo, epr.pro_st_descricao, epr.uni_st_unidade, mvs.mvs_st_loteforne, TO_CHAR(mvs.mvs_dt_validade, 'DD/MM/YYYY') AS MVS_DT_VALIDADE FROM Testing.est_movsumarizado mvs, Testing.est_produtos epr WHERE epr.pro_in_codigo = mvs.pro_in_codigo AND epr.pro_in_codigo = :code ORDER BY epr.pro_in_codigo
对应PHP代码无需再做日期转换,直接使用查询结果,并处理空值:
$expiryDateFormatted = $row['MVS_DT_VALIDADE'] ?? '无过期日期';
方案二:使用OCI专用日期处理
若需在PHP端处理日期,利用OCI扩展的日期对象解析功能,避免strtotime的兼容性问题:
// 替换原日期解析代码 $date = oci_result($stmt, 'MVS_DT_VALIDADE'); $expiryDateFormatted = $date !== false ? $date->format('d/m/Y') : '无过期日期';
注:需确保OCI扩展支持日期对象解析,部分环境需配置。
方案三:增强空值与异常处理
针对原代码的日期解析逻辑,增加校验避免解析失败:
$expiryDate = $row['MVS_DT_VALIDADE']; if (!empty($expiryDate) && ($timestamp = strtotime($expiryDate))) { $expiryDateFormatted = date("d/m/Y", $timestamp); } else { $expiryDateFormatted = '无过期日期'; }
修改后的完整代码(方案一示例)
<?php header('Content-Type: application/json'); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $data = json_decode(file_get_contents('php://input'), true); $code = htmlspecialchars($data['code']); $quantity = htmlspecialchars($data['quantity']); $totalLabels = htmlspecialchars($data['totalLabels']); $servername = "000.000.000.00"; $port = "0000"; $username = "Testing"; $password = "exp"; $service_name = "exp"; $conn = oci_connect($username, $password, "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = $servername)(PORT = $port)))(CONNECT_DATA=(SERVICE_NAME=$service_name)))"); if (!$conn) { $e = oci_error(); echo json_encode(['success' => false, 'message' => $e['message']]); exit; } // 已修改的SQL:直接格式化日期 $sql = "SELECT mvs.pro_in_codigo, epr.pro_st_descricao, epr.uni_st_unidade, mvs.mvs_st_loteforne, TO_CHAR(mvs.mvs_dt_validade, 'DD/MM/YYYY') AS MVS_DT_VALIDADE FROM Testing.est_movsumarizado mvs, Testing.est_produtos epr WHERE epr.pro_in_codigo = mvs.pro_in_codigo AND epr.pro_in_codigo = :code ORDER BY epr.pro_in_codigo"; $stmt = oci_parse($conn, $sql); oci_bind_by_name($stmt, ':code', $code); oci_execute($stmt); if ($row = oci_fetch_assoc($stmt)) { $expiryDateFormatted = $row['MVS_DT_VALIDADE'] ?? '无过期日期'; $labelContent = " <div class='label'> <p class='header'><strong>PRODUTO/ITEM:</strong></p> <p class='large-text'>{$row['PRO_ST_DESCRICAO']}</p> <div class='content'> <div class='left-section'> <p class='header'><strong>CÓDIGO:</strong></p> <p class='large-text'>{$row['PRO_IN_CODIGO']}</p> </div> <div class='right-section'> <p class='header'><strong>QTD / CAIXA:</strong></p> <p class='large-text'>{$quantity}</p> </div> <div class='left-section'> <p class='header'><strong>DATA VAL:</strong></p> <p class='large-text'>{$expiryDateFormatted}</p> </div> </div> <p class='lot'><strong>Lote: </strong>{$row['MVS_ST_LOTEFORNE']}</p> <div class='print-counter'>{pageNumber}</div> <div class='bottom-section'></div> </div>"; echo json_encode(['success' => true, 'labelContent' => $labelContent]); } else { echo json_encode(['success' => false, 'message' => 'Produto não encontrado.']); } oci_free_statement($stmt); oci_close($conn); } ?>
额外排查点
- 确认
est_movsumarizado表中mvs_dt_validade字段是否存储了有效日期值,排除数据库端数据异常。 - 若同一商品存在多批次记录,当前代码仅返回第一条,需确认是否需要新增批次选择逻辑。
内容的提问来源于stack exchange,提问作者Lucas Jesus
相关产品推荐
相关产品推荐

