MSSQL,LINUX,从LAMP堆栈中调用存储过程获取结果

MSSQL,LINUX,从LAMP堆栈中调用存储过程获取结果

问题描述:

从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

后尝试所有可能的组合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']);