oracle thinphp 中文乱码_ThinkPHP与Oracle操作实践

在一次工作的实际项目中,PHP程序员雷雪松操作使用Oracle数据库时遇到很多奇葩的错误。因为第一次使用ThinkPHP操作Oracle数据库,几乎查找了网上所有的资料,测试很多解决办法,搞得心力憔悴。由于网上关于ThinkPHP操作Oracle数据库的资料较少,有些没有实践验证、过时或无效,在前面PHP程序员雷雪松的博客中详细讲解PHP如何连接Oracle的配置。现在PHP程序员雷雪松通过自己实际项目的实践,整理了一些ThinkPHP操作Oracle的常见错误。

1、ThinkPHP插入数据报错“SQLSTATE[IM001]: Driver does not support this function: driver does not support lastInsertId()”

a、在Db\Driver\Oracle.class.php文件中找到execute方法,在$this->initConnect(true); 这句前面加上 $bind = $this->bind;

public function execute($str,$fetchSql=false) {

$bind = $this->bind; //新增这句

$this->initConnect(true);

b、在Db\Driver\Oracle.class.php文件中找到foreach ($this->bind as $key => $val) { 这句前面加上 $this->bind = $this->bind ? $this->bind : $bind;

$this->bind = $this->bind ? $this->bind : $bind; //新增这句

foreach ($this->bind as $key => $val) {

c、在Db\Driver\Oracle.class.php文件中找到 $this->lastInsID = $this->_linkID->lastInsertId(); 这句修改为$this->lastInsID = $this->lastInsertId($this->table);

//修改:

//$this->lastInsID = $this->_linkID->lastInsertId();

$this->lastInsID = $this->lastInsertId($this->table);

d、在Oracle.class.php文件中新增lastInsertId方法

/**

* 取得Oracle最近插入的ID

* @access public

*/

public function lastInsertId($sequence = '') {

try {

$lastInsID = $this->_linkID->lastInsertId();

} catch(\PDOException $e) {

//对于驱动不支持PDO::lastInsertId()的情况

try {

$lastInsID = 0;

$seqPrefix = C("DB_SEQUENCE_PREFIX") ? C("DB_SEQUENCE_PREFIX") : 'seq_';

$sequence = $sequence ? $sequence : $seqPrefix.$this->table;

$q = $this->query("SELECT {$sequence}.CURRVAL as t FROM DUAL");

if($q) {

$lastInsID = $q[0]['t'];

}

} catch(\Exception $e) {

//print "Error!: " . $e->getMessage() . "";

//exit;

}

}

return $lastInsID;

}

e、ThinkPHP配置

'DB_SEQUENCE_PREFIX' => 'seq_',//序列名前缀,每个表对应的序列应为: 序列名前缀+表名

'DB_TRIGGER_PREFIX' => 'tig_',//触发器名前缀

2、Oracle创建表字段自增,使用序列(sequence)和触发器(trigger)

user为表名

----创建序列

CREATE SEQUENCE seq_user

INCREMENT BY 1

START WITH 1

nomaxvalue

nominvalue

nocache;

----创建触发器

CREATE OR REPLACE TRIGGER "tig_user"

BEFORE INSERT ON tb_user

FOR each ROW WHEN(NEW.id IS NULL)

BEGIN

SELECT seq_user.nextval INTO :NEW.id FROM dual;

END;

3、ThinkPHP如何向Oracle插入时间,Oracle插入时间必须使用to_date()函数

EXP:表达式,支持更复杂的查询情况

'update_time'=>array('exp', "to_date('".date('Y-m-d H:i:s')."', 'yyyy-MM-dd HH24:mi:ss')")

''update_time'=>array('exp', 'sysdate')

4、PHP读取Oracle的date类型数据

SELECT to_char(log.time, 'YYYY-MM-DD HH24:MI:SS') AS addtime FROM log

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值