【问题标题】:Abnormal behaviour in OCI_BIND_BY_NAMEOCI_BIND_BY_NAME 中的异常行为
【发布时间】:2018-11-16 06:33:27
【问题描述】:

我使用以下代码使用oci_bind_by_name 绑定变量,但即使有多行可用,也只返回单行。

<?php 
    $queryArr = array(11423,24242,2463,23434);
    $sqlarr = array();
    for ($i = 0; $i < count($queryArr); $i++) {
        array_push($sqlarr, ":B$i");
    }
    $sqlstr = implode(",", $sqlarr);
    $sql = "SELECT COL1, COL2, STATUS FROM TAB1 WHERE P_KEY = :USR_ID AND S_COL IN (" . $sqlstr . ") ORDER BY STATUS";
    $this->sth = oci_parse($this->con, $sql);
    oci_bind_by_name($this->sth, ":USR_ID", $usrid);
    for ($i = 0; $i < count($queryArr); $i++) {
        $bid = $queryArr[$i];
        oci_bind_by_name($this->sth, ":B$i", $bid);
    }
    oci_execute($this->sth);
?>

花了 3 个小时在代码中找到错误后,我发现问题出在 OCI_BIND_BY_NAME 上。我将上面的代码更改如下,现在我得到了所有的行。

<?php 
    $queryArr = array(11423,24242,2463,23434);
    $sqlarr = array();
    for ($i = 0; $i < count($queryArr); $i++) {
        array_push($sqlarr, ":B$i");
    }
    $sqlstr = implode(",", $sqlarr);
    $sql = "SELECT COL1, COL2, STATUS FROM TAB1 WHERE P_KEY = :USR_ID AND S_COL IN (" . $sqlstr . ") ORDER BY STATUS";
    $this->sth = oci_parse($this->con, $sql);
    oci_bind_by_name($this->sth, ":USR_ID", $usrid);
    for ($i = 0; $i < count($queryArr); $i++) {
    //Changed code --START--
        $bindName = ":B".$i;
        oci_bind_by_name($this->sth, $bindName, $queryArr[$i]);
    //Changed code --END--
    }
    oci_execute($this->sth);
?>

有人可以解释一下这背后的原因吗?

总结一下:

当通过附加字符串创建变量并在OCI_BIND_BY_NAME 中使用它时,它工作正常,但是当我直接在函数中附加字符串时,它不能正常工作。此外,它没有给出任何错误消息。它正在执行,但只返回单行。

【问题讨论】:

  • oci_bind_by_name() 不就是这样工作的吗? «将 PHP 变量 绑定到 Oracle 占位符»。也许它正在返回false;你不检查那个。

标签: php oracle oracle-call-interface


【解决方案1】:

您的第一个示例是在每次迭代中绑定$bid,即重复使用相同的变量位置(内存地址)。请参阅oci_bind_by_name() documentation 中的相关示例 'Example #3 Binding with a foreach() 循环':

foreach ($ba as $key => $val) {

    // oci_bind_by_name($stid, $key, $val) does not work
    // because it binds each placeholder to the same location: $val
    // instead use the actual location of the data: $ba[$key]
    oci_bind_by_name($stid, $key, $ba[$key]);
}

【讨论】:

  • 好的,但是我正在更新位置$bid的值,如果没有,在绑定时是否不会使用更新的值,那为什么?变量意味着在同一位置有一个可以更改的值。
  • 看来,它正在将占位符与变量$val 绑定,当循环完成时,$val 只有最后一个迭代值,所以所有占位符都指向同一个值。为了解决这个问题,我们可以在循环内创建新变量或使用数组索引,如示例所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多