編寫者
|
版本
|
|
本文假定您熟悉
Php
、Sql
。
|
鄭昀
@
掌上靈通
|
第一稿
|
小麻煩:
我們按照慣例使用了一個(gè)MS Sql Server的存儲(chǔ)過(guò)程procA,它給出了一個(gè)輸出參數(shù)nReturn,
而且返回了一個(gè)結(jié)果集。
在如何讓PHP調(diào)用這個(gè)procA的時(shí)候,我們?cè)庥隽艘稽c(diǎn)小麻煩。
魚(yú)肉和熊掌不可兼得:
我們本來(lái)希望這樣的代碼能夠既得到輸出參數(shù),又得到返回的結(jié)果集:
// 初始化要傳進(jìn)存儲(chǔ)過(guò)程的參數(shù)們:
$nYear = 2004;
$nPageSize = 20;
$nPageNo = 1;
// Initializes a stored procedure:
$stmt = mssql_init("proc_stat_page", $db_mssql->Link_ID);
// 綁定輸入?yún)?shù):
mssql_bind($stmt, "@nReturn", $nReturn, SQLINT4, TRUE);
mssql_bind($stmt, "@nYear", $nYear, SQLINT4);
mssql_bind($stmt, "@nPageSize", $nPageSize, SQLINT4);
mssql_bind($stmt, "@nPageNo", $nPageNo, SQLINT4);
// 執(zhí)行存儲(chǔ)過(guò)程,得到QueryID:
$db_mssql->Query_ID = mssql_execute($stmt,false);
雖然得到了結(jié)果集,但是,這樣$nReturn參數(shù)是拿不到輸出參數(shù)的。
如果把最后一句話改為:
$db_mssql->Query_ID = mssql_execute($stmt,true);
輸出參數(shù)倒是拿到了,結(jié)果集又沒(méi)有了。
好像是一個(gè)魚(yú)肉和熊掌不可兼得的樣子。
難道PHP連這個(gè)都做不到?PHP手冊(cè)中也沒(méi)有講這個(gè)問(wèn)題。
來(lái)自于PHP維護(hù)者的解釋:
原本我們這種調(diào)用辦法是PHP 4.3版本之前肯定是支持的。
“但是,自從PHP 4.3版本之后,”他們說(shuō),“為了能夠兼容存儲(chǔ)過(guò)程返回多個(gè)結(jié)果集,PHP改變這個(gè)特性。”
“如果你不需要結(jié)果集,你應(yīng)該設(shè)置mssql_execute的第二個(gè)可選參數(shù)為TRUE,這樣mssql_execute方法之后你就可以得到輸出參數(shù)了。”
“如果你需要返回的結(jié)果集們,你應(yīng)該為每一個(gè)結(jié)果集調(diào)用一次mssql_next_result。在最后一個(gè)結(jié)果集返回之后,你再調(diào)用mssql_next_result就會(huì)得到返回值FALSE,這時(shí)候,你就可以訪問(wèn)輸出參數(shù)了。”
解決:
在最后我們補(bǔ)上一句話:
// After the last result has been returned the return value will have the value returned by the stored procedure.
mssql_next_result($db_mssql->Query_ID);
立刻,魔法生效了:
PHP填充了正確的輸出參數(shù)到$nRetVal里。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=140231
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
