3

我正在对 MSSQL 使用 PDO,并且需要运行嵌套查询。它们都是准备好的陈述。如果我尝试使用 fetch() 方法,它的内部查询会立即失败,所以我使用了 fetchAll()。所以,我得到了这样的东西,包括项目、产品和预算:

$pgm_stmt->execute();
$pgm_res = $pgm_stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($pgm_res as $pgmrow) {
    $prod_stmt->execute(array($pgmrow['ID']));
    $prod_res = $prod_stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($prod_res as $prodrow) {
        $bdgt_stmt->execute(array($pgmrow['ID'], $prodrow['ID']));
        $bdgt_res = $bdgt_stmt->fetchAll(PDO::FETCH_NUM);
        foreach ($bdgt_res as $bdgtrow) {
            ... work here
        }
    }
}

好的,第一次一切正常,但是当它循环返回第二个程序时,产品结果集会以某种方式损坏。当我在 fetchAll() 之后转储 $prod_res 变量时,这些值是从内存的其他部分、其他数组的位等随机分配的。当然它会失败,因为 $prodrow['ID'] 值未定义,因为整个结果集都被破坏了。

有人可以帮我解决这个问题吗?我难住了。

谢谢。

4

1 回答 1

1

不是错误,而是功能,请参阅:https ://bugs.php.net/bug.php?id=65945

这是 MSSQL (TDS)、DBLIB 和 FreeTDS 的行为。每个连接规则一个语句。如果您启动另一个语句,则前一个语句将被取消。

以前的版本将整个结果集缓冲在内存中,导致大型结果集出现 OOM 错误。

如果需要,可以使用 fetchAll() 和循环来复制以前的行为。另一种解决方法是打开 2 个连接对象,每个语句一个。

于 2016-10-05T16:25:26.743 回答