首页 文章

PHP,使用PDO和嵌套查询,结果已损坏

提问于
浏览
3

我正在使用PDO对抗MSSQL,并且需要运行嵌套查询 . 它们都是准备好的陈述 . 如果我尝试使用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']值未定义而失败,因为整个结果集被破坏了 .

有人可以帮我解决这个问题吗?我很难过 .

谢谢 .

1 回答

  • 1

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

    这是MSSQL(TDS),DBLIB和FreeTDS的行为 . 每个连接规则一个语句 . 如果您启动另一个语句,则会取消先前的语句 . 以前的版本将整个结果集缓存在内存中,导致大型结果集上的OOM错误 . 如果需要,可以使用fetchAll()和循环复制先前的行为 . 另一种解决方法是打开2个连接对象,每个语句一个 .

相关问题