一尘不染

Linux odbc致命错误:允许的内存大小

linux

我目前在设置AS400(iseries V6R1)和Debian之间的odbc链接时遇到一些问题,我使用iseriesAccess7.1
odbc驱动程序64位,unixODBC2.3.1和php5.4以及unixODBC支持。

我的链接似乎很好,因为我可以使用isql命令(它是unixODBC的一部分)连接到我的数据库,并执行一些SQL查询,但是使用php脚本无法读取数据库中的记录。当我尝试在Intranet上启动一个小脚本时,出现以下错误:

致命错误:在第122行的/home/www/imypdo/imypdo.php中,耗尽了134217728字节的允许的内存大小(试图分配493921239296字节)

超过450 Gb!在/ var / log / messages和/ etc / httpd / logs / error_log中没有任何内容

一个简单的sql查询(select中只有1行)将返回一些奇怪的字符(请参见下文),并且一旦我选择了1或2行,就会发生内存大小错误。

[0] =>数组([ADHMAR] => AAAAAAA a @YÿŒ4-X0!ÿŒ4làÿŒ4làÿŒ4!)

我几乎可以肯定这是一个与64位驱动程序相关的问题,因为我已经有另一个Debian与该iseries关联,但是与32位驱动程序相关联,并且可以完美运行。奇怪的是,isql命令正在运行,而日志文件中什么也没有。

如果确实是64位驱动程序问题,我如何向IBM证明呢?

任何帮助将不胜感激

谢谢

---------------------------要连接的类-------------------- --------

private $_bdd = "DSN=db2;",
        $_user = "USERNAME",
        $_pwd = "Password";

private $_con,
        $_isConnected;


public function open_connection(){
    $this->_con = odbc_connect ($this->_bdd, $this->_user, $this->_pwd ) or die("Error Connection") ;
    $this->_isConnected = true;
}

public function close_connection(){
     odbc_close($this->_con);
     $this->_isConnected = false;
}

public function execute($sql){

    if(!($this->_isConnected))
        $this->open_connection();

    #execute sql
    $res = odbc_exec($this->_con, $sql);

    return $res;
}

public function fetchRow($res){

    $row = odbc_fetch_array($res);
    return $row;
}

}

---------------------------------查询脚本--------------- ---------------

public function getPhoneLogsByDate($startDate, $endDate) {

    $startDate  = date('Ymd', strtotime($startDate));
    $endDate    = date('Ymd', strtotime($endDate));

    $rr = new As400_Model_as400query();

    $rr->open_connection();

    $sql = "select trim(tluser) as USER, trim(tlacct) as CLIENT, trim(concat(concat(concat(concat(concat(concat(substr(trim(tldate),1,4),'-'),substr(trim(tldate),5,2)),'-'),substr(trim(tldate),7,2)),' '), concat(concat(concat(concat(substr( substr(trim(tltime+1000000),2,6),1,2),':'),substr(substr(trim(tltime+1000000),2,6),3,2)),':'), substr(substr(trim(tltime+1000000),2,6),5,2)))) as DATETIME 
            ,trim(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(trreas,'|'),trsr01),'|'),trsr02),'|'),trsr03),'|'),trsr04),'|'),trsr05)) as REASONS
            ,trim(concat(concat(concat(tnnot1,tnnot2),tnnot3),tnnot4)) as NOTES

            from cabledta.tlogmstr left join cabledta.tlogreas on trnum#=tlnum#  left join cabledta.tlognote on tnnum#=tlnum#
            where tldate>='".$startDate."' and tldate <='".$endDate."'";



    $res = $rr->execute($sql);

    $response = array();


    while ($row = $rr->fetchRow($res)){

        $response[] = array(

                                'userName'      => $row['USER'],
                                'clientNumber'  => $row['CLIENT'],
                                'logDateTime'   => $row['DATETIME'],
                                'logReasons'    => $row['REASONS'],
                                'logNotes'      => utf8_encode($row['NOTES'])

                            );

    }
    $rr->close_connection();

return $response;
}

阅读 263

收藏
2020-06-03

共1个答案

一尘不染

我知道了。

在64位版本中,当返回字段之一为NULL时,odbc崩溃。因此,解决方法是在检索查询时替换所有空字段。

例如:

从database.table中选择ifnull(tluser,’‘)作为USER

2020-06-03