我正在使用Codeigniter 2.0.1 和 Postgresql 8.1。我的代码使用 try-catch 块中的事务。
有时在一个简单的插入中我得到一个“致命错误”
致命错误:在第 357 行的 <...path...>/system/database/drivers/postgre/postgre_driver.php 中调用非对象的成员函数 row()
我的数据库配置是:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "***";
$db['default']['password'] = "***";
$db['default']['database'] = "***";
$db['default']['dbdriver'] = 'postgre';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
导致错误的模型代码的 lne 是“ $id = $this->db->insert_id(); ”。我这么说是因为导致错误的行在 insert_id() 方法中,并且在模型中只使用一次。下面给出了模型的代码快照。
try {
    // CODE TO FILL UP $data ARRAY
    $this->DBquery("BEGIN");
    $this->DBinsert('<TABLE NAME>', $data);
    $id = $this->db->insert_id();
    // SOME MORE CODE
}
catch(Exception $e) {
    $this->DBquery("ROLLBACK");
    //echo $e->getMessage();
    return 0;
}
$this->DBquery("COMMIT");
return $id;
$this->DBquery 和 $this->DBinsert 是我在扩展 CI_Model 类的基本模型类上创建的自定义方法。这些方法运行良好。
下面是 postgre_driver.php 中的 insert_id 方法,第 357 行是“ $row = $query->row(); ”
function insert_id()
{
    $v = $this->_version();
    $v = $v['server'];
    $table  = func_num_args() > 0 ? func_get_arg(0) : NULL;
    $column = func_num_args() > 1 ? func_get_arg(1) : NULL;
    if ($table == NULL && $v >= '8.1')
    {
        $sql='SELECT LASTVAL() as ins_id';
    }
    elseif ($table != NULL && $column != NULL && $v >= '8.0')
    {
        $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column);
        $query = $this->query($sql);
        $row = $query->row();
        $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq);
    }
    elseif ($table != NULL)
    {
        // seq_name passed in table parameter
        $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);
    }
    else
    {
        return pg_last_oid($this->result_id);
    }
    $query = $this->query($sql);
    $row = $query->row(); // LINE 357
    return $row->ins_id;
}
它更令人困惑,因为问题并不总是如此。它有时会发生,但频率足以妨碍工作。该系统被大约 8-10 个用户使用,所以我想并发应该不是问题。另外,我正在使用 pconnect 并且连接数是无限的。