Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP mssql使用不同的语句表现怪异_Php_Sql Server_Sql Server 2008_Sqlsrv - Fatal编程技术网

PHP mssql使用不同的语句表现怪异

PHP mssql使用不同的语句表现怪异,php,sql-server,sql-server-2008,sqlsrv,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); $stmtForC

我有以下代码:

$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\u fetch($stmtForCounting)
不应该影响
$stmt
,对吗

(原始代码较长,但我将其精简为此,试图隔离问题。)


编辑:它不是空的,因为
var_dump($stmt)
仍然显示
resource(9,SQL Server语句)
但是
而($row=sqlsrv_fetch_数组($stmt,sqlsrv_fetch asoc)){*更多代码}
在表创建部分甚至不会运行一次。

尝试使用mssql查询而不是sqlsrv查询
看看这里

为什么
sqlsrv\u fetch($stmtForCounting)
不应该影响
$stmt
?您正在将相同的资源分配给
$stmt
以及
$stmtForCounting
,并且在资源上循环时,您正在遍历表到它的末尾,这只能执行一次。7

如果您
var\u dump
both,两者都将产生相同的输出(即相同的资源)


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

它运行良好

仅在该上下文中复制变量实际上没有任何作用,它仍然指向同一资源,并且该资源内部有一个行指针。当您第一次获取它的所有行时,您将指针移动到它的最后一个位置,这就是它所在的位置


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

它会彻底弄乱您的$stmt,它是同一个资源,您尝试读取所有资源两次。

已弃用。从同一部分的介绍中:
这个扩展在使用PHP5.3或更高版本的Windows上不再可用。
此外,您至少应该解释一下为什么推荐这个扩展,因为“这只是我所知道的”是不够的。不过,这并不能回答提出的问题。我认为这解决不了任何问题,正如您在这里看到的:mssql不再由MicrosoftI维护或支持。我假设服务器是linux,很有可能,但为了跟上SQL server的发展,Linux用户无论如何都必须获取
sqlsrv
的编译副本。如果有任何理由喜欢(继续)使用
mssql
,我会感兴趣的!(我认为sqlsrv从2012年起就可以在linux上使用)该死的,总是很晚才有注释“same resource”=指向结果集/当前行的指针。复制语句对象只是复制该指针,因此它们都指向同一个结果集,这在第一次使用时会耗尽。-啊,评论已经被删除了,所以现在我们其他人都在自言自语。对不起,删除了我的第一条评论,我不应该这么做。这是为以后看这篇文章的人准备的:
$stmt=$stmtForCounting
不应该导致两个单独的语句变量吗?