Ненормальное поведение в OCI_BIND_BY_NAME - PullRequest
0 голосов
/ 16 ноября 2018

Я использовал следующий код для привязки переменных, используя 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, она работает нормально, но когда я непосредственно добавляю строку в функцию, она работает неправильно. Кроме того, это не дает никакого сообщения об ошибке. Он выполняется, но возвращает только одну строку.

1 Ответ

0 голосов
/ 20 ноября 2018

Ваш первый пример связывает $bid в каждой итерации, т. Е. Одно и то же местоположение переменной (адрес памяти) используется повторно. См. Связанный пример «Пример # 3 Связывание с циклом foreach ()» в документации oci_bind_by_name () :

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...