Php 使用PDO的DB2连接在插入或删除时抛出一般错误-7008

Php 使用PDO的DB2连接在插入或删除时抛出一般错误-7008,php,pdo,odbc,ibm-midrange,db2-400,Php,Pdo,Odbc,Ibm Midrange,Db2 400,我们正在开发一个PHP应用程序,它连接到PostgreSQL服务器和DB2服务器。虽然到PGSQL的PDO连接工作正常,但到DB2的连接只能从表中获取数据;尝试插入或删除会导致以下错误: SQLSTATE[HY000]: General error: -7008 (SQLExecute[4294960288] at /build/php7.0-ltLrbJ/php7.0-7.0.33/ext/pdo_odbc/odbc_stmt.c:260) 这个错误在我们的开发和生产环境中都会发生。两台服务

我们正在开发一个PHP应用程序,它连接到PostgreSQL服务器和DB2服务器。虽然到PGSQL的PDO连接工作正常,但到DB2的连接只能从表中获取数据;尝试插入或删除会导致以下错误:

SQLSTATE[HY000]: General error: -7008 (SQLExecute[4294960288] at /build/php7.0-ltLrbJ/php7.0-7.0.33/ext/pdo_odbc/odbc_stmt.c:260)
这个错误在我们的开发和生产环境中都会发生。两台服务器都是Ubuntu(版本不同,但相差不大);我正在使用PDO的ODBC驱动程序

我们尝试连接到其他IBMi服务器,并使用不同的用户,但仍然出现完全相同的问题。可以选择,但不能插入。用谷歌搜索错误代码并不会产生任何有用的结果,正如您看到的错误消息本身一样,这是毫无帮助的。SQLExecute中的代码不会出现在任何地方,甚至不会出现一个结果(有一个来自IBM页面的结果,但它实际上是一个不同的错误代码)

代码非常简单,但可能存在一些明显的错误

测试脚本:

include(“DB2.php”);
$oDAO=新DAO();
$res=$oDAO->ejecta(“插入到.VALUES(1,0,1)”中);
道:

类DAO{
var$link;
公共函数构造(){
//建筑功能,康涅狄格州
$this->link=new-PDO(“odbc:DRIVER={ibmi-Access-odbc-DRIVER};SYSTEM=;PROTOCOL=TCPIP”,
'', '');
$this->link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$this->link->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
}
私有函数begin(){$this->link->beginTransaction();}
私有函数rollback(){$this->link->rollback();}
私有函数commit(){$this->link->commit();}
公共函数ejecta($query){
试一试{
$this->begin();
$oResult=$this->link->query($query);
如果($oResult){
$bResult=true;
$this->commit();
}否则{
$bResult=假;
$this->rollback();
}
}
捕获(例外$e){
echo$e->getMessage();
$bResult=假;
$this->rollback();
}
返回$bResult;
}
}

坦率地说,我们别无选择,我已经为此浪费了两个星期。我们只需要插入和删除记录。因此,欢迎提供任何帮助。

您描述的症状与尝试在承诺控制下修改数据库一致,但未启用日志记录

有三种常见的处理方法:

  • 打开日记功能。这是非常极端的,因为管理数据库的人必须这样做,如果他们关闭了日志记录,很可能他们不知道如何处理日志,或者不想这样做。但这是在DB2fori上实现完全承诺控制的唯一实用方法

  • 连接自动提交打开。这将向使用此连接执行的任何数据库修改SQL语句添加隐式提交。以我的经验,这是处理这种情况最常见、最方便的方法

  • 将带有NC的
    添加到每个相关SQL语句中。原则上,这使您可以逐个语句地控制是否暂停承诺控制。实际上,如果您首先考虑这样做,可能没有启用日志记录,因此您必须在每个数据库修改SQL语句上都这样做。这就是为什么大多数人倾向于选择2


  • 您是否已经验证了特定的userid可以插入/更新到表中(即具有正确的权限)?请编辑您的问题,说明IBM驱动程序、pdo_IBM和php本身的确切版本(请说明所有三个版本)。您还可以跟踪(CLI跟踪)以查看封面下发生了什么,文档显示了如何使用ibm驱动程序执行此操作。是的,正如我所说,我们尝试了不同的用户,甚至不同的文件。我们甚至使用QSECOFR登录,仍然是相同的错误。而且在不同版本的不同系统上。我将更新原始问题,但我不知道如何进行CLI跟踪,因此可能需要一些时间。听起来该表可能没有日志记录。这是答案。非常感谢你的回答。方法2和3解决了这个问题。我们公司是由IBM开发的几位“老学究”组成的;他们开始在36号系统上编程。因此,他们没有太多的知识更新,但他们管理着数据库,这意味着他们甚至可能不知道什么是期刊。但我想这对我们所有人来说都是一个学习的好时机。所以我再次感谢你。说清楚,如果你使用选项2,你不需要做3。反之亦然。每个选项都应该单独工作。如果2本身无法工作,则可能是带有ODBC驱动程序的PHP接口不太正确(未成功激活自动提交模式)。如果3本身不能工作,我会非常惊讶,因为这只是直接传递到服务器的SQL。如果您想进一步了解它,SQL语句中该部分的技术术语是“隔离子句”。