我正在尝试在 PHP 中使用 OCI8 实现按条件查找方法,其中如果对象有参数集,则它应该查询所有记录,其中给定的参数与记录中的参数类似。但由于某种原因查询结果为空。
$id = $model->getId();
// create the criterias for each parameters
if (isset($id)) $crits[] = "ID = :id";
// ...
if (!empty($crits))
//extend the sql with the criterias
$sql .= " AND " . implode(" AND ", $crits);
if (!$stmt = oci_parse($this->dataSource->getConnection(), $sql))
throw new DataAccessException('parse ' . json_encode(oci_error($stmt)));
// bind the required parameters
if (isset($id) && !oci_bind_by_name($stmt, ':id', $id, -1))
throw new DataAccessException('bind id ' . json_encode(oci_error($stmt)));
// ...
if (!oci_execute($stmt, OCI_DEFAULT))
throw new DataAccessException('exec ' . json_encode(oci_error($stmt)));
// handle result...
}
sql一定是正确的,我复制了代码组装的sql,手动绑定,得到了正确的结果,所以我认为问题应该出在绑定上。
我通过删除它们来检查错误处理是否不正确,并且绑定实际上并未发生,但事实并非如此,因为那时 oci_execute 将抛出错误。
由于无法检查绑定的sql,所以我陷入困境。
感谢您的帮助!
我发现了问题,$id的值存储为字符串,但它是数字,所以我必须像这样修改绑定:
oci_bind_by_name($stmt, ':id', $id, -1, is_numeric($id) ? SQLT_INT : SQLT_CHR);