Php PDO rowCount()适用于MySQL,但不适用于SQL Server 2008 R2

Php PDO rowCount()适用于MySQL,但不适用于SQL Server 2008 R2,php,mysql,pdo,sql-server-2008-r2,rowcount,Php,Mysql,Pdo,Sql Server 2008 R2,Rowcount,当我在SQLServer2008中获得行数时,我遇到了一个问题,因为我的代码在使用MySQL时运行良好,但在SQLServer中则不行 $sql = "SELECT TOP 1 U.Id , U.Name, U.Profile, P.Name NameProfile FROM sa_users U INNER JOIN sa_profiles P ON P.Id = U.Profile WHERE User = :user AND Pass =

当我在SQLServer2008中获得行数时,我遇到了一个问题,因为我的代码在使用MySQL时运行良好,但在SQLServer中则不行

$sql = "SELECT TOP 1 U.Id , U.Name, U.Profile,  P.Name NameProfile
        FROM sa_users U
        INNER JOIN sa_profiles P ON P.Id = U.Profile
        WHERE User = :user  AND Pass = :pass";

$result = $this->dbConnect->prepare($sql) or die ($sql);
$result->bindParam(':user',$this->data['username'],PDO::PARAM_STR);
$result->bindParam(':pass',$this->data['password'],PDO::PARAM_STR);

if (!$result->execute()) {
    return false;
}

$numrows = $result->rowCount();
$jsonLogin = array();

var_dump($numrows);

if($numrows > 0) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        $jsonLogin = array( 
            'name' => $row['Name'],
            'id' => $row['Id'],
            'profile' => $row['Profile'],
            'n_profile' => $row['NameProfile']
        );
    }

    $jsonLogin['area'] = 'another';
    return $jsonLogin;
} else {
    return false;
}
MySQL和SQL Server中的var\u dump($result->fetch())

array(8) {
["Id"]=>
string(1) "1"
[0]=>
string(1) "1"
["Nombre"]=>
string(13) "Administrador"
[1]=>
string(13) "Administrador"
["Perfil"]=>
string(1) "1"
[2]=>
string(1) "1"
["NomPerfil"]=>
string(13) "Administrador"
[3]=>
string(13) "Administrador"
}
int(-1)
SQL Server中的变量转储($numrows)

array(8) {
["Id"]=>
string(1) "1"
[0]=>
string(1) "1"
["Nombre"]=>
string(13) "Administrador"
[1]=>
string(13) "Administrador"
["Perfil"]=>
string(1) "1"
[2]=>
string(1) "1"
["NomPerfil"]=>
string(13) "Administrador"
[3]=>
string(13) "Administrador"
}
int(-1)
var\u dump($numrows)在MySQL中

int(1)
问候。

仅引用以下内容:

如果关联的PDO语句执行的最后一条SQL语句为 对于SELECT语句,某些数据库可能返回行数 由该声明返回。但是,不能保证这种行为 对于所有数据库,不应依赖进行便携 应用程序

仅引用以下内容:

如果关联的PDO语句执行的最后一条SQL语句为 对于SELECT语句,某些数据库可能返回行数 由该声明返回。但是,不能保证这种行为 对于所有数据库,不应依赖进行便携 应用程序


我知道这是一个有点旧的线程,但今天早上我遇到了类似的问题,实际上有一种方法可以让
rowcount()
函数与SQL server一起工作

我使用如下连接字符串(连接到SQL server数据库):

当我想使用需要知道返回行数的查询时(使用SQL server),我使用
PDO::ATTR_CURSOR=>PDO::CURSOR_SCROLL
作为PDO prepare函数的第二个参数,如下所示:

$rs = $connection->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
以下是来自Microsoft网站的示例:

分享一个好的解决方案永远不会太迟


来自蒙特利尔的Jonathan Parent-Lévesque

我知道这是一个有点旧的思路,但今天早上我遇到了类似的问题,实际上有一种方法可以让
rowcount()
函数与SQL server一起工作

