2015-07-20 41 views
2

我有以下代碼:PHP MSSQL舉止怪異有不同的語句

$stmt = sqlsrv_query($conn, $sql, $params); 
$stmtForCounting = $stmt; 
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){ 
*table creation code* 
} 

到目前爲止,它的工作原理,但是當我加了一下它,所以它看起來是這樣的:

$stmt = sqlsrv_query($conn, $sql, $params); 
$stmtForCounting = $stmt; 
while (sqlsrv_fetch($stmtForCounting)){ 
} 
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){ 
*table creation code* 
} 

$stmt變量變空。使用sqlsrv_fetch($stmtForCounting)應該不會影響$stmt,對不對?

(原代碼較長,但我剝離下來到這個試圖隔離問題。)

編輯:這不是因爲var_dump($stmt)還稱resource(9, SQL Server Statement)但在創建表的while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){*more code*}部分甚至不會運行一次。

回答

3

看看爲什麼sqlsrv_fetch($stmtForCounting)不會影響$stmt?你分配相同的資源$stmt以及爲$stmtForCounting,並同時套住了資源,你遍歷表,它的結束,這是可以做到只once.7

如果var_dump都,都會產生相同的輸出(即相同的資源)。

也許要澄清:通過執行查詢並初始化一個指向此資源的變量$stmt來打開資源。之後,您初始化另一個變量,其中包含指向資源的副本$stmt。確實,兩個變量都是獨立的,你可以unset一個和另一個仍然指向資源。但重點是,它們指向相同的資源,因此,當您對它們執行操作(如提取行)時,資源的狀態會被修改(它指向下一行),並且無論您是否進行此更改通過$stmt或通過指向相同資源的其他變量訪問資源。

+3

「相同的資源」=結果集/當前行的指針。複製語句對象只是複製該指針,因此它們都指向相同的結果集,並且第一次耗盡。 - 啊,評論已被刪除,所以現在我們其他人都在跟自己說話。 –

+0

對不起,刪除了我的第一條評論,我不應該這樣做,因爲這是以後任何人看到這篇文章的時候:不應該'$ stmt = $ stmtForCounting'導致2個獨立的語句變量? – gergalyb

+0

查看@underscore_d的回答和我的編輯。 – stef77

-3

嘗試使用MSSQL的查詢,而不是SQLSRV查詢 採取這裏http://php.net/manual/en/ref.mssql.php

+1

已棄用。從同一部分的介紹:'此擴展在Windows 5.3或更高版本的Windows上不再可用。「此外,至少應該解釋_爲什麼您推薦這個,'這正是我所知道的'不足夠。但是,這並不能回答所提出的問題。 –

+0

我不認爲這會解決任何問題,你可以在這裏閱讀:[鏈接](http://blogs.msdn.com/b/brian_swan/archive/2010/03/08/mssql-vs-sqlsrv-what -s-的差部分-1。aspx)mssql不再被維護,也不被Microsoft支持 – gergalyb

+0

我認爲服務器是linux,對不起 –

4

它表現得非常好。

只是在該上下文中複製變量並沒有做任何事情,它仍然指向相同的資源,並且該資源內部具有行指針。當您第一次獲取所有行時,您將該指針移至最後一個位置,這就是它所在的位置。

應該可以將指針移回第一個位置,但這可能需要您通過第四個參數將資源'Scrollable'設置爲sqlsrv_query()(對此不太確定)。

1

它會弄亂你的$ stmt definetly,它是相同的資源,並且你嘗試讀取所有它兩次。