odbc_prepare 给出致命错误:允许的内存大小已耗尽

2023-11-29

我有一个 Debian 服务器(64 位),我想通过 PHP 将其连接到 AS400 的数据库。我已经安装了 IBM i Access for Linux 和 unixodbc。我已经遵循了这个教程:https://www.albertopicado.es/conexion-odbc-con-base-de-datos-db2-en-un-servidor-ibm-iseries/虽然是西班牙语,但你可以看到我遵循的过程。 问题是我可以建立一个简单的连接,例如:

$server= 'DRIVER={DRIVER_NAME};DATABASE=DATABASENAME;SYSTEM=IP;HOSTNAME=IP;PORT=NUMBER_OF_THE_PORT;PROTOCOL=TCPIP;';
$as400= odbc_connect($server, "username", "password");
$as400 ? echo "ok" : echo "ko";

这返回“ok”,所以我知道连接已经建立。然后我制作一个简单的 odbc_prepare,如下所示:

$query="SELECT * FROM DATABASE.TABLE WHERE ID=1;
$result=odbc_prepare($as400,$query);

这会引发致命错误:允许的内存大小 1048576000 字节已耗尽(尝试分配 140707423584261 字节)。

我已将 php.ini 文件上的 memory_limit 值增加到 1000M,但它仍然抛出相同的错误。我一直在网上冲浪,发现有人在使用 64 位版本时遇到问题,如下帖子所示:Linux odbc 致命错误:允许的内存大小但我正在执行的查询没有任何空值。

Info

odbcinst -j 命令:

DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

odbcinst.ini:

[iSeries Access ODBC Driver]
Description=iSeries Access for Linux ODBC Driver
Driver=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
NOTE1=If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2=the following Driver64/Setup64 keywords will provide that support.
Driver64=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup64=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading=2
DontDLClose=1
UsageCount=2

[iSeries Access ODBC Driver 64-bit]
Description=iSeries Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iSeriesAccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iSeriesAccess/lib64/libcwbodbcs.so
Threading=2
DontDLClose=1
UsageCount=1

odbc.ini 为空。

EDIT

看到 iSeriesAccess Driver x64 可能有一些错误,我最终将其卸载。然后我安装了 iSeriesAccess 驱动程序 x32。在安装新驱动程序之前,我制作了 Debian 多架构并下载了 ia32-libs(因为 iSeriesAccess 驱动程序 x32 缺少一些软件包)。

使用新驱动程序时,我收到另一个错误:
警告:odbc_connect():SQL 错误:[unixODBC][驱动程序管理器]无法打开 lib '/opt/ibm/iSeriesAccess/lib/libcwbodbc.so':未找到文件,SQLConnect 中的 SQL 状态 01000。

我已经仔细检查了 lib 'libcwbodbc.so' 是否存在。我还针对该库运行命令 ldd 以查看是否缺少某些内容:

linux-gate.so.1 (0xf7763000)
libcwbcore.so => /opt/ibm/iSeriesAccess/lib/libcwbcore.so (0xf7557000)
libodbcinst.so.1 => /usr/lib/i386-linux-gnu/libodbcinst.so.1 (0xf7544000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xf753e000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xf7522000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf7430000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xf73ea000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf73cd000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xf721f000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xf7216000)
libltdl.so.7 => /usr/lib/i386-linux-gnu/libltdl.so.7 (0xf720a000)
/lib/ld-linux.so.2 (0xf7766000)

正如您所看到的,没有丢失库。我缺少什么?

SOLUTION

最后,我安装了 32 位版本的 Debian。在我看来,问题在于 64 位版本的 IBM I Access 驱动程序。我只是按照新安装的相同步骤操作,它就像一个魅力。希望它对其他人有帮助。


这是 #21286589 的副本。只因为你没有NULL值并不意味着您在使用不匹配的 ABI 时不会遇到问题。

这里的问题是旧驱动程序仅设置 64 位指示器值的 32 位,而 PHP 读取整个 64 位。这里 PHP 看到的值是 140707423584261,即0x7FF900000005以十六进制表示。可以看到最后4个字节是0x00000005是5,应该是实际返回数据的长度。其余部分都是垃圾,因为驱动程序没有更改这些字节。

正如我在回答中提到的Linux odbc 致命错误:允许的内存大小,您将需要从 IBM i Access Client Solutions Linux Application Package 获取新的 ODBC 驱动程序。该驱动程序遵循 unixODBC 自 2.2.14 以来使用的完整 64 位 ABI。新的驱动程序包还包含 Debian .deb 包,因此几乎不再需要您引用的博客中的所有步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

odbc_prepare 给出致命错误:允许的内存大小已耗尽 的相关文章

