Oracle SQL查询及PHP逻辑问题:else语句未触发
问题解决:Oracle查询无匹配时else语句未生效
问题概述
通过NIK字段查询Oracle数据库MASTER_KRY表的NAMA字段,当NIK无匹配数据时,预期触发else语句返回指定提示,但实际返回空数组[]而非提示文本;匹配时可正常返回[{"NAMA":"Galeh S"}]。
数据库结构:
| NIK | NAMA |
|---|---|
| 94878 | Alfian U |
| 98345 | Galeh S |
问题根源
原代码中用oci_execute($eksekusi)的返回值$cek判断是否有数据,但oci_execute仅返回布尔值——只要SQL语句合法可执行,无论结果集是否为空,都会返回true。因此$cek > 0始终为真,永远不会进入else分支。
修正后的代码
<?php include ("koneksi.php"); if($_SERVER['REQUEST_METHOD'] == 'POST'){ $NIK = $_POST["NIK"]; // 注意:存在SQL注入风险,建议使用绑定变量(见下方说明) $query = "SELECT NAMA FROM MASTER_KRY WHERE NIK = '$NIK'"; $eksekusi = oci_parse($conn, $query); $cek = oci_execute($eksekusi); if($cek){ $response = array(); while($ambil = oci_fetch_object($eksekusi)){ $F["NAMA"] = $ambil->NAMA; array_push($response, $F); } // 遍历完成后检查结果集是否为空 if(empty($response)){ $response = "Data not available"; } } else { $response = "Query execution failed"; } } else{ $response = "Response Error"; } echo json_encode($response); oci_close($conn); ?>
关键修正说明
- 移除
$cek > 0的错误判断,直接用if($cek)验证SQL执行是否成功 - 在结果集遍历结束后,通过
empty($response)检查是否有匹配数据,为空则设置指定提示 - 安全提示:原代码存在SQL注入风险,建议改用Oracle绑定变量写法,示例如下:
// 替换原查询与执行代码段 $query = "SELECT NAMA FROM MASTER_KRY WHERE NIK = :nik"; $eksekusi = oci_parse($conn, $query); oci_bind_by_name($eksekusi, ':nik', $NIK); $cek = oci_execute($eksekusi);
内容的提问来源于stack exchange,提问作者Farrasta K S
相关产品推荐
相关产品推荐

