從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應該工作。 有什麼建議嗎?
在此先感謝。
只是一個迂腐的筆記:如果你使用的是MS SQL Server,那麼它不是一個LAMP堆棧。 LAMP中的M代表MySQL。 – ADyson
我同意。爲了完全清楚,我想說我正在從LAMP堆棧進行調用。我正在運行LAMP,而且我需要從運行MSSQL和其他與我的堆棧無關的其他服務器檢索信息,並且我不擁有它。 –
您無法從整個「堆棧」撥打電話。在你的情況下(和大多數情況一樣),你從應用程序撥打電話。在這種情況下,它似乎是一個PHP應用程序。它在Apache和Linux上運行的事實在很大程度上與這個問題無關,而且您正在查詢SQL Server的事實意味着您沒有使用MySQL(除非您在PHP應用程序的另一部分中調用它)? ,所以這可能與此無關,並且意味着它與LAMP無關。對不起,我很迂腐,但我發現有助於明確術語和工具以及你如何使用(或不使用)它們。 – ADyson