首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oci_bind_by_name和值类型问题或如何调试

oci_bind_by_name和值类型问题或如何调试
EN

Stack Overflow用户
提问于 2019-11-29 12:04:56
回答 1查看 83关注 0票数 0

我们使用甲骨文数据库。对于我的less应用程序,我编写了一个小的数据库助手类来提供选择、更新和插入方法,并且有更少的(和非冗余的)代码。但是有时查询的结果并不像预期的那样,或者由于文字错误而抛出错误的插入,但是赋值是正确的。

代码语言:javascript
复制
public function selectQuery($sqlString, $values2bind = null){
    $sqlResource = $this->queryWrapper($sqlString, $values2bind);
    $rows = [];
    if($sqlResource) {
        while ($row = oci_fetch_assoc($sqlResource)) {
            $rows[] = $row;
        }
        oci_free_statement($sqlResource);
        return $rows;
    }
    oci_free_statement($sqlResource);
    return false;
}
private function queryWrapper($sqlString, $values2bind){
    $sql = oci_parse($this->connection, $sqlString);
    if(is_array($values2bind)){
        foreach($values2bind as $key=>$value){
            oci_bind_by_name($sql, ":".$key, $value);
        }
    }
    if (!($sql)){
        $e = oci_error($this->connection);
        trigger_error(htmlentities($e['message'].$e["sqltext"], ENT_QUOTES), E_USER_ERROR);
        error_log($e['message'].$e["sqltext"]);
        return false;
    }
    $r = oci_execute($sql);
    if(!$r){
        $e = oci_error($this->connection);
        trigger_error(htmlentities($e['message'].$e["sqltext"], ENT_QUOTES), E_USER_ERROR);
        error_log($e['message'].$e["sqltext"]);
        return false;
    }
    return $sql;
}

举个例子,我称之为

代码语言:javascript
复制
$selectSQL = "SELECT to_char(SPZ_GILT_AB, 'DD.MM.YYYY') as INTERVALL_START, 
                         to_char(SPZ_GILT_BIS, 'DD.MM.YYYY') as INTERVALL_END
                  FROM SPZ_BLOCK 
                  WHERE ID = :id 
                    AND BID = :bid 
                    AND (SPZ_GILT_AB > sysdate OR (SPZ_GILT_AB < sysdate AND SPZ_GILT_BIS > sysdate))";
$intervals = $this->db->selectQuery($selectSQL, array('bid' => $bid, 'id' => $id));

$id和$bid都是数字字符串(即2524和5627)。BID和ID有数据库类型编号(10,0)。

但这里发生了一些奇怪的事情。如果我删除了$bid,它就能工作。如果使用$bid,则不起作用。

很高兴看到正在执行的语句,但我认为这是不可能的。

你知道鲍特吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-29 14:59:03

我认为这都是关于oci_bind_by_name()的缓存..。经过多次尝试和失败,我给了oci_bind_by_name的不是$value本身,而是对$值的引用。

代码语言:javascript
复制
private function queryWrapper($sqlString, $values2bind){
    $sql = oci_parse($this->connection, $sqlString);
    if(is_array($values2bind)){
        foreach($values2bind as $key => &$value){           // <- &$value instead of $value
            oci_bind_by_name($sql, ":".$key, $value);
        }
    }
    if (!($sql)){
        $e = oci_error($this->connection);
        trigger_error(htmlentities($e['message'].$e["sqltext"], ENT_QUOTES), E_USER_ERROR);
        error_log($e['message'].$e["sqltext"]);
        return false;
    }
    $r = oci_execute($sql);
    if(!$r){
        $e = oci_error($this->connection);
        trigger_error(htmlentities($e['message'].$e["sqltext"], ENT_QUOTES), E_USER_ERROR);
        error_log($e['message'].$e["sqltext"]);
        return false;
    }
    return $sql;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59104443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档