Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 如果在fetch循环中发出另一个查询,则freetds上的PDO dblib将重置sql server 2000上的查询获取_Php_Sql Server_Pdo_Freetds - Fatal编程技术网

Php 如果在fetch循环中发出另一个查询,则freetds上的PDO dblib将重置sql server 2000上的查询获取

Php 如果在fetch循环中发出另一个查询,则freetds上的PDO dblib将重置sql server 2000上的查询获取,php,sql-server,pdo,freetds,Php,Sql Server,Pdo,Freetds,好的,我们有了一个新的服务器 Debian喘息32位 PHP 5.5.18 FreeTDS 0.91 此PHP应用程序需要与旧的SQL server 2000服务器对话。我们使用了以前服务器上的旧代码(PHP5.2和更旧的FreeTDS-无法获取版本)。 我们使用dblib驱动程序通过PDO连接到SQLServer2000 我们在fetch函数中遇到了奇怪的行为。基本上,如果我们在同一pdo连接对象的fetch循环期间发出查询,则主查询将被重置,并且下一个fetch调用将返回false,即使

好的,我们有了一个新的服务器

  • Debian喘息32位
  • PHP 5.5.18
  • FreeTDS 0.91
此PHP应用程序需要与旧的SQL server 2000服务器对话。我们使用了以前服务器上的旧代码(PHP5.2和更旧的FreeTDS-无法获取版本)。 我们使用dblib驱动程序通过PDO连接到SQLServer2000

我们在fetch函数中遇到了奇怪的行为。基本上,如果我们在同一pdo连接对象的fetch循环期间发出查询,则主查询将被重置,并且下一个fetch调用将返回false,即使仍有记录要获取

// PSEUDO CODE
// Here the main query
$q = $sql7->query("SELECT TOP 5 * FROM News ORDER BY Data Desc");
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
    // Looping through the results
    echo "<h1>Main query</h1>";
    print_r($row);

    // Issue a query on the same pdo connection
    $subq = $sql7->query("SELECT TOP 1 * FROM News WHERE IDNews = " . $row['IDNews'] . " ");
    while ($subResult = $subq->fetch(PDO::FETCH_ASSOC)) {
        echo "<h1>Inner query</h1>";
        print_r($subResult);
    }

    // Here the main query $q->fetch(PDO::FETCH_ASSOC) will answer false on the next iteration
    // if we remove the subq, the main query loops just fine
    echo "<hr>";
}
//伪代码
//这里是主要的查询
$q=$sql7->query(“按数据描述从新闻顺序中选择前5个*);
而($row=$q->fetch(PDO::fetch\U ASSOC)){
//循环浏览结果
回显“主查询”;
打印(行);
//对同一pdo连接发出查询
$subq=$sql7->query(“从新闻中选择前1*,其中IDNews=“.$row['IDNews']”);
而($subResult=$subq->fetch(PDO::fetch_ASSOC)){
回应“内部查询”;
打印(子结果);
}
//在这里,主查询$q->fetch(PDO::fetch_ASSOC)将在下一次迭代中回答false
//如果我们删除subq,那么主查询循环就可以了
回声“
”; }
同样的代码在带有pdo_sqlserver驱动程序的Windows PHP上运行良好

我们作为fetch函数的参数传递的fetch类型并不重要

PHP不会抛出任何警告或错误

我真的不知道这里发生了什么。

截至:

这是MSSQL(TDS)、DBLIB和FreeTDS的行为。一句话 根据连接规则。如果启动另一个语句,则前一个 对账单已取消

以前的版本将整个结果集缓冲在内存中 在大型结果集上查找错误

因此,似乎是PHP的早期版本(5.3和早期版本)不符合TDS行为。
我们需要重构代码。

不确定PDO是否能很好地执行“嵌套”查询。我建议在“外部”查询中使用“fetchAll”。这可能很有用:。谢谢Ryan,你提供的链接似乎说明了一切。谢谢!:)请注意:在Windows上使用的sqlsrv将具有以前的行为。所以,如果您在Windows计算机上开发,但生产服务器不可用,请注意这一点Linux@MarcoMarsala您知道MS SQL Server上PDO_ODBC驱动程序的行为吗?我确认PDO_sqlsrv在*nix上也有相同的行为(至少在MacOS、PHP7.1.1上):获取“嵌套”查询的记录集(不同于PDO_dblib)不会影响以前的记录集(仍然未完全获取)。