PHP mssql用不同的语句表现得很奇怪

时间:2015-07-20 20:45:48

标签: php sql-server sql-server-2008 sqlsrv

我有以下代码:

$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*}赢了&# 39;甚至跑一次。

4 个答案:

答案 0 :(得分:4)

表现得非常好。

只是在该上下文中复制变量并不是真的,它仍然指向同一个资源,并且该资源内部有一个行指针。当你第一次获取它的所有行时,你将指针移动到它的最后位置,那就是它停留的位置。

应该可以将指针移回第一个位置,但这可能需要您通过第4个参数将资源“可滚动”设为sqlsrv_query()(不确定那个)。

答案 1 :(得分:3)

为什么sqlsrv_fetch($stmtForCounting)不会影响$stmt?您将相同的资源分配给$stmt以及$stmtForCounting,并且通过对资源进行while循环,您将遍历表到结尾,这可以只执行一次。

如果你var_dump两者都会产生相同的输出(即相同的资源)。

或许澄清一下:您通过执行查询并初始化指向此资源的变量$stmt来打开资源。然后,初始化另一个变量,该变量包含指向资源的$stmt副本。没错,两个变量都是独立的,例如,你可以unset其中一个仍然指向资源。但重点是,它们指向相同的资源,因此,当您对它们执行操作(如获取行)时,资源的状态会被修改(它指向下一行),无论您是否发生此更改都会发生通过$stmt或通过指向同一资源的另一个变量访问资源。

答案 2 :(得分:1)

它肯定会破坏您的$ stmt,它是相同的资源,并且您尝试阅读所有这两次。

答案 3 :(得分:-3)

尝试使用mssql查询而不是sqlsrv查询 看看http://php.net/manual/en/ref.mssql.php