2017-10-18 140 views
0

從LAMP環境調用MSSQL過程我遇到了一個有趣的挑戰。我更喜歡使用php 5.3和ubuntu 12.04(由於當前的生產設置,PDO和dblib驅動程序),或者在最壞的情況下使用ubuntu 16.04和php 7.1(使用官方的ms ODBC驅動程序,以及另一種更新的環境微服務)。我的挑戰是調用存儲過程,它將XML作爲參數,並返回一些XML結果。連接工作,但我無法讀取輸出參數。MSSQL,LINUX,從LAMP堆棧中調用存儲過程獲取結果

MSSQL存儲過程是這樣的(也查詢將按預期如果從SQLPro拼命地跑了MSSQL):

DECLARE @return_value int 
DECLARE @lpc_odgovor xml 

EXEC @return_value = 
    store_proc_name 
     @lpx_plan = '', 
     @lpc_odgovor = @lpc_odgovor out 

SELECT 
    'Return Value' = @return_value, 
    'Response'[email protected]_odgovor 

Response is in 2 column 
1 col: 
Return Value 
-5 (which is some status code... 

2 col: 
Response 
'<xml>some xml string</xml>' (what i need for further work) 

目前我扶着更多地轉向PHP 7.1和Ubuntu 16.04,由於官方的MS支持。我的最新最全成的嘗試看起來是這樣的:

$connectionInfo = array(
    "Database" => "xx", 
    "UID" => "x", 
    "PWD" => "xx" 
); 

$conn = sqlsrv_connect('server, port', $connectionInfo); 

$document = '<someXml></someXML>'; 
$myparams = [ 
    'lpx_plan' => $document, 
    'lpc_odgovor' => '', 
]; 

$odgovor = null; 
$params = array(
    array(
     &$myparams['lpx_plan'], 
     SQLSRV_PARAM_IN, 
     SQLSRV_PHPTYPE_STRING('UTF-8'), 
     SQLSRV_SQLTYPE_XML 
    ), 
    array(
     &$odgovor, 
     SQLSRV_PARAM_INOUT, 
     SQLSRV_PHPTYPE_STRING('UTF-8'), 
     SQLSRV_SQLTYPE_XML 

    ) 
); 

$sql = "EXEC store_proc_name @lpx_plan=?,@lpc_odgovor=?;"; 


$result = sqlsrv_query($conn, $sql, $params); 
if ($result === false) { 
    echo "Error in executing statement 3.\n"; 
    die(print_r(sqlsrv_errors(), true)); 
} 
$rss = array(); 
do { 
    $rs = array(); 
    var_dump($result); 
    while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { 
     array_push($rs, $row); 
    } 
    array_push($rss, $rs); 
} while (sqlsrv_next_result($result)); 


var_dump($rs); 

但現在沒有檢索輸出則params的任何成功...

我試過的
How to execute a stored procedure in php using sqlsrv and "?" style parameters
http://trentrichardson.com/2011/08/10/making-sense-of-stored-procedures-with-php-pdo-and-sqlsrv/
Executing a Stored Procedure with pdo_sqlsrv
Calling stored procedure from PHP using PDO to MSSQL Server using INPUT Paramters不同的變化

我讀書最多的關於指定IN/OUT PARAM類型在MS側的相關文件: https://docs.microsoft.com/en-us/sql/connect/php/how-to-retrieve-output-parameters-using-the-sqlsrv-driver

我想獲得的數據在真皮休閒1周直,但現在沒有任何更大的成功(甚至爲每一個新的關鍵字我來了與此同時,我已經打開了大部分鏈接並嘗試了其他人的解決方案)。

但在對方看來,我的連接正常。我也能夠運行基本的SQL'SELECT * FROM some_table WHERE ....',我可能不是第一個嘗試讀取任何存儲過程響應的人。

能,如果需要,將提供任何進一步的數據。我錯過了什麼?我開放給新的驅動程序,新的連接方式......但我相當肯定sqlsrv應該工作。 有什麼建議嗎?

在此先感謝。

+0

只是一個迂腐的筆記:如果你使用的是MS SQL Server,那麼它不是一個LAMP堆棧。 LAMP中的M代表MySQL。 – ADyson

+0

我同意。爲了完全清楚,我想說我正在從LAMP堆棧進行調用。我正在運行LAMP,而且我需要從運行MSSQL和其他與我的堆棧無關的其他服務器檢索信息,並且我不擁有它。 –

+0

您無法從整個「堆棧」撥打電話。在你的情況下(和大多數情況一樣),你從應用程序撥打電話。在這種情況下,它似乎是一個PHP應用程序。它在Apache和Linux上運行的事實在很大程度上與這個問題無關,而且您正在查詢SQL Server的事實意味着您沒有使用MySQL(除非您在PHP應用程序的另一部分中調用它)? ,所以這可能與此無關,並且意味着它與LAMP無關。對不起,我很迂腐,但我發現有助於明確術語和工具以及你如何使用(或不使用)它們。 – ADyson

回答

0

後嘗試所有可能的組合14天..這是我想出了這個事情(這是preety直線前進,如果你熟悉有關其他實驗驅動程序和驅動程序,版本等的交叉影響所有細節, ...)

教訓:

  1. 對於任何MS集成,使得孤立的microService
  2. 如果你能(因爲在大多數情況下,更新是很難做到的。)更新PHP和Ubuntu版本
  3. 請勿f *** u seored程序像API一樣工作!!!!! (在我的情況下,這個外部供應商使用這種方式)
  4. 再次閱讀點3,並記住!!!!!!

因此,這裏是我的解決方案: 要求:

  • 的Ubuntu 16.04
  • PHP> 7.0(因爲MS有一些 「官方」 支持)
  • PHP模塊ODBC,SQLSRV,PDO_SQLSRV

    $connectionInfo = [ 
        "Database" => "xxx", 
        "UID" => "xx", 
        "PWD" => "xxx" 
    ]; 
    $conn = sqlsrv_connect('xx, xx', $connectionInfo); 
    
    $document = 'some xml'; 
    $myparams = [ 
        'lpx_plan' => $document, 
        'lpc_odgovor' => '', 
    ]; 
    
    $params = [ 
        [ 
         &$myparams['lpx_plan'], 
         SQLSRV_PARAM_IN, 
         SQLSRV_PHPTYPE_STRING('UTF-8'), 
         SQLSRV_SQLTYPE_XML 
        ], 
        [ 
         &$myparams['lpc_odgovor'], 
         SQLSRV_PARAM_INOUT, 
         SQLSRV_PHPTYPE_STRING('UTF-8'), 
         SQLSRV_SQLTYPE_XML 
    
        ] 
    ]; 
    
    $sql = "EXEC call_procedure_name @lpx_plan=?,@lpc_odgovor=?;"; 
    var_dump($conn); 
    
    $result = sqlsrv_query($conn, $sql, $params); 
    if ($result === false) { 
        echo "Error in executing statement 3.\n"; 
        die(print_r(sqlsrv_errors(), true)); 
    } 
    
    sqlsrv_next_result($result); 
    var_dump($myparams['lpc_odgovor']); 
    var_dump($myparams['lpx_plan']); 
    
相關問題