我尝试在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(例如SELECT 1,SELECT 3和SELECT 3)调用query
会得到相同的结果(给出第一个结果,后面是空的)
编辑2:看起来它与a PHP bug有关,正如Capilé在评论中所注意到的那样
答案 0 :(得分: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
时,它会比您预期的更深一级,因为它可以存储多个结果集,并且这些结果集将存储在单独的键中。