gpt4 book ai didi

php - 如果在获取循环内发出另一个查询,则 PDO dblib over freetds 会重置 sql server 2000 上的查询获取

转载 作者:可可西里 更新时间:2023-11-01 13:24:15 25 4
gpt4 key购买 nike

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

  • Debian Wheezy 32 位
  • PHP 5.5.18
  • FreeTDS 0.91

此 PHP 应用程序需要与旧的 SQL Server 2000 服务器通信。我们使用了以前服务器的旧代码(PHP 5.2 和更早的 FreeTDS - 无法获取版本)。我们使用 dblib 驱动程序通过 PDO 连接到 SQL Server 2000。

我们在使用 fetch 函数时遇到了奇怪的行为。基本上,如果我们在同一个 pdo 连接对象的获取循环期间发出查询,主查询将被重置,下一个获取调用将返回 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>";
}

相同的代码在带有 pdo_sqlserver 驱动程序的 Windows PHP 上工作得很好。

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

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

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

最佳答案

截至:reference (PHP BUG SITE)

This is the behavior of MSSQL (TDS), DBLIB and FreeTDS. One statement per connection rule. If you initiate another statement, the previous statement is cancelled.

The previous versions buffered the entire result set in memory leading to OOM errors on large results sets.

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

关于php - 如果在获取循环内发出另一个查询,则 PDO dblib over freetds 会重置 sql server 2000 上的查询获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com