как подключиться к as400 с PHP - PullRequest
3 голосов
/ 20 марта 2012

Я пытаюсь соединить мой 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] [Программа управления ODBC для System i Access] [DB2 для i5 / OS] SQL0104 - токен недопустим. Токен действителен: <> = <> <=! <!>! => = < > = IN НЕ похож на. Состояние SQL 37000 в SQLExecDirect в F: \ xampp \ htdocs \ php-as400 \ php- 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),, но я не знаю, как ее решить.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Я никогда раньше не видел символа, используемого в имени столбца. Это может быть проблема преобразования кодовой страницы. Попросите администратора IBM i проверить имя столбца; на самом деле это может быть T @ DTDO, T # DTDO или T $ DTDO - то, что вы действительно можете набрать. В противном случае попробуйте заключить имя столбца в двойные кавычки: ... где "T§DTDO" = 20120319 ... Если это не сработает, попросите администратора DB2 создать представление с именами столбцов, которые не содержат специальных символов в их.

1 голос
/ 17 сентября 2015

Символы § и £ являются «итальянским эквивалентом» @ и #.

В итальянском CCSID (например, 280) вы увидите (и будете использовать) поля V5TDOC0L следующим образом: T§TDOC, T§NDOC.В другом CCSID (например, 37) вы увидите T @ TDOC и T @ NDOC (для одного и того же файла!).

Я не знаю, какой ccsid будет использовать задание, обслуживающее страницу PHP.Это может зависеть от системного значения по умолчанию.

Попробуйте использовать «SELECT * FROM LIBRARY.V5TDOC0L WHERE T @ DTDO = 20120319»

1 голос
/ 23 марта 2012

Попробуйте с кавычками:

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