我使用如下连接字符串(连接到SQL server数据库):

当我想使用需要知道返回行数的查询时(使用SQL server),我使用
PDO::ATTR_CURSOR=>PDO::CURSOR_SCROLL
作为PDO prepare函数的第二个参数,如下所示:

$rs = $connection->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
以下是来自Microsoft网站的示例:

分享一个好的解决方案永远不会太迟


来自蒙特利尔的Jonathan Parent-Lévesque

您实际上并不需要此函数。以及大多数其他代码

$result = $this->dbConnect->prepare($sql);
$result->bindParam(':user',$this->data['username']);
$result->bindParam(':pass',$this->data['password']);
$result->execute();
$jsonLogin = $result->fetch(PDO::FETCH_ASSOC));
if ($jsonLogin) {
    $jsonLogin['area'] = 'another';
   return json_encode($jsonLogin);
}

是您需要的全部代码。

您实际上不需要此函数。以及大多数其他代码

$result = $this->dbConnect->prepare($sql);
$result->bindParam(':user',$this->data['username']);
$result->bindParam(':pass',$this->data['password']);
$result->execute();
$jsonLogin = $result->fetch(PDO::FETCH_ASSOC));
if ($jsonLogin) {
    $jsonLogin['area'] = 'another';
   return json_encode($jsonLogin);
}

是您需要的全部代码。

并非所有数据库都返回查询元数据中的行数。mysql恰好是其中之一,mssql不是。我不知道。。您知道获取查询总行数的另一种方法吗?我尝试使用$r=$result->fetchColumn()$numrows=计数($r);但是在while($row=$r)或while($row=$result->fetch())中无法识别索引。可能唯一实用的方法是分别执行
select count(*)
。但是,如果您要以任何方式获取所有数据(而且它不是一个惊人的庞大数据集),那么请将数据提取到数组中,然后对行进行计数。但是使用select count(*)需要对数据库执行两个查询,一个用于比较,另一个用于获取数据。。。如果不存在其他方式,我需要这样做。并非所有数据库都返回查询元数据中的行数。mysql恰好是其中之一,mssql不是。我不知道。。您知道获取查询总行数的另一种方法吗?我尝试使用$r=$result->fetchColumn()$numrows=计数($r);但是在while($row=$r)或while($row=$result->fetch())中无法识别索引。可能唯一实用的方法是分别执行
select count(*)
。但是,如果您要以任何方式获取所有数据(而且它不是一个惊人的庞大数据集),那么请将数据提取到数组中,然后对行进行计数。但是使用select count(*)需要对数据库执行两个查询,一个用于比较,另一个用于获取数据。。。如果没有其他方式,我需要这样做。我不知道。。您知道获取查询总行数的另一种方法吗?我尝试使用$r=$result->fetchColumn()$numrows=计数($r);但是在while($row=$r)或while($row=$result->fetch())中,不识别索引。除了进行单独的
select count(*)
之外,将获取所有行(使用
fetchAll()
方法)和计数结果数组,或者简单地定义rowcount变量并在每次
fetch()
之后递增它。若要使用
fetch
获取索引/关联数组,请使用它的一个fetch样式作为第一个参数。但若要使用select count()获取行,我需要重复相同的代码,不同的是count()语句,对吗?是的,但使用单独的查询来检查预期行数是很正常的。我不知道这一点。。您知道获取查询总行数的另一种方法吗?我尝试使用$r=$result->fetchColumn()$numrows=计数($r);但是在while($row=$r)或while($row=$result->fetch())中,不识别索引。除了进行单独的
select count(*)
之外,将获取所有行(使用
fetchAll()
方法)和计数结果数组,或者简单地定义rowcount变量并在每次
fetch()
之后递增它。若要使用
fetch
获取索引/关联数组,请使用它的一个fetch样式作为第一个参数。但若要使用select count()获取行,我需要重复相同的代码,不同的是count()语句,对吗?是的,但使用单独的查询仅检查预期行数是很正常的