PHP mssql在不同的语句中表现奇怪


PHP mssql behaving weird with different statements

我有以下代码:

$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*}在表创建部分甚至不会运行一次。

运行良好。

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

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

为什么sqlsrv_fetch($stmtForCounting)不应该影响$stmt ?您将相同的资源分配给$stmt$stmtForCounting,并且通过while-loop遍历资源,您将遍历表到它的末端,这可以只完成一次。

如果同时执行var_dump,则两者将产生相同的输出(即相同的资源)。

也许需要澄清一下:您通过执行查询并初始化指向该资源的变量$stmt来打开资源。然后,初始化另一个变量,该变量包含指向资源的$stmt的副本。真的,两个变量是独立的,你可以例如unset一个和另一个仍然指向资源。但关键是,它们指向相同的资源,因此,当您对它们执行操作(如抓取行)时,资源的状态被修改(它指向下一行),无论您是通过$stmt还是通过指向相同资源的另一个变量访问资源,都将发生此更改。

它肯定会弄乱你的$stmt,它是相同的资源,你试图读取所有的内容两次

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