我正在尝试使用PHP的 ODBC驱动程序从Ubuntu服务器连接到客户端的IBM AS / 400 DB2数据库。我也安装了 unixODBC 。我的 odbcinst.ini 如下所示:
[IBM DB2 ODBC DRIVER]
Description = ODBC 5.1 Driver for Database
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
FileUsage = 1
我的 odbc.ini 看起来像这样:
[IBM DB2 ODBC DRIVER]
Driver = IBM DB2 ODBC DRIVER
Description = ODBC 5.1 Driver DSN
现在,我的连接代码是:
$server = '12.345.678.90' //IP
$port = '446' //PORT
$username = 'my_username';
$password = 'my_password';
$connect = odbc_connect("DRIVER = {IBM DB2 ODBC DRIVER};System=$server:$port;Uid=$username;Pwd=$password;", $username, $password);
if(!$connect)
echo 'Cannot Connect!';
else
echo 'Connected!';
我得到的错误是:
Warning: odbc_connect(): SQL Error: [unixODBC][MySQL][ODBC 5.1 Driver]Access denied for user 'my_username'@'localhost' (using password: YES), SQL state S1000 in SQLConnect
我也试过使用PDO ODBC Driver。这是我得到的错误:
$connect = new PDO("odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=$server;PORT=$port;Uid=$username;Pwd=$password");
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] SQLDriverConnect: 1045 [unixODBC][MySQL][ODBC 5.1 Driver]Access denied for user 'my_username'@'localhost' (using password: YES)' in /var/www/test_file.php Stack trace: #0 /var/www/test_file.php: PDO->__construct('odbc:DRIVER={IB...') #1 {main} thrown in /var/www/test_file.php
我在这里做错了吗?我是否需要使用其他驱动程序,因为用户名和密码是正确的,我看到客户端使用我拥有的用户名和密码登录数据库。我认为用户名和密码错误,因为它显示拒绝用户访问。似乎并非如此。可能还有别的东西是错的。
感谢您的帮助。我希望我能很清楚地解决这个问题。谢谢!
答案 0 :(得分:5)
你的odbcinst.ini文件说使用MySQL ODBC驱动程序:
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
但您需要使用 iSeries Access ODBC 驱动程序。您收到Access Denied for User
消息的原因是因为您尝试使用IBM i的凭据连接到MySQL数据库。
以下是有关如何在Ubuntu上连接到DB2 for i(在IBM i上)的分步说明:
从IBM下载免费iSeriesAccess-6.1.0-1.2.i386.rpm
文件(您必须创建一个免费帐户才能获得它 - 我确信有一个比6.1.0-1.2更新的版本)
将RPM文件转换为Ubuntu理解的内容:sudo alien iSeriesAccess-6.1.0-1.2.i386.rpm
安装生成的.deb:sudo dpkg -i iseriesaccess_6.1.0-2.2_i386.deb
将已安装的iSeries库复制到Ubuntu所期望的位置:sudo cp /opt/ibm/iSeriesAccess/lib/* /usr/lib
编辑 /etc/odbc.ini 文件以包含:
[primary]
Description = primary
Driver = iSeries Access ODBC Driver
System = IP_ADDRESS
UserID = USERNAME
Password = PASSWORD
Naming = 1
DefaultLibraries = QGPL
Database = XXXXXXXXXX
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0
编辑 /etc/odbcinst.ini 文件以包含:
[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /usr/lib/libcwbodbc.so
Setup = /usr/lib/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 = /usr/lib/lib64/libcwbodbc.so
Setup64 = /usr/lib/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1
UsageCount = 1
然后创建与PDO的连接:
$pdo = new PDO("odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=$server;PROTOCOL=TCPIP", $username, $password);
答案 1 :(得分:4)
我最近必须在Ubuntu盒子上使用ODBC / PHP进行IBM / DB2访问。 你可以适应大多数其他发行版: 以下是我的工作方式:
[1]根据您所需的DB2版本和体系结构
,下载以下内容之一iSeriesAccess-5.4.0-1.6.i386.rpm
iSeriesAccess-5.4.0-1.6.ppc.rpm
iSeriesAccess-5.4.0-1.6.ppc64.rpm
iSeriesAccess-5.4.0-1.6.x86_64.rpm
iSeriesAccess-6.1.0-1.0.i386.rpm
iSeriesAccess-6.1.0-1.0.ppc.rpm
iSeriesAccess-6.1.0-1.0.ppc64.rpm
iSeriesAccess-6.1.0-1.0.x86_64.rpm
您可以从IBM网站或此处获取此信息:
http://www.mmnt.net/db/0/0/public.dhe.ibm.com/as400
然后使用以下内容安装IBM as400客户端访问:
sudo apt-get install alien libmotif3
cd /path/to/iSeriesAccess-6.1.0-1.0.i386.rpm
sudo alien -dckv iSeriesAccess-6.1.0-1.0.i386.rpm
sudo dpkg -i iseriesaccess_6.1.0-1.0_i386.deb
[2]安装Java(如果需要)
sudo apt-get install sun-java6-jre
[3]安装UNIXODBC
sudo apt-get install unixodbc-bin
[4]安装PHP ODBC
sudo apt-get install php5-odbc
[5] Ldconfig
使用以下行创建文件/etc/ld.so.conf.d/iSeriesAccess.conf
:
/opt/ibm/iSeriesAccess/lib/
然后运行以下命令:
sudo ldconfig
[6]注册驱动程序
sudo odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration
[7]用一些PHP代码测试它
<?php
$user = 'SomeUser';
$pass = 'SomePass';
$Conn = odbc_connect("DRIVER={iSeries Access ODBC Driver};DATABASE=DBNAME;SYSTEM=127.0.0.1;HOSTNAME=127.0.0.1;PORT=446;PROTOCOL=TCPIP", $user, $pass);
if($Conn === false){
die('failed to connect');
}
$sql = "select * from database.table fetch first 10 rows only";
$result=odbc_exec($Conn,$sql);
echo '<pre>';
while(odbc_fetch_array(($result)){
print_r($result);
}
}