随机推荐

  • MPAndroidChart - 如何最好地将 X 轴值设置为字符串/日期?

    我对此有点迷失MPAndroid图表库 我开始了初学者的例子here 它建议使用 getValueX 和 getValueY 方法创建一个对象数组 列表 然后将其添加为条目 如下所示 List
  • 如何编写“sed”脚本,用另一个文件的内容替换两个标记之间的文本

    我正在尝试写一个sed用另一个文件的内容替换两个标记之间的文本的脚本 假设我有以下带有标记的文件 and index html p Old content p 我想用该文件的内容替换随附的文本 snippet html p New cont
  • 理解@interface声明中“(Private)”的这种用法

    我见过一些这样写的代码 interface AViewController Private 我想知道是否是这样 Private 提交到 App Store 时意味着什么 一般而言 这意味着什么 这是一个名为 私人 的类别 看看类别和扩展Ob
  • TimeSlider 插件和传单 - 标记未按顺序出现

    更新了一个JSFIDDLE 链接 我正在使用 LeafletJS 构建带有时间轴滑块的网络地图 我正在使用LeafletSlider插件显示一组基于名为的 GEOJSON 属性的标记DATE START 这是我的数据对象的示例 var ca
  • PDF 发送意图上的 Android SecurityException

    我在执行期间遇到以下异常ACTION SEND数据类型的意图application pdf java lang SecurityException Permission Denial starting Intent act android
  • ios - 在 WkWebView 中禁用 Youtube 自动播放

    我在用着WKWebView打开pages in Youtube 问题是 打开后他们开始播放视频并进入全屏 这是不想要的行为 视频未嵌入 它是带有描述 评论等的整个页面 有办法阻止他们玩吗 有用 请阅读评论 import UIKit impo
  • 您是否必须在 Redis 脚本中提前声明您的密钥?

    我的计划是将一些现有的 Redis 键存储在哈希中 稍后从 Redis Lua 脚本中获取并执行操作 我读到 最佳实践是在调用时提供脚本中使用的所有键EVAL 我的问题是 运行运行时没有提供任何密钥的脚本是否安全EVAL 但对从以下位置获取
  • `DS.attr()` 中的嵌套对象不受 `DS.rollbackAttributes()` 影响

    我有一个模型User如下 import DS from ember data const attr Model DS export default Model extend name attr string properties attr
  • templateUrl 更改时 AngularJS Modal 不显示

    到目前为止 我所拥有的是 Angular UI 示例 控制器 var ModalDemoCtrl function scope modal scope open function var modalInstance modal open t
  • 从托管代码中挂钩 LoadLibrary 调用

    我们希望挂钩对 LoadLibrary 的调用 以便下载未找到的程序集 我们有一个 ResolveAssembly 处理程序来处理托管程序集 但我们还需要处理非托管程序集 我们尝试通过 Microsoft Windows 的编程应用程序 中
  • 动态改变JTree中特定节点的图标

    我已经看过很多在树实例化期间更改节点图标的示例 但我想要一种稍后动态更改单个节点图标的方法 因此 在我的主代码中 我将自定义渲染器添加到我的树中 Icon I want to set nodes to later ImageIcon che
  • 在 Groovy 中执行 Unix cat 命令?

    Hallo 我想从 Groovy 程序执行类似 cat path to file1 path to file2 gt path to file3 的内容 我尝试了 cat path to file1 path to file2 gt pat
  • Android - 访问在线数据库SQlite

    我需要从 Android 应用程序打开 读取项目并将其插入到在线 SQLite 数据库中 我知道网址 用户名和密码 在 JavaSE 中我会执行以下操作 Class forName com mysql jdbc Driver Connect
  • 再次使用java进行字符串比较

    新手问题 但我有这个代码 import java util import java io public class Welcome1 main method begins execution of Java application publ
  • pthread - 暂停/取消暂停所有线程

    我正在尝试在我的应用程序中编写暂停 取消暂停所有线程 该线程由 SIGUSR1 暂停 和 SIGUSR2 取消暂停 激活 我想用pthread cond wait 在所有线程中 当收到信号时 使用pthread cond broadcast
  • 如何使用android创建dll

    我是 Android 应用程序开发新手 我想开发一个dll使用安卓 是否可以开发并集成到android应用程序 请告诉我解决方案 如果可以的话请将解决方案一一告诉我 至于我 我曾经为自己写过一篇关于 NDK 的笔记 这里是 Required
  • MySQL 中加密数据的搜索过滤器

    查询说明 假设我有一个数据库表 它以加密形式存储所有用户的数据 我有一个功能 管理员可以搜索用户数据 现在的问题是 管理员将在文本框中输入普通文本 我必须根据管理员的输入过滤用户列表 在每次文本更改时 因此 与此同时 我拥有大量加密形式的数
  • 如何让tableFooterView始终位于UITableView的底部

    我有一个UITableView具有可变数量的部分 每个部分都有不同数量的单元格 并且每个部分都有页眉和页脚 我的UITableView还有一个tableFooterView我想始终将其保留在屏幕底部 除非表格太大而无法在屏幕上显示 然后ta
  • iphone 粘性菜单 jquery onscroll ios 9

    在更新到之前 这段代码在我的 iPhone 上运行良好iOS 9 0 1 13A404 但现在相同的代码似乎只有在手指松开后才能工作 或者在 jQuery 之后onscroll结束 当我快速滑动以使页面滚动时 document on scr
  • odbc_prepare 给出致命错误:允许的内存大小已耗尽

    我有一个 Debian 服务器 64 位 我想通过 PHP 将其连接到 AS400 的数据库 我已经安装了 IBM i Access for Linux 和 unixodbc 我已经遵循了这个教程 https www albertopica