我们使用甲骨文数据库。对于我的less应用程序,我编写了一个小的数据库助手类来提供选择、更新和插入方法,并且有更少的(和非冗余的)代码。但是有时查询的结果并不像预期的那样,或者由于文字错误而抛出错误的插入,但是赋值是正确的。
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;
}举个例子,我称之为
$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,则不起作用。
很高兴看到正在执行的语句,但我认为这是不可能的。
你知道鲍特吗?
发布于 2019-11-29 14:59:03
我认为这都是关于oci_bind_by_name()的缓存..。经过多次尝试和失败,我给了oci_bind_by_name的不是$value本身,而是对$值的引用。
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;
}https://stackoverflow.com/questions/59104443
复制相似问题