Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查询不返回结果_Php_Pdo - Fatal编程技术网

Php 查询不返回结果

Php 查询不返回结果,php,pdo,Php,Pdo,我将一个基于web的应用程序从MySQLi转换为PDO,因为我也想使用microsoftsqlserver作为数据库。PDO在MySQL数据库中工作得非常出色。现在我第一次用MS-SQL尝试了它,但没有。几乎每个查询都必须更新。这是非常令人沮丧的 下面的简单代码让我发疯: $ComputerGUID = "5BEC3779-B002-46BA-97C4-19158C13001F"; $SqlSelectQuery = "SELECT computermapping

我将一个基于web的应用程序从MySQLi转换为PDO,因为我也想使用microsoftsqlserver作为数据库。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中运行相同的查询也可以正常工作:

使用SQL Server Profiler运行代码时监视查询显示以下内容:


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

您需要准备如下声明:

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

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

因此,您不应该使用
行计数
。但在获取所有数据时,请使用它:

$SqlStatement->execute();
$Data=$SqlStatement->fetchAll(PDO::FETCH_ASSOC);
//如果没有数据-将返回空数组
如果($数据){
//处理数据;
}否则{
echo“查询未返回结果…”;
}

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

的此值,请
var\u dump($Data)
打印($Data)您看到了什么?请按照说明“某些数据库可能返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为”是的,您是对的。当我删除带有行计数的IF块时,我可以访问数据。非常感谢。我没有意识到这一点。我在我的代码中广泛使用了row count子句,我将不得不做很多更改:-(@Walhalla,但是现在如果你想一想,如果你有数据本身,那么使用row count就没有意义了。工作量越少,代码就越兼容。@YourCommonSense:我们在这里找到了根本原因,我做了一些阅读。(例如)我的代码中的IF子句是过去的遗留,就像以前的
mysql_num_rows
一样。使用它似乎是第二次额外查询数据库以获取行数。非常糟糕。我将转换我的代码。我现在仔细查看了您的答案,并通过添加提到的“PDO::ATTR_CURSOR=>PDO::CURSOR_SCROLL”对其进行了测试。是否“rowCount()”现在可以工作了?如果我也将其用于MySQL,会发生什么?Thx@Walhalla如果您使用SQL Server的PHP驱动程序(pdo_sqlsrv),正如文档中提到的,答案是肯定的。我无法对MySQL数据库进行测试,但这提供了有关
pdo::rowCount()的其他解释
功能。。