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应该工作。 有什么建议吗?
在此先感谢。
后尝试所有可能的组合14天..这是我想出了这个事情(这是preety直线前进,如果你熟悉有关其他实验驱动程序和驱动程序,版本等的交叉影响所有细节, ...)
教训:
- 对于任何MS集成,使得孤立的microService
- 如果你能(因为在大多数情况下,更新是很难做到的。)更新PHP和Ubuntu版本
- 请勿f *** u seored程序像API一样工作!!!!! (在我的情况下,这个外部供应商使用这种方式)
- 再次阅读点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']);
只是一个迂腐的笔记:如果你使用的是MS SQL Server,那么它不是一个LAMP堆栈。 LAMP中的M代表MySQL。 – ADyson
我同意。为了完全清楚,我想说我正在从LAMP堆栈进行调用。我正在运行LAMP,而且我需要从运行MSSQL和其他与我的堆栈无关的其他服务器检索信息,并且我不拥有它。 –
您无法从整个“堆栈”拨打电话。在你的情况下(和大多数情况一样),你从应用程序拨打电话。在这种情况下,它似乎是一个PHP应用程序。它在Apache和Linux上运行的事实在很大程度上与这个问题无关,而且您正在查询SQL Server的事实意味着您没有使用MySQL(除非您在PHP应用程序的另一部分中调用它)? ,所以这可能与此无关,并且意味着它与LAMP无关。对不起,我很迂腐,但我发现有助于明确术语和工具以及你如何使用(或不使用)它们。 – ADyson