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

PHP连接Oracle数据库日期范围筛选失效求助

问题分析与解决方案

核心问题原因

  1. oci_num_rows调用时机错误:在执行oci_execute($query)前就调用oci_num_rows($query),此时查询未执行,返回行数必然为0,直接触发"Record Not Found"分支,这是你看到无结果的直接原因。
  2. 日期格式与Oracle NLS配置不匹配:Oracle的NLS_DATE_FORMAT为DD.MM.RR,但你生成的日期字符串是d-M-y格式(如17-FEB-23),Oracle会用DD.MM.RR规则解析该字符串,解析失败后无法匹配数据库中的日期值,导致筛选失效。
  3. SQL字符串拼接存在风险:直接将用户输入拼进SQL,不仅依赖NLS配置稳定性差,还存在SQL注入漏洞。

分步解决方案

1. 修正oci_num_rows调用顺序

必须在oci_execute($query)执行完成后,再调用oci_num_rows获取正确的查询行数。

2. 优化日期筛选逻辑

采用绑定变量+明确日期格式转换的方式,彻底规避NLS配置影响和SQL注入风险:

修改后的Filter.php代码

<?php
include 'orc_php.php';
if(ISSET($_POST['search'])){
    // 保留用户输入的原始日期值,无需提前转换格式
    $date1 = $_POST['date1'];
    $date2 = $_POST['date2'];

    // 使用绑定变量,结合TO_DATE明确指定输入日期格式
    $query=oci_parse($conn, "select distinct
       auf.aufdzhost
     , auf.aufnr
     , te.tenam
     , art.artnr
     , aup.aupmgist
    from
       auf_a_v  auf
     , te_a_v   te
     , artall_v art
     , aup_a_v  aup
    where
       auf.aufid            = te.aufid
       and aup.aufid        = auf.aufid
       and art.artid        = aup.artid
       and auf.aufGrpNam like 'NATCAN%'
       and aup.aupmgist    != 0
       and auf.aufdzhost BETWEEN TO_DATE(:date1, 'DD-MM-YYYY') AND TO_DATE(:date2, 'DD-MM-YYYY')") or die(oci_error());

    // 绑定变量,避免SQL注入
    oci_bind_by_name($query, ':date1', $date1);
    oci_bind_by_name($query, ':date2', $date2);

    oci_execute($query);
    // 执行后再获取有效行数
    $rowCount = oci_num_rows($query);
    if($rowCount>0){
        while($row=oci_fetch_array($query)){
?>
<tr>
    <td><?php echo $row['AUFNR']?></td>
    <td><?php echo $row['TENAM']?></td>
    <td><?php echo $row['ARTNR']?></td>
    <td><?php echo $row['AUPMGIST']?></td>
    <td><?php echo $row['AUFDZHOST']?></td>
</tr>
<?php
        }
    }else{
        echo'
        <tr>
            <td colspan = "5"><center>Record Not Found</center></td>
        </tr>';
    }
}else{
    // 原有无筛选查询逻辑保持不变
    $query=oci_parse($conn, "select distinct
       auf.aufdzhost
     , auf.aufnr
     , te.tenam
     , art.artnr
     , aup.aupmgist
    from
       auf_a_v  auf
     , te_a_v   te
     , artall_v art
     , aup_a_v  aup
    where
       auf.aufid            = te.aufid
       and aup.aufid        = auf.aufid
       and art.artid        = aup.artid
       and auf.aufGrpNam like 'NATCAN%'
       and aup.aupmgist    != 0") or die(oci_error());
    oci_execute($query);
    while($row=oci_fetch_array($query)){
?>
<tr>
    <td><?php echo $row['AUFNR']?></td>
    <td><?php echo $row['TENAM']?></td>
    <td><?php echo $row['ARTNR']?></td>
    <td><?php echo $row['AUPMGIST']?></td>
    <td><?php echo $row['AUFDZHOST']?></td>
</tr>
<?php
    }
}
?>

3. 补充说明

  • 修正了colspan值为5(表格实际有5列),避免布局错乱。
  • 确保用户输入的日期格式为DD-MM-YYYY(如17-02-2023),若输入框使用其他格式,需同步调整TO_DATE函数中的格式参数(例如用户输入MM/DD/YYYY,则改为'MM/DD/YYYY')。
  • 绑定变量的方式既提升了安全性,又能让Oracle缓存执行计划,优化查询性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:09:59