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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:34:50