iT邦幫忙

0

[PHP]透過[jquery] 以 [Ajax]方式使用[Stored Procedure]取得[MSSQL]資料

網上找到的參考有點混亂,因此統整一下
使用環境:
XAMPP 3.2.4
jquery.min.js 2.0.0
SQL Server2012

安裝XAMPP連結MSSQL (使用PDO方法)

這次想要用Ajax撈取Stored Procedure的執行結果
由於Stored Procedure的執行結果存在多個Table,要指定取得結果,還有傳入參數,搞了半天,紀錄一下。

PHP方面想把查詢結果放入表格

<table id="employees" cellpadding="6" border='1' align="center">
	<thead>
		<tr align="center" valign='middle'>
			<td>工號</td>
			<td>姓名</td>
			<td>部門</td>
			<td>職稱</td>
			<td>分數</td>
			<td>欄位</td>
		</tr>
		</thead>
	<tbody id="tbodyid"></tbody>
</table>

Ajax方面

當按下查詢按鈕 id="ook"的時候
如果輸入參數有值就執行
透過post json方式將參數傳入php中(先將參數做成陣列,可以一次傳送)
結果的地方,可以指定要取得哪個Stored Procedure的回傳結果。
data[0]...第1個table...以此類推

$(document).on('click', '#ook', function() {
    var number = $("#search-box").val();
    if (number != '') {
        var ip = $("#ip").text();
        var tex = $("#flo").text();
        var dataJSON = {};
        dataJSON["number"] = number;
        dataJSON["ip"] = ip;
        dataJSON["tex"] = tex;
        var $employees = $("#employees tbody");
        $("#tbodyid").empty();
        $.ajax({
            url: "sop.php",
            type: "POST",
            dataType: "json",
            data: JSON.stringify(dataJSON),
            success: function(data) {
                console.log(data);
                // debugger
                $.each(data[0], function(index, item) {
                    $employees.append(
                        "<tr style='background-color: transparent;'>" +
                        "<td>" + item.工號 + "</td>" +
                        "<td>" + item.NAME + "</td>" +
                        "<td>" + item.DEPT + "</td>" +
                        "<td>" + item.PTITL + "</td>" +
                        "<td>" + item.PLEVEL + "</td>" +
                        "<td>" + item.欄位 + "</td>" +
                        "</tr>"
                    );
                })
                $.each(data[1], function(index, item) {
                    $employ.append(
                        "<tr style='background-color: transparent;'>" +
                        "<td>" + item.PENNO + "</td>" +
                        "<td>" + item.PNAME + "</td>" +
                        "<td>" + item.PTITL + "</td>" +
                        "<td>" + item.PLEVEL + "</td>" +
                        "<td>" + item.DEPT + "</td>" +
                        "</tr>"
                    );
                })
            }
        });
    }
});

Stored Procedure方面 存在多個結果

https://ithelp.ithome.com.tw/upload/images/20201112/20132436XcHBQAptmE.png

注意
PDO 連接 MSSQL EXEC Stored Proc 會有無回傳值狀況,
這時候你會取得空的array,因此在stored proc中加入SET NOCOUNT ON (建議),
或者PHP的執行sql語法前加上SET NOCOUNT ON 即可!

USE [TEST]
GO
/****** Object:  StoredProcedure [dbo].[撈人員資料_WEB]    Script Date: 2020/11/12 下午 13:55:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[撈人員資料_WEB]
	@登入者    VARCHAR(50)
	AS
	SET NOCOUNT ON

PHP方面 (傳入參數)

透過EXEC的方法執行stored proc
並用物件陣列方式回傳執行結果
1.使用urldecode解析JSON檔(不然你會一直看到編碼資料),在接收參數丟進變數中
2.使用PDO連結sqlsrv
3.執行Stored Procedure 參數用?傳入
4.bindParam(1, $number, PDO::PARAM_STR); 將$number參數連結傳入
5.用execute() 函數執行結果
6.跑while迴圈,透過nextRowset()取得下一個執行結果
7.編碼後反輸出回Ajax

$value = urldecode(file_get_contents('php://input'));
$obj = json_decode($value);
$number = $obj->{'number'};

$conn = new PDO("sqlsrv:server=X.X.X.X;Database=TEST","帳號","密碼");
$query = ("EXEC dbo.撈人員資料_WEB ?");
$query_stored = $conn->prepare($query); 
$query_stored->bindParam(1, $number, PDO::PARAM_STR);
$query_stored->execute();
while ($query_stored->columnCount()) {
    $tab[] = $query_stored->fetchAll(PDO::FETCH_ASSOC);
    $query_stored->nextRowset();
}
echo json_encode($tab);

https://ithelp.ithome.com.tw/upload/images/20201112/201324368Z0uvjaEON.png
https://ithelp.ithome.com.tw/upload/images/20201112/20132436tvJxOb6jGu.png

回傳成功!
https://ithelp.ithome.com.tw/upload/images/20201112/20132436hzNBhgIwDi.jpg


尚未有邦友留言

立即登入留言