我正试图使用以下代码将我的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][Programa di controllo odbc di System i Access][DB2 per i5/OS]SQL0104-令牌�无效。令牌有效:<>=<><=<!>!=>�<�> �=IN不像BETWEEN。,第25行F:\examplep\htdocs\php-as400\php-as400.php中SQLExecDirect中的SQL状态37000SQL 错误
从SELECT语句中删除WHERE T§DTDO = 20120319
,我让它运行并列出我想要的元素并发出警告。
Fatal error: Maximum execution time of 30 seconds exceeded in F:xampphtdocsphp-as400php-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管理员创建一个包含没有特殊字符的列名的视图。
尝试使用引号:
$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 WHERE T@DTDO=20120319"