查询不返回结果

时间:2021-01-10 12:25:35

标签: php pdo

我将基于 Web 的应用程序从 MySQLi 转换为 PDO,因为我也想使用 Microsoft SQL-Server 作为数据库。 PDO 就像 MySQL 数据库的魅力一样。现在我第一次用 MS-SQL 尝试了它,但它没有。几乎每个查询都必须更新。这很令人沮丧。

下面的简单代码让我抓狂:

$ComputerGUID = "5BEC3779-B002-46BA-97C4-19158C13001F";

$SqlSelectQuery = "SELECT computermapping.PrinterGUID, 
                case when computerdefaultprinter.PrinterGUID IS NOT NULL then 1 else 0 end AS isDefaultPrinter
                FROM computermapping 
                LEFT JOIN computerdefaultprinter ON computerdefaultprinter.ComputerGUID = computermapping.ComputerGUID 
                AND computerdefaultprinter.PrinterGUID = computermapping.PrinterGUID
                WHERE computermapping.ComputerGUID = :ComputerGUID";
$SqlStatement  = $pdo->prepare( $SqlSelectQuery );
$SqlStatement -> bindValue( ":ComputerGUID", $ComputerGUID, PDO::PARAM_STR );
$SqlStatement->execute();

$SelectQueryNumRows = $SqlStatement->rowCount();
IF ( $SelectQueryNumRows > 0 ) {

    $Data = $SqlStatement->fetchAll(PDO::FETCH_ASSOC);

} ELSE {
    echo "The query did not return a result ...";
}

它在 MySQL 中运行良好并返回结果。

使用 Microsoft SQL-Server,它没有结果。 (查询没有返回结果...)

在 Microsoft SQL Server Management Studio 中运行相同的查询也工作正常:

Result in Microsoft SQL Server Management Studio

在使用 SQL Server Profiler 运行代码时监控查询显示如下:

Monitoring with Microsoft SQL Server Profiler

2 个答案:

答案 0 :(得分:2)

正如 the manual 提到的:

<块引用>

某些数据库可能返回该语句返回的行数。但是,这种行为不能保证适用于所有数据库,并且不应依赖便携式应用程序。

因此,您不应使用 rowCount。但是当您获取所有数据时 - 使用它:

$SqlStatement->execute();

$Data = $SqlStatement->fetchAll(PDO::FETCH_ASSOC);
// in case of no data - empty array will be returned

if ($Data) {
    // process $Data;
} else {
    echo "The query did not return a result ...";
}

另请注意,如果出现错误,$Data 可以是 false,如果需要,您应该处理此值 $Data

答案 1 :(得分:0)

对于大多数驱动程序,PDOStatement::rowCount() 不会返回受 SELECT 语句影响的行数。但是,如果您使用的是 SQL Server 的 PHP 驱动程序,如documentation 中所述,如果关联 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则 PDO::CURSOR_FWDONLY 游标返回 -1< /em> 和 PDO::CURSOR_SCROLLABLE 游标返回结果集中的行数

你需要像这样准备语句:

$SqlStatement  = $pdo->prepare(
   $SqlSelectQuery, 
   array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
);