Я успешно подключился к удаленной базе данных IBM i DB2 (AS400) с локального ПК с Windows через PHP. Я использую клиент IBM Data Server в сочетании с db2_*
функции в PHP. У меня проблема в том, что, несмотря на то, что мой список библиотек настроен правильно, он не используется для неквалифицированных имен таблиц. Вместо этого он использует текущее имя пользователя в качестве библиотеки. Однако, когда я определяю имена таблиц, все работает как шарм.
Я подтвердил, что мой список библиотек действительно меняется, когда я создаю соединение, выполняя запросы 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 />";
}
Кто-нибудь когда-нибудь сталкивался с этим при включении i5_naming при подключении к удаленному серверу DB2? Я не совсем уверен, почему он не будет использовать мой список библиотек, поскольку в руководстве по PHP говорится, что «неквалифицированные файлы разрешаются с использованием списка библиотек для работы». когда включено. http://php.net/manual/en/function.db2-connect.php
Я наконец решил это после открытия PMR с IBM. Все, что мне нужно было сделать, это применить последний пакет Fix Pack для DB2 Connect Personal Edition.
Предлагаемые пакеты исправлений для 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
— это осталось по умолчанию.
Других решений пока нет …