我正在使用PDO连接到SQL Server 2005数据库,并且在使用PHP运行某些类型的查询时没有获得输出,但是当直接在SQL Server Management Studio中运行查询时,我会这样做。
当我运行这个时:
$conn = new PDO(...);
$statement = $conn->prepare("
DECLARE @testvar VARCHAR(10)
SELECT 'hello world'
");
$result = $statement->execute();
echo $result ? "Success" : "Failure";
echo "<br>";
print_r($conn->errorInfo());
echo "<br>";
die(print_r($statement->fetchAll()));
我得到输出。
Success
Array ( [0] => 00000 [1] => 0 [2] => (null) [0] (severity 0) [] [3] => 0 [4] => 0 )
Array ( [0] => Array ( [] => hello world ) ) 1
但是,如果我更改查询以将@testvar
设置为某些内容,请内联:
DECLARE @testvar VARCHAR(10) = 'test'
SELECT 'hello world'
或者使用 SET:
DECLARE @testvar VARCHAR(10)
SET @testvar = 'test'
SELECT 'hello world'
运行$statement->fetchAll()
时不再"hello world"
,似乎没有错误:
Success
Array ( [0] => 00000 [1] => 0 [2] => (null) [0] (severity 0) [] [3] => 0 [4] => 0 )
Array ( ) 1
当我直接在SQL Server Management Studio中尝试上述所有三个查询时,所有三个查询都可以正常工作并正确返回"hello world"
。
想
通了。使用 SET
(与DECLARE
内联或作为显式SET
)会导致结果现在在 PDO 术语中具有多个行集。我要查找的"hello world"
字符串不在第一行集中。
取而代之的是:
die(print_r($statement->fetchAll()));
循环访问所有行集:
do {
print_r($statement->fetchAll());
echo "<br>";
}
while ($statement->nextRowset());
现在结果如下所示:
Array ( ) // rowset 1
Array ( [0] => Array ( [] => hello world ) ) // rowset 2