如何使用PHP连接到as400

时间:2012-03-20 16:33:16

标签: php odbc ibm-midrange

我正在尝试使用此代码将我的AS400与V5R3连接到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] [Programma di controllo ODBC di System i Access] [DB2 per i5 / OS] SQL0104 - 令牌 无效。令牌有效:&lt; &GT; =&lt;&gt; &lt; =!&lt; !&GT; !=&gt; = &lt; &GT; = IN不等于。在第25行的F:\ xampp \ htdocs \ php-as400 \ php-as400.php中的SQLExecDirect中的SQL状态37000 SQL中的错误

从语句中删除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),但我不知道如何解决它。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

尝试使用引号:

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

答案 2 :(得分:1)

字符§和£是@和#的“意大利语等价物”。

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

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

尝试使用“SELECT * FROM LIBRARY.V5TDOC0L WHERE T @ DTDO = 20120319”