我已经通过PHP从本地Windows PC成功连接到远程IBM i DB2数据库(AS400)。我正在将IBM Data Server Client与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
答案 0 :(得分:1)
我在与IBM开启PMR之后终于解决了这个问题。我所要做的就是应用最新的DB2 Connect个人版修订包。
DB2 Connect的建议修订包:
http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg21321001
基本上我的DB2 Connect版本是在2013年之前发布的。在2013年,IBM通过添加i5_naming
选项添加了两层支持。所以我的DB2 Connect设置实际上忽略了我传递的选项。这就解释了为什么其他选项仍然存在。在数据库方面,因为它没有收到i5_naming
的值 - 它仍然是默认值。