1

iSeries ミッドレンジに対して SQL ステートメントを実行する PHP サーバー コードがあります。

これは、SQL クエリの簡略化されたバージョンです。

SELECT 'Regular' "sales_type", sum(sales_type1) "sales" FROM salesTable

クエリは正常に実行されます。問題は、「SomeText」「Title」などの静的フィールド/値を使用し、結果が PHP で返される場合、目的の形式ではないことです。

string(7) "م�����" 

システムに接続して結果を取得するには

db2_connect ( '*LOCAL', 'user', 'pass' );
if (! $connection) {[error code]}
$stmt = db2_prepare ( $connection, $strSql );
if (! db2_execute ( $stmt ) ) { [error code ]
while ( $row = db2_fetch_array ( $stmt ) ) {
   var_dump($row[1]);
}

PHPバージョン5.2.17を使用しています

iSeries は V7R1M0 です

PHP または SQL クエリ自体でサーバー側を変換するソリューションは素晴らしいでしょう。

ありがとう!


編集

ドルの提案により、ユーザー プロファイルの CCSID を 65535 から 37 に変更しました。

ここで、少し近づいた (以下) に戻ります...

string(7) "Ù…‡¤“™"

これはおそらく、ユーザーを変更しただけなのでしょうか? システム、ジョブ、またはテーブルも変更する必要がありますか?


編集 2

ここにphpinfo出力があります

_COOKIE["ZDEDebuggerPresent"]   php,phtml,php3
_SERVER["ZendEnablerConfig"]    /www/zendserver/conf/fastcgi.conf
_SERVER["PHPRC"]    /usr/local/ZendSvr/etc/
_SERVER["PHP_FCGI_CHILDREN"]    40
_SERVER["PHP_FCGI_MAX_REQUESTS"]    0
_SERVER["CCSID"]    819
_SERVER["LANG"] C
_SERVER["INSTALLATION_UID"] 20101203131436121338
_SERVER["LDR_CNTRL"]    MAXDATA=0x40000000
_SERVER["LIBPATH"]  /usr/local/ZendSvr/lib
_SERVER["DB2NOEXITLIST"]    TRUE
_SERVER["ORACLE_HOME"]  .
_SERVER["ORA_NLS10"]    no value
_SERVER["ORA_NLS_PROFILE33"]    no value
_SERVER["FCGI_ROLE"]    RESPONDER
_SERVER["REDIRECT_UNIQUE_ID"]   UYKvWcCoAQIAAnZHWG8AABS@
_SERVER["REDIRECT_STATUS"]  200
_SERVER["UNIQUE_ID"]    UYKvWcCoAQIAAnZHWG8AABS@
_SERVER["QIBM_USE_DESCRIPTOR_STDIO"]    Y
_SERVER["HTTP_HOST"]    vmas400.vm.com:10090
_SERVER["HTTP_CONNECTION"]  keep-alive
_SERVER["HTTP_X_REQUESTED_WITH"]    XMLHttpRequest
_SERVER["HTTP_USER_AGENT"]  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
_SERVER["CONTENT_TYPE"] application/x-www-form-urlencoded
_SERVER["HTTP_ACCEPT"]  */*
_SERVER["REFERER"]  http://vmas400.vm.com:10090ZendServer/Index/Index
_SERVER["HTTP_REFERER"] http://vmas400.vm.com:10090/ZendServer/Index/Index
_SERVER["REFERER_URL"]  http://vmas400.vm.com:10090/ZendServer/Index/Index
_SERVER["HTTP_ACCEPT_ENCODING"] gzip,deflate,sdch
_SERVER["HTTP_ACCEPT_LANGUAGE"] en-US,en;q=0.8
_SERVER["HTTP_ACCEPT_CHARSET"]  ISO-8859-1,utf-8;q=0.7,*;q=0.3
_SERVER["HTTP_COOKIE"]  ZENDSERVERSESSID=7asfv608qffhv556msem6evi66; CosmeticContest=16062; CompanyWithStoreDetail=16061; TYLYClassAnalysis=16068; OrderDetail=17220; RmsOrders=17221; DailyReceipts=16063; DailySales=17562; OnOrder=16064; OpenPurchaseOrders=17566; RegularPriceRankings=17568; ReviewStatistics=17570; SalesAndStock=17573; StocksByPeriod=17575; Top10BestSellers=17577; ReplenishmentAssortment=17269; RABS=17616; FreeFormatSku=16473; TYLYSalesAndOH=21294; SalesRecapByDate=16312; VendorAgendaSummary=23219; BasicStock=23474; InStock=16067; RegSalesAvgStockSummary=21270; TYLYSalesMDGMByStore=23822; VendorAgenda=23826; Header=16066; usc=adam; hudi[u]=d106b7a04c0d94b8a0e7624a017ead98324b57e8; hudi[i]=fec51923e58c84db4647d2b3e11fe03ec3f0c202; FreeFormat=16506; __utma=118969486.352613215.1355776933.1365626094.1367348033.12; __utmz=118969486.1355776933.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ZDEDebuggerPresent=php,phtml,php3
_SERVER["PATH"] /bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin
_SERVER["SERVER_SIGNATURE"] no value
_SERVER["SERVER_SOFTWARE"]  Apache
_SERVER["SERVER_NAME"]  vmas400.vm.com
_SERVER["SERVER_ADDR"]  192.168.1.2
_SERVER["SERVER_PORT"]  80
_SERVER["REMOTE_ADDR"]  172.16.129.193
_SERVER["DOCUMENT_ROOT"]    /www/zendserver/htdocs/prod
_SERVER["SERVER_ADMIN"] [no address given]
_SERVER["SCRIPT_FILENAME"]  /usr/local/zendsvr/gui/html/index.php
_SERVER["DOCUMENT_NAME"]    /usr/local/zendsvr/gui/html/index.php
_SERVER["REMOTE_PORT"]  14259
_SERVER["REDIRECT_QUERY_STRING"]    dojo.preventCache=1367519066445
_SERVER["REDIRECT_URL"] /ZendServer/Information/Phpinfo
_SERVER["GATEWAY_INTERFACE"]    CGI/1.1
_SERVER["SERVER_PROTOCOL"]  HTTP/1.1
_SERVER["REQUEST_METHOD"]   GET
_SERVER["QUERY_STRING"] dojo.preventCache=1367519066445
_SERVER["REQUEST_URI"]  /ZendServer/Information/Phpinfo?dojo.preventCache=1367519066445
_SERVER["SCRIPT_NAME"]  /ZendServer/index.php
_SERVER["DOCUMENT_URI"] /ZendServer/index.php
_SERVER["RULE_FILE"]    conf/httpd.conf
_SERVER["PHP_SELF"] /ZendServer/index.php
_SERVER["REQUEST_TIME"] 1367519066

編集

解決

解決策は、CCSID 37 を使用するようにユーザー プロファイルを変更し、CCSID 37 を使用するようにサーバー ジョブを変更することでした。ジョブが再開されたときに元に戻らないように、手動で変更します。

4

2 に答える 2

3

IBM 側が適切に構成されていれば、変換は自動的に行われます。IBM 管理者にシステム値 QCCSID を確認してもらいます。65535 に設定されている場合、変換が行われていないのはそのためです。65535 は、システム上のすべてのデータはバイナリであり、決して変換してはならないことを示しています。CCSID には階層があります。これは QCCSID でシステム レベルから始まり、ユーザー プロファイルに移動し、最後に個々のテーブルに移動します。これは、複数の言語が使用されているシステムを処理するためです。

システムが 65535 にある主な理由は、現在のミッドレンジ マシンの遠い祖先が展開されたとき、単一の言語があったためです。1 つの EBCDIC であり、複数の言語が導入されたとき、デフォルトの言語は「翻訳しない」に設定されていました。

EBCDIC は単一の文字セットではなくなりました。言語ごとに 1 つのエンコーディングがあります。米国英語は CCSID(37) です。CCSID が問題であることが判明した場合は、管理者に適切な CCSID でテスト ユーザー プロファイルを作成してもらい、それを試してもらいます。

編集 1:マシンでテストを行いました。

編集 2:返された列にリテラルを追加しました。

<?php
  //Establish connection to database
  $host = "midrange";
  $conn = db2_connect ($host, user, pass);
?>

<table width="75%" border="1" cellspacing="1" cellpadding="1" bgcolor="#eeeeee">
<tr>
  <td><b>Name</b></td>
  <td><b>Email</b></td>
  <td><b>3rd column</b></td>
</tr>

<?php
$query = 'Select name, email, \'Markdown\' "THIRD" from table';

//Execute query
$queryexe = db2_exec($conn, $query) ;

//Fetch results
while(db2_fetch_row($queryexe)) {
 $name  = db2_result($queryexe, 'NAME');
 $email = db2_result($queryexe, 'EMAIL');
 $const = db2_result($queryexe, 'THIRD');

//Put the results in an HTML table.
print("<tr bgcolor=#ffffff>\n");
print("<td>$name</td>\n");
print("<td>$email</td>\n");
print("<td>$const</td>\n");
print("</tr>\n");
}
?>
</table>

私のテーブルはすべて CCSID(37) IBM i 7.1 です。
phpinfo() は IBM_DB2 1.9.0、PHP 5.3.3 を報告します。iconv サポートを有効にしており、サーバーの CCSID は 819 - US ASCII です。

編集 3:非常に部分的な phpinfo()

ibm_db2
IBM DB2, Cloudscape and Apache Derby support    enabled
Module release  1.9.0
Module revision     $Revision: 297218 $
Binary data mode (ibm_db2.binmode)  DB2_BINARY
DB2 instance name (ibm_db2.instance_name)   no value

iconv
iconv support   enabled
iconv implementation    IBM iconv
iconv library version   unknown

Directive   Local Value Master Value
iconv.input_encoding    ISO8859-1   ISO8859-1
iconv.internal_encoding ISO8859-1   ISO8859-1
iconv.output_encoding   ISO8859-1   ISO8859-1
Environment
Variable    Value
ZendEnablerConfig   /www/zendsvr/conf/fastcgi.conf
PHPRC   /usr/local/ZendSvr/etc/
PHP_FCGI_CHILDREN   5
PHP_FCGI_MAX_REQUESTS   0
CCSID   819
LANG    en_US
INSTALLATION_UID    20101215125734236656
LIBPATH     /usr/local/ZendSvr/lib
DB2NOEXITLIST   TRUE

PHP Variables
Variable    Value
_REQUEST["TJE"] no value
_REQUEST["TE3"] no value
_REQUEST["ZDEDebuggerPresent"]  php,phtml,php3
_COOKIE["TJE"]  no value
_COOKIE["TE3"]  no value
_COOKIE["ZDEDebuggerPresent"]   php,phtml,php3
_SERVER["ZendEnablerConfig"]    /www/zendsvr/conf/fastcgi.conf
_SERVER["PHPRC"]    /usr/local/ZendSvr/etc/
_SERVER["PHP_FCGI_CHILDREN"]    5
_SERVER["PHP_FCGI_MAX_REQUESTS"]    0
_SERVER["CCSID"]    819
_SERVER["LANG"] en_US
_SERVER["INSTALLATION_UID"] 20101215125734236656
_SERVER["LIBPATH"]  /usr/local/ZendSvr/lib
_SERVER["DB2NOEXITLIST"]    TRUE
_SERVER["FCGI_ROLE"]    RESPONDER
_SERVER["SCRIPT_URL"]   /hello.php
_SERVER["QIBM_USE_DESCRIPTOR_STDIO"]    Y
_SERVER["HTTP_USER_AGENT"]  Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0
_SERVER["HTTP_ACCEPT"]  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
_SERVER["HTTP_ACCEPT_LANGUAGE"] en-US,en;q=0.5
_SERVER["HTTP_ACCEPT_ENCODING"] gzip, deflate
_SERVER["HTTP_DNT"] 1
_SERVER["HTTP_CONNECTION"]  keep-alive
_SERVER["HTTP_PRAGMA"]  no-cache
_SERVER["HTTP_CACHE_CONTROL"]   no-cache
_SERVER["PATH"] /bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin
_SERVER["SERVER_SIGNATURE"] no value
_SERVER["SERVER_SOFTWARE"]  Apache
_SERVER["DOCUMENT_ROOT"]    /www/zendsvr/htdocs
_SERVER["SERVER_ADMIN"] [no address given]
_SERVER["SCRIPT_FILENAME"]  /www/zendsvr/htdocs/hello.php
_SERVER["DOCUMENT_NAME"]    /www/zendsvr/htdocs/hello.php
_SERVER["REMOTE_PORT"]  54747
_SERVER["GATEWAY_INTERFACE"]    CGI/1.1
_SERVER["SERVER_PROTOCOL"]  HTTP/1.1
_SERVER["REQUEST_METHOD"]   GET
_SERVER["QUERY_STRING"] no value
_SERVER["REQUEST_URI"]  /hello.php
_SERVER["SCRIPT_NAME"]  /hello.php
_SERVER["DOCUMENT_URI"] /hello.php
_SERVER["RULE_FILE"]    conf/httpd.conf
_SERVER["PHP_SELF"] /hello.php
_SERVER["REQUEST_TIME"] 1367514482

編集 4:サーバー ジョブの CCSID(37) の作成方法

サーバー ジョブで米国英語を実行するには、いくつかの方法があります。サーバー操作全体への影響が最も少ないのは、管理者の決定です。米国英語のみのシステムを IPL で QCCSID 37 に設定しましたが、問題は発生していません。

  1. CHGSYSVAL QCCSID 37- これにより、サーバー全体が米国英語に設定されます。Apache サーバーを再起動して有効にします。
  2. CHGUSRPRF QTMHHTTP CCSID(37)- これにより、すべての HTTP サーバー ジョブが米国英語に設定されます。Apache サーバーを再起動して有効にします。
  3. Apache サーバーを再構成します。 Apache サーバーを設定CgiConvMode EBCDICDefaultNetCCSID 819、再起動して有効にします。CGIJobCCSID 37詳細については、 CGI データ変換を参照してください。これにより、1 つの Apache サーバーのジョブが米国英語に設定されます。
  4. CHGPF ... CCSID(37)- これにより、ファイルが米国英語に設定されます。それらをすべて変更する必要があります。

これは、すべてを包括することを意図したものではありません。階層がどのように組み合わされるかの概要のようなものです。

于 2013-05-02T14:33:07.160 に答える
1

これを行うためのより良い方法を発見しました... DSN でTRANSLATE または ForceTranslation キーワードを使用します。例えば:

odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=as400.myserver.local;TRANSLATE=1;

ファイルやシステム設定を変更したり、クエリで CAST を使用したりする必要はありません。

于 2015-12-08T00:17:29.743 に答える