Я пытаюсь подключить свой 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 НЕ НРАВИТСЯ МЕЖДУ., Состояние 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 ), но я не знаю, как его решить.
Я никогда не видел символа §, используемого в имени столбца раньше. Это может быть проблемой преобразования кодовой страницы. Попросите администратора 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 ГДЕ T @ DTDO = 20120319»