我在php中有一个存储过程来处理一些数据。这是我的称呼方式:
$listeDeNdi= $_POST['LISTEDENDI'];
$ndiTable=split("\n", $listeDeNdi);
$calibreLongueur= $_POST['CALIBRELONGUEUR'];
$validit=$_POST['VALIDITE'];
$sql="DECLARE
PI_NDI NUMBER;
PI_VALIDITE NUMBER;
PI_CALIBRE_LONGUEUR VARCHAR2(32767);
PO_CODE_ERR NUMBER;
PO_LIB_ERR VARCHAR2(32767);
BEGIN
ARIANE_ADMIN.P_FORCE_ELIGIBILITE ( :PI_NDI, :PI_VALIDITE, :PI_CALIBRE_LONGUEUR, :PO_CODE_ERR, :PO_LIB_ERR );
END;";
$stid = oci_parse($conn, $sql);
for ( $i=0;$i<count($ndiTable); $i++){
$binds = [
':PI_VALIDITE'=> $validit,
':PI_CALIBRE_LONGUEUR'=> $calibreLongueur,
':PI_NDI'=> $ndiTable[$i],
':PO_CODE_ERR'=> $PO_CODE_ERR,
':PO_LIB_ERR'=> $PO_LIB_ERR,
];
foreach ($binds as $key => $val){
if($key === ':PO_CODE_ERR'){
oci_bind_by_name($stid, $key, $binds[$key],40);
} else if ($key === ':PO_LIB_ERR'){
oci_bind_by_name($stid, $key, $binds[$key], 32767 , SQLT_CHR);
}else {
oci_bind_by_name($stid, $key, $binds[$key]);
}
}
oci_execute($stid);
echo "For NDI ".$ndiTable[$i]." :<br> ";
echo "PO_LIB_ERR : ".$binds[':PO_LIB_ERR'];
echo "<br>";
echo "PO_CODE_ERR : ".$binds[':PO_CODE_ERR'];
echo "<br>";
$code[$i]=$binds[':PO_CODE_ERR'];
$lib[$i]=$binds[':PO_LIB_ERR'];
}
foreach($code as $i){
echo $code[$i]."<br>";
echo "hi<br> ";
}
foreach($lib as $i){
echo $lib[$i]."<br>";
echo "hi<br> ";
}
我从表单中获取电话号码列表,并且每个列表元素调用一次该过程,如您在上面代码的for循环中所见。
当列表仅包含一个元素时,效果很好,但是当列表包含多个元素时,似乎只有最后一次迭代才填充了我的参数PO_CODE_ERR和PO_LIB_ERR。
我进行了搜索,发现它可能与oci_bind_by_name函数和循环有关,如php manual中所述:
PHP变量参数是一个引用。某些形式的循环无法按预期工作:
<?php
foreach ($myarray as $key => $value) {
oci_bind_by_name($stid, $key, $value);
}
?>
这会将每个键绑定到$ value的位置,因此所有绑定变量最终都指向最后一个循环迭代的值。而是使用以下内容:
<?php
foreach ($myarray as $key => $value) {
oci_bind_by_name($stid, $key, $myarray[$key]);
}
?>
但是,我不确定它如何适用于我的案件以及如何解决。任何帮助将不胜感激。非常感谢!
编辑:添加我未指定的打印件和从打印件中得到的结果:
列表中只有一个元素时:
对于NDI 987987987:
PO_LIB_ERR:错误:错误信息的安全来源:NDI DANS LE CACHE ARIANE
PO_CODE_ERR:1
列表中有多个元素时:
对于NDI 987987987:
PO_LIB_ERR:
PO_CODE_ERR:
对于NDI 654654654:
PO_LIB_ERR:
PO_CODE_ERR:
对于NDI 321321321:
PO_LIB_ERR:错误:错误信息的安全来源:NDI DANS LE CACHE ARIANE
PO_CODE_ERR:1
Edit2:我尝试将参数PO_LIB_ERR和PO_CODE_ERR存储在两个数组中,并在for循环后打印它们(请参见上面的代码)。 尽管我可以在for循环中看到打印的结果,但是在新数组中看不到它们,但是在回显它们时它们只是显示空行。
赞:
对于NDI 787778781:
PO_LIB_ERR:错误:错误信息的安全来源:NDI DANS LE CACHE ARIANE
PO_CODE_ERR:1
嗨
嗨
答案 0 :(得分:0)
一段时间后,我们找到了使用oci_error来打印任何来自oci_execute的错误消息的解决方案。
原来我们的电话号码是字符串而不是整数,所以oracle返回此错误:
数字或值错误:字符到数字的转换错误ORA-06512
我们只需要在映射中强制转换电话号码数组:
$binds = [
':PI_VALIDITE'=> $validit,
':PI_CALIBRE_LONGUEUR'=> $calibreLongueur,
':PI_NDI'=>(int)$ndiTable[$i],
':PO_CODE_ERR'=> $PO_CODE_ERR,
':PO_LIB_ERR'=> $PO_LIB_ERR
];