繁体   English   中英

PHP oci_bind_by_name不在循环中工作

[英]php oci_bind_by_name not working in loop

我试图通过名称在一个不起作用的foreach循环中进行绑定。

旧的工作方式:

oci_bind_by_name($result, ':exemptionid', $exemption_id, 10, SQLT_INT);
oci_bind_by_name($result, ':seq', $seq, 10, SQLT_INT);
oci_bind_by_name($result, ':action', $action, 20, SQLT_CHR);
oci_bind_by_name($result, ':s_zone',$sourceZones,48,SQLT_CHR);
oci_bind_by_name($result, ':s_seczone',$szone1,32,SQLT_CHR);
oci_bind_by_name($result, ':d_zone',$destinationZones,48,SQLT_CHR);
oci_bind_by_name($result, ':d_seczone',$dzone1,32,SQLT_CHR);
if($protocol_id != null) {
    oci_bind_by_name($result, ':protocolid', $protocol_id, 10, SQLT_INT);
}
if($ports != null) {
    oci_bind_by_name($result, ':ports', $ports, 32, SQLT_CHR);
}
if($note != null) {
    oci_bind_by_name($result, ':note', $note, 128, SQLT_CHR);
}
oci_bind_by_name($result, ':method', $method, 1, SQLT_CHR);
$authuser = authUser();
oci_bind_by_name($result, ':authuser', $authuser, 64, SQLT_CHR);

但是,当我将所有这些放入数组并放入函数并尝试在循环中对其进行处理时,它将无法绑定整数。

不工作

function bind($resource, $binds){
    foreach ($binds as $placeholder => $varibale){
        oci_bind_by_name($resource,$placeholder, $varibale[0],$varibale[1],$varibale[2]);
    }
}

$binds = [
    ':exemptionid' => [
        $exemption_id,
        10,
        SQLT_INT
    ],
    ':source' => [
        ($source != "") ? $source : $sourceZones,
        strlen ($source),
        SQLT_CHR
    ],
    ':destination' => [
        ($destination != "" ) ? $destination : $destinationZones,
        strlen ($destination),
        SQLT_CHR
    ]
];

if ($protocol_id != null) {
    $binds [':protocolid'] = [
        $protocol_id,
        10,
        SQLT_INT
    ];
}
if ($ports != null) {
    $binds [':ports'] = [
        $ports,
        32,
       SQLT_CHR
    ];
}

bind($resource, $binds); // not working

我得到的错误是oci_execute(): ORA-01438: value larger than specified precision allowed for this column但是我的列都没有小数,并且我没有传递任何小数。

更新

为什么我必须通过裁判?

function bind($resource, $binds)
{
    foreach ($binds as $key => $val) {
        $variable = &$binds[$key][0];
        $length = (isset($binds[$key][1])) ? $binds[$key][1] : -1;
        $type = (isset($binds[$key][2])) ? $binds[$key][2] : SQLT_CHR;
        oci_bind_by_name($resource, $key, $variable, $length, $type);
                        }
}

oci_bind_by_name手册页上的注释中( 示例3)使用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]);
}

因此,您应该像这样更改您的函数(将vars重命名以避免换行):

function bind($resource, $binds)
{
    foreach ($binds as $key => $val) {
        oci_bind_by_name($resource, $key, $binds[$key][0], $binds[$key][1], $binds[$key][2]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM