HOWTO连接到AS400与PHP

问题描述:

我想我的AS400与V5R3使用PHP验证码连接:HOWTO连接到AS400与PHP

<?php 
$server="Driver={Client Access ODBC Driver (32-bit)};System=xxx.xxx.xxx.xxx; 
Uid=user;Pwd=password;"; #the name of the iSeries 
$user="user"; #a valid username that will connect to the DB 
$pass="password"; #a password for the username 

$conn=odbc_connect($server,$user,$pass); #you may have to remove quotes 

#Check Connection 
if ($conn == false) { 
echo "Not able to connect to database...<br>"; 
} 

#Query the Database into a result set - 
$result=odbc_exec($conn,"SELECT * FROM LIBRARY.V5TDOC0L WHERE T§DTDO = 20120319"); 

if (!$result) 
    {exit("Error in SQL");} 
echo "<table><tr>"; 
echo "<th>T§NDOC</th>"; 
echo "<th>T§DTDO</th></tr>"; 
while (odbc_fetch_row($result)) 
    { 
    $ndoc=odbc_result($result,2); 
    $dtdo=odbc_result($result,3); 
    echo "<tr><td>$ndoc</td>"; 
    echo "<td>$dtdo</td></tr>"; 
    } 
echo "</table>"; 

#close the connection 
odbc_close($conn); 
?> 

我得到这个错误:

警告:odbc_exec()[function.odbc- exec]:SQL错误:[IBM] [程序控制ODBC ODBC i系统i访问] [DB2 i5/OS] SQL0104 - 令牌 无效。代币有效期:<> = <> < =! SQL错误SQL

SQL错误SQL语句错误SQL错误SQL错误代码错误SQL错误代码错误SQL错误代码错误代码错误代码错误代码错误代码错误代码

从语句中删除SELECT WHERE T§DTDO = 20120319,我让它运行并列出我想要的元素并给出警告。

Fatal error: Maximum execution time of 30 seconds exceeded in F:\xampp\htdocs\php-as400\php-as400.php on line 30 
T§NDOC T§DTDO 
C008931 19941102 
P005027 19950214 
P005031 19950320 
P005055 19950612 
P005062 19950904 
P005065 19950920 
P005082 19951218 
P005157 19970102 
P005186 19970428 
P005187 19970429 
P005190 19970520 
I009353 19970721 
P005257 19980217 

第30行是:

while (odbc_fetch_row($result)) 

我相信问题是字符§因为我发现在寻找互联网(https://bugs.php.net/bug.php?id=47133),但我不知道如何解决它。

我从来没有见过以前用在列名中的字符。这可能是代码页转换问题。请求IBM i管理员验证列名称;它可能确实是T @ DTDO,T#DTDO或T $ DTDO - 你可以实际输入的东西。如果没有,请尝试用双引号括住列名:...其中“T§DTDO”= 20120319 ...如果这不起作用,请让DB2管理员创建一个视图,其列名中没有特殊字符他们。

+0

列名是T§DTDO和字符§就是所谓的科注册(http://en.wikipedia.org/wiki/Section_sign) – stblack 2012-03-21 08:10:02

+0

如果节符号实际上是列名的一部分,那么我将winder的原因是DB2的绿屏界面不喜欢它。创建表格示例(T§DTDOchar(10));在部分标志处出现'未预期的令牌'失败。但是,我可以这样做:创建表格示例(“T§DTDO”char(10));这工作插入到示例(“T§DTDO”)值('行1');这个select * from example;所以我建议你尝试围绕列名的双引号,看看是否有效。 – 2012-03-21 17:19:18

尝试用引号:

$result=odbc_exec($conn,'SELECT * FROM LIBRARY.V5TDOC0L WHERE "T§DTDO" = 20120319'); 

性格§和£是 “意大利对等” 的@和#。

在意大利语CCSID(例如280)中,您将以这种方式看到(并使用)V5TDOC0L的字段:T§TDOC,T§NDOC。 在其他CCSID(例如37)中,您将看到T @ TDOC和T @ NDOC(对于同一文件!)。

我不知道哪个ccsid将使用PHP页面的作业。它可能取决于系统默认值。

与尝试 “SELECT * FROM LIBRARY.V5TDOC0L其中T @ DTDO = 20120319”