PHP sqlsrv:从函数传递资源

时间:2013-05-15 10:31:44

标签: php sql-server sqlsrv

PHP 5.4.14 SQL Server 2012 / SQL Client 2012 Windows 2008 R2

我有一个函数(简化版本如下),我调用它来运行SQL查询。它工作正常:连接到DB;运行查询并获取有效资源。问题是返回的资源是null ...

function squeal($query) {

    $serverName     = "XXXXXXXX\SQLEXPRESS";
    $uid            = "private";
    $pwd            = "private";
    $connectionInfo = array( "UID"=>$uid, "PWD"=>$pwd, "Database"=>"DBname");

    /* Connect using SQL Server Authentication. */
    $conn = sqlsrv_connect( $serverName, $connectionInfo);
    if( $conn === false ) {
         echo "Unable to connect.</br>";
         die( print_r(sqlsrv_errors(), true));
    }
    /* Run query */
    $result = sqlsrv_query( $conn, $query, array(), array("Scrollable"=>"buffered"));
    if( $result === false ) {
         echo "Error in executing query.</br>";
         die( print_r(sqlsrv_errors(), true));
    }
    /* check resource exists for debug (still fails without these lines) */
    echo("Resource=".intval($result)."</br>");
    echo("Has rows=".sqlsrv_has_rows($result)."</br>");

    return $result;
}

$tsql = "SELECT id FROM mytable";
$fred = squeal($tsql);

echo("Resource=".intval($fred)."</br>");
echo("Has rows=".sqlsrv_has_rows($fred)."</br>");

它提供以下输出......

Resource=8
Has rows=1
Resource=8

Warning: sqlsrv_has_rows(): 8 is not a valid ss_sqlsrv_stmt resource in <path> on line 85
Has rows=

SQL正常运行并返回有效资源。从函数返回时,它知道它已经传递了资源#8(在这个例子中),但它是空的。我使用类似的MySQL方法,完美地工作。我的整个Intranet应用程序依赖于能够调用函数来运行查询并获取资源。

在sqlsvr / ODBC中离开函数时资源是否“死”?肯定不会。

我花了几天时间在谷歌搜索答案,但只能让SQL服务器在函数之外工作。我将不胜感激任何建议

干杯

1 个答案:

答案 0 :(得分:2)

我发现这是一个引人入胜的问题,在寻找可能的原因时,我发现this topic实际上听起来似乎有道理。

简而言之:您在功能范围内打开连接资源$conn。因此,离开该范围时它被破坏是有道理的。源自该连接资源的所有资源自动不再有效,因此这解释了为什么查询资源在退出范围时也会死亡。如果以这种方式看待它也是有意义的 - 如果没有逻辑父资源,派生资源如何继续存在。我们只是被PHP宠坏了,它通常不关心这个,但在C#/ Java等中它是合理的行为。

如果这个假设是正确的,最简单的解决方案是将global $conn;放在squeal函数的开头,这样它就不会超出范围。根据代码的其余部分,您可以实现更优雅(并且可能性更小的冲突)的解决方案,但实现并不是真正的犹太教,无论如何它在一个函数中连接,然后期望后续生存在外面。