php+ora01461,pdo的OCIStmtExecute: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误

本文分享了作者在从Oracle OCI迁移到PHP PDO时,如何处理CLOB字段长度超出VARCHAR4000限制的问题,重点介绍了两种解决方案:原始代码的局限及改进方法,通过绑定参数并指定适当长度以避免错误。
摘要由CSDN通过智能技术生成

以前用oci的时候遇到clob和blob的问题,这次用Pdo又遇到这个问题

pdo在字符长度小于varchar4000的前提下,你用clob字段,是不会有任何问题的。可以直接读写

但是存入的字符超过上面的限制时,就会报标题的错误

百度了一下,基本都是JAVA的解决方案,PHP的很少。

实际上,这个问题在OCI的时候遇到过。

以下是解决方案:

原始代码,这种方式可以处理字符串长度小于4000的clob字段,但是超过就要报错了:

//处理where的占位,注意where字句的占位符,不能有引号

$data=array_merge($data,$this->_dao_where_params);

$sth=$this->_dao_conn->prepare($update_str);

if($sth->execute($data))

{

$nums=$sth->rowCount();

//释放游标

$sth->closeCursor();

return $nums;

}

后来的处理方式,注意foreach循环内的第二个参数是引用传递,所以不能用$v,必须用数组名加下标的形式。

foreach ($data as $k=>$v)

{

$sth->bindParam($k+1,$data[$k],PDO::PARAM_STR,strlen($v));

}

if($sth->execute())

{

$nums=$sth->rowCount();

//释放游标

$sth->closeCursor();

return $nums;

}

关键点就是foreach中,bindParam的第二个参数,被这个折腾了很久,上次oci好像也是这里折腾了很久,都是最后解决了,才想起。

------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值