我目前在设置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; }
我知道了。
在64位版本中,当返回字段之一为NULL时,odbc崩溃。因此,解决方法是在检索查询时替换所有空字段。
例如:
从database.table中选择ifnull(tluser,’‘)作为USER