2012-03-20 5 views
3

Je suis en train de connecter mon AS400 avec V5R3 avec PHP en utilisant ce code:howto se connecter à AS400 avec 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); 
?> 

Je suis cette erreur:

Attention: odbc_exec() [function.odbc- exec]: Erreur SQL: [IBM] [Programme de contrôle ODBC de System i Access] [DB2 par i5/OS] SQL0104 - Token non valide. Jeton valide: <> = <> < =! <!>! => = < > = IN N'EST PAS COMME ENTRE., L'état SQL 37000 dans SQLExecDirect dans F: \ xampp \ htdocs \ php-as400 \ php-as400.php sur la ligne 25 Erreur dans SQL

Retrait de l'instruction SELECT le WHERE T§DTDO = 20120319, je l'ai en cours d'exécution et la liste des éléments que je veux avec un avertissement.

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 

Ligne 30 est:

while (odbc_fetch_row($result)) 

Je crois que le problème est le caractère § que j'ai trouvé à la recherche dans Internet (https://bugs.php.net/bug.php?id=47133), mais je ne sais pas comment le résoudre.

Répondre

2

Je n'ai jamais vu le caractère § utilisé dans un nom de colonne auparavant. Cela peut être un problème de conversion de page de code. Demandez à l'administrateur IBM i de vérifier le nom de la colonne; il pourrait être vraiment T @ DTDO, T # DTDO ou T $ DTDO - quelque chose que vous pouvez réellement taper. A défaut, essayez d'entourer le nom de la colonne entre guillemets: ... où "T§DTDO" = 20120319 ... Si cela ne fonctionne pas, demandez à l'administrateur DB2 de créer une vue avec des noms de colonne qui n'ont pas de caractères spéciaux dans leur.

+0

Le nom de la colonne est T§DTDO et le caractère § est ce qu'on appelle la section Sign (http://en.wikipedia.org/wiki/Section_sign) – stblack

+0

La raison pour laquelle je enroule si le signe de section fait vraiment partie du nom de la colonne est que l'interface écran vert de DB2 ne l'aime pas. créer un exemple de table (T§DTDO char (10)); échoue avec un «jeton non attendu» au panneau de la section. Cependant, je peux le faire: créer un exemple de table ("T§DTDO" char (10)); Cela fonctionne insert dans l'exemple ("T§DTDO") valeurs ('ligne 1'); et ainsi cela sélectionne * de l'exemple; Donc je vous suggère d'essayer les guillemets autour du nom de la colonne et de voir si cela fonctionne. –

1

Essayez avec les citations:

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

caractère § et £ sont les "italien équivalent" de @ et #.

Dans le CCSID italien (par exemple, 280), vous verrez (et utiliserez) les champs de V5TDOC0L de la manière suivante: T§TDOC, T§NDOC. Dans un autre CCSID (par exemple 37), vous verrez T @ TDOC et T @ NDOC (pour le même fichier!).

Je ne sais pas quel ccsid utilisera le travail qui sert la page PHP. Cela pourrait dépendre du système par défaut.

Essayez avec "SELECT * FROM LIBRARY.V5TDOC0L OU T @ DTDO = 20120319"