我已经通过PHP成功地连接到本地Windows PC的远程IBM I DB2数据库(AS400)。我正在将IBM数据服务器客户端与PHP中的db2_*
函数结合使用。我遇到的问题是,尽管我的库列表被正确设置了,但它并未用于无限制的表名称。相反,它将当前用户名用作库。但是,当我符合桌子名称时,一切都像魅力一样起作用。
我已经确认,当我通过查询QSYS2.LIBRARY_LIST_INFO
创建连接时,我的库列表实际上正在发生变化。
$database = '<database name>';
$user = '<user name>';
$password = '<password';
$port = <port>;
$options['i5_naming'] = DB2_I5_NAMING_ON;
$options['autocommit'] = DB2_AUTOCOMMIT_OFF;
$options['i5_libl'] = 'MYLIB YOURLIB ANYLIB';
$conn = db2_connect($database, $user, $password, $options);
if ($conn) {
echo "Connection succeeded."; //It succeeds
}
else {
echo db2_conn_error()." | ".db2_conn_errormsg()."<br />";
echo "Connection failed.";
}
$sql = "SELECT * FROM QSYS2.LIBRARY_LIST_INFO";
//Works and proves my library list reflects
//what I passed in when creating the connection.
//$sql = "SELECT * FROM LIBRARY_LIST_INFO";
//Generates: "42S02 : [IBM][CLI Driver][AS] SQL0204N "<user name>.LIBRARY_LIST_INFO" is an undefined name. SQLSTATE=42704 SQLCODE=-204"
//where <user name> is the username used to connect to the DB.
//It should be using the library list specified when creating the connection though.
//This holds true for any table from any library including those specified
//when creating the connection (which includes QSYS2).
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);
if($result){
while($row = db2_fetch_assoc($stmt)){
echo "<pre>";
var_dump($row); //In addition to entries for QSYS, QSYS2, QUSRSYS and QHLPSYS I get entries for MYLIB, YOURLIB and ANYLIB.
echo "</pre>";
}
}else{
echo "failed<br />";
echo db2_stmt_error()." : ".db2_stmt_errormsg()."<br />";
}
在连接到远程DB2服务器时启用i5_naming时,是否有人遇到过?我不确定为什么它不会使用我的库列表,因为PHP手册状态"使用该作业的库列表解决了不合格的文件"。启用时。http://php.net/manual/en/function.db2-connect.php
我在用IBM打开PMR后终于解决了此问题。我要做的就是为DB2 Connect个人版应用最新的修复包。
建议用于DB2连接的修复包:
http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg21321001
基本上我已经发布的DB2 Connect版本是在2013年之前发布的。2013年IBM通过添加i5_naming
选项添加了两个层支持。因此,我的DB2连接设置有效地忽略了我通过的选项。因此,这解释了为什么其他选项仍然通过。在数据库侧,由于它没有收到i5_naming
的值 - 它保留为默认值。