【问题标题】:PHP mssql behaving weird with different statementsPHP mssql 在不同的语句中表现得很奇怪
【发布时间】:2015-07-20 20:45:47
【问题描述】:

我有以下代码:

$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*} 甚至不会运行一次。

【问题讨论】:

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


    【解决方案1】:

    它的表现非常好。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • "same resource" = 指向结果集/当前行的指针。复制语句对象只是复制该指针,因此它们都指向同一个结果集,第一次用完。 - 啊,评论已被删除,所以现在我们其余的人都在自言自语。
      • 抱歉,删除了我的第一条评论,我不应该这样做,所以这里是为将来查看这篇文章的任何人准备的:$stmt = $stmtForCounting 不应该导致 2 个单独的语句变量吗?
      【解决方案3】:

      它肯定会弄乱你的 $stmt,它是同一个资源,你尝试将它全部读取两次。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 已弃用。从同一部分的介绍中:This extension is not available anymore on Windows with PHP 5.3 or later. 另外,您至少应该解释为什么您推荐这个,“这就是我所知道的”是不够的。不过,这并不能回答提出的问题。
        • 我认为这不会解决任何问题,您可以在此处阅读:link mssql 不再由 Microsoft 维护或支持
        • 我以为服务器是linux,抱歉
        • 一个非常公平的可能性,但是为了跟上 SQL Server 的进步,Linux 用户无论如何都必须获得sqlsrv 的编译副本。如果有任何理由更喜欢(继续)使用mssql,我会很感兴趣!
        • (我认为 sqlsrv 自 2012 年起可用于 linux)该死的,cmets 总是迟到
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多