【问题标题】:howto connect to as400 with PHP如何使用 PHP 连接到 as400
【发布时间】:2015-09-17 23:01:22
【问题描述】:

我正在尝试使用此代码将我的 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 - 令牌无效。令牌有效: = != >= � �= IN IS NOT LIKE BETWEEN., SQLExecDirect in F:\xampp\htdocs\php-as400\php- 中的 SQL 状态 37000 as400.php 在第 25 行 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),但我不知道如何解决。

【问题讨论】:

    标签: php odbc ibm-midrange


    【解决方案1】:

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

    【讨论】:

    • 列名是 T§DTDO,字符 § 是所谓的 Section Sign (en.wikipedia.org/wiki/Section_sign)
    • 如果部分符号确实是列名的一部分,我会犹豫的原因是 DB2 的绿屏界面不喜欢它。创建表示例(T§DTDO char (10));失败,在部分标志处出现“不期望令牌”。但是,我可以这样做:create table example ("T§DTDO" char (10));这工作插入示例(“T§DTDO”)值('line 1');从示例中选择 * 也是如此;所以我建议你尝试在列名周围加双引号,看看是否有效。
    【解决方案2】:

    用引号试试:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        相关资源
        最近更新 更多