PHP连接Oracle数据库日期范围筛选失效求助
问题分析与解决方案
核心问题原因
oci_num_rows调用时机错误:在执行oci_execute($query)前就调用oci_num_rows($query),此时查询未执行,返回行数必然为0,直接触发"Record Not Found"分支,这是你看到无结果的直接原因。- 日期格式与Oracle NLS配置不匹配:Oracle的
NLS_DATE_FORMAT为DD.MM.RR,但你生成的日期字符串是d-M-y格式(如17-FEB-23),Oracle会用DD.MM.RR规则解析该字符串,解析失败后无法匹配数据库中的日期值,导致筛选失效。 - 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
相关产品推荐
相关产品推荐

