首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 呼叫 SAP RFC:字串參數傳遞後在 RFC 端收到空字串的排查

     編輯:程式設計綜合問答

現象

PHP 端呼叫:

$result = $sap->callFunction("XXX", [
    ["IMPORT", "I_ZCZLX", "1"],
    ["IMPORT", "I_WRITER", "MAO"],
    ["IMPORT", "I_CODE", "TP-IMC-002"],
    ["IMPORT", "I_EXCEL_DATA", "0-JA-T00|"],
    ["TABLE", "T_RETURNS", []]
]);

RFC 函式內 I_EXCEL_DATA 收到空字串,其他參數正常。

可能原因

  1. RFC 參數型別定義不匹配:ABAP 端 I_EXCEL_DATA 定義為 CHAR 長度不足(如 CHAR10),導致截斷或轉換為空。
  2. 字元編碼轉換問題:PHP 端 UTF-8 → SAP 端非 Unicode 系統(Codepage)轉換失敗,特殊字元(|、-)導致截斷。
  3. 參數大小寫/名稱不符:ABAP 區分大小寫,確認 I_EXCEL_DATA 完全一致。
  4. PHP RFC 擴展版本 Bug:舊版 saprfc 對長字串/特殊字元處理有缺陷。

排查步驟

  1. 檢查 ABAP 資料元素:SE11 查看 I_EXCEL_DATA 對應的資料元素/網域,確認長度(如 CHAR255 或 STRING)。
  2. 啟用 RFC 追蹤:SAP 交易碼 ST05 或 SE37 測試工具,輸入相同值觀察接收結果。
  3. PHP 端測試簡短純字母數字:改傳 "TEST123",若正常則為長度/特殊字元問題。
  4. 檢查 PHP 編碼設定:saprfc.ini 或連線參數中 codepage 設定(如 1100 for UTF-8,4103 for BIG5)。
  5. 升級/重新編譯 saprfc 擴展:對應 PHP 版本(見 33256 號文章)。

常見解決方案

  • ABAP 端將參數型別改為 STRING 或足夠長的 CHAR。
  • PHP 端將含特殊字元的值先 base64_encode,RFC 端再 decode(雙方協定)。
  • 確認 saprfc 擴展編譯無誤(參考 33256 號:PHP 5.4+ 需修原始碼 function_entry 宣告)。

最小可測試程式碼

<?php
$conn = saprfc_open([
    "ashost" => "host", "sysnr" => "00", "client" => "100",
    "user" => "user", "passwd" => "pass", "lang" => "EN"
]);
if (!$conn) die("連線失敗");

$rfc = saprfc_function_discover($conn, "Z_TEST_STR");
saprfc_import($rfc, "I_STR", "0-JA-T00|");
if (saprfc_call($rfc, $conn)) {
    $out = saprfc_export($rfc, "E_STR");
    var_dump($out); // 應輸出 string(10) "0-JA-T00|"
}
saprfc_function_free($rfc);
saprfc_close($conn);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved