我使用以下代码通过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
中使用它来创建变量时,它可以正常工作,但是当我直接在函数中附加字符串时,它不能正常工作。另外,它没有给出任何错误消息。它正在执行,但仅返回单行。
答案 0 :(得分:0)
您的第一个示例在每次迭代中都绑定$bid
,即重用了相同的变量位置(内存地址)。请参见oci_bind_by_name() documentation中的相关示例“示例#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]);
}