1

我尝试在 PHP 5.4.4 (Linux) 中使用 PDO DBLIB 一个接一个地调用 3 个 SQL Server 2000 存储过程,并且在第二个查询中出现错误:致命错误:调用非成员函数 fetchAll()目的

第一个查询完美运行,按预期返回结果。如果我移动查询顺序,每次第一个查询成功而其他查询失败。

此外,当完全相同的代码在 PHP 5.3.14 服务器上运行时,一切正常。

示例代码:

$dbh = new PDO ("dblib:host=myhost;dbname=mydb","user","pass");

$query = $dbh->query("EXEC dbo.storedProc1 'param1'");
$result = $query->fetchAll();
var_dump($result);

$query = $dbh->query("EXEC dbo.storedProc2 'param1'");
$result = $query->fetchAll(); // <-- Fails here
var_dump($result);

$query = $dbh->query("EXEC dbo.storedProc3 'param1'");
$result = $query->fetchAll();
var_dump($result);

有什么线索可以让这段代码在 PHP 5.4 上运行吗?

编辑: PDO::errorInfo 给了我这个错误:Attempt to initiate a new Adaptive Server operation with results pending [20019] (severity 7) [EXEC dbo.storedProc2 'param1']

此外,使用 SELECT 调用query(例如 SELECT 1、SELECT 3 和 SELECT 3)给出相同的结果(给出第一个结果,以下为空)

编辑 2:看起来它与PHP 错误有关,正如 Capilé 在评论中注意到的那样

4

1 回答 1

2

我将竭尽全力说您的存储过程返回的结果集不止一个。要么,要么 SQL Server 2000 死心塌地地坚持在下一个查询为空时关闭游标。无论哪种方式,这应该可以解决问题:

$dbh = new PDO ("dblib:host=myhost;dbname=mydb","user","pass");

$results = array();
$query = $dbh->query("EXEC dbo.storedProc1 'param1'");
do {
  $results[] = $query->fetchAll();
} while ($query->nextRowset());
$query->closeCursor();
var_dump($results);

$results = array();
$query = $dbh->query("EXEC dbo.storedProc2 'param1'");
do {
  $results[] = $query->fetchAll();
} while ($query->nextRowset());
$query->closeCursor();
var_dump($results);

$results = array();
$query = $dbh->query("EXEC dbo.storedProc3 'param1'");
do {
  $results[] = $query->fetchAll();
} while ($query->nextRowset());
$query->closeCursor();
var_dump($result);

请注意,实际使用时$results它会比您预期的更深一层,因为它可以存储多个结果集,并且这些结果集将存储在单独的键中。

于 2012-07-11T20:41:28.217 回答