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
,对吗?
(原始代码较长,但我将其精简到此以试图找出问题所在。)
编辑: 它不是 Empty 因为 var_dump($stmt)
仍然说 resource(9, SQL Server Statement)
但 while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){*more code*}
在 table 创建部分甚至不会 运行 一次。
尝试使用 mssql 查询而不是 sqlsrv 查询
看这里 http://php.net/manual/en/ref.mssql.php
为什么 sqlsrv_fetch($stmtForCounting)
不会影响 $stmt
?您将相同的资源分配给 $stmt
和 $stmtForCounting
,并且通过对资源进行 while 循环,您正在遍历 table 到它的末尾,这是可以完成的就一次.7
如果您var_dump
两者都将产生相同的输出(即相同的资源)。
也许要澄清:您通过执行查询打开资源并初始化指向该资源的变量 $stmt
。之后,您初始化另一个变量,其中包含指向资源的 $stmt
的副本。没错,这两个变量都是独立的,您可以例如unset
一个和另一个仍然指向该资源。但关键是,它们指向相同的资源,因此,当您对它们执行操作(如获取行)时,资源的状态会被修改(它指向下一行),并且无论您是否通过 $stmt
或通过指向同一资源的另一个变量访问资源。
它表现得很好。
仅仅复制该上下文中的变量实际上没有任何作用,它仍然指向相同的资源,并且该资源内部有一个行指针。当您第一次获取它的所有行时,您将该指针移动到它的最后一个位置,这就是它停留的位置。
应该可以将指针移回第一个位置,但这可能需要您通过第 4 个参数将资源 'Scrollable' 设为 sqlsrv_query()
(对此不太确定).
它肯定会弄乱你的 $stmt,它是同一个资源,你尝试阅读所有内容两次。
我有以下代码:
$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
,对吗?
(原始代码较长,但我将其精简到此以试图找出问题所在。)
编辑: 它不是 Empty 因为 var_dump($stmt)
仍然说 resource(9, SQL Server Statement)
但 while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){*more code*}
在 table 创建部分甚至不会 运行 一次。
尝试使用 mssql 查询而不是 sqlsrv 查询 看这里 http://php.net/manual/en/ref.mssql.php
为什么 sqlsrv_fetch($stmtForCounting)
不会影响 $stmt
?您将相同的资源分配给 $stmt
和 $stmtForCounting
,并且通过对资源进行 while 循环,您正在遍历 table 到它的末尾,这是可以完成的就一次.7
如果您var_dump
两者都将产生相同的输出(即相同的资源)。
也许要澄清:您通过执行查询打开资源并初始化指向该资源的变量 $stmt
。之后,您初始化另一个变量,其中包含指向资源的 $stmt
的副本。没错,这两个变量都是独立的,您可以例如unset
一个和另一个仍然指向该资源。但关键是,它们指向相同的资源,因此,当您对它们执行操作(如获取行)时,资源的状态会被修改(它指向下一行),并且无论您是否通过 $stmt
或通过指向同一资源的另一个变量访问资源。
它表现得很好。
仅仅复制该上下文中的变量实际上没有任何作用,它仍然指向相同的资源,并且该资源内部有一个行指针。当您第一次获取它的所有行时,您将该指针移动到它的最后一个位置,这就是它停留的位置。
应该可以将指针移回第一个位置,但这可能需要您通过第 4 个参数将资源 'Scrollable' 设为 sqlsrv_query()
(对此不太确定).
它肯定会弄乱你的 $stmt,它是同一个资源,你尝试阅读所有内容两次。