1

PHP 5.4.4 (Linux) で PDO DBLIB を使用して 3 つの SQL Server 2000 ストアド プロシージャを次々に呼び出そうとすると、2 番目のクエリでエラーが発生します。物体

最初のクエリは完全に機能し、期待どおりの結果が返されます。クエリの順序を移動すると、最初のクエリが成功し、他のクエリが失敗するたびに。

また、まったく同じコードを 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']

queryまた、 SELECT (SELECT 1、SELECT 3、SELECT 3 など)で呼び出すと、同じ結果が得られます (最初の結果が返され、その後は空になります)。

EDIT 2:コメントでCapiléが気づいたように、PHPのバグに関連しているようです

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すると、予想よりも 1 レベル深くなることに注意してください。

于 2012-07-11T20:41:28.217 に答える