我有以下代码:
$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;甚至跑一次。
答案 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