【问题标题】:PDO rowCount() works on MySQL but not in SQL Server 2008 R2PDO rowCount() 适用于 MySQL,但不适用于 SQL Server 2008 R2
【发布时间】:2013-05-13 21:30:29
【问题描述】:

当我在 SQL Server 2008 中获取行数时遇到问题,因为我的代码在使用 MySQL 但在 SQL Server 中无法正常工作。

$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;
}

var_dump($result->fetch()) 在 MySQL 和 SQL Server 中

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"
}

var_dump($numrows) 在 SQL Server 中

int(-1)

var_dump($numrows) 在 MySQL 中

int(1)

问候。

【问题讨论】:

  • 并非所有数据库都返回查询元数据中的行数。 mysql恰好是其中之一,mssql不是。
  • 我不知道.. 你知道另一种获取查询总行数的方法吗?我尝试使用 $r = $result->fetchColumn(); $numrows = 计数($r);但在 while($row = $r) 或 while($row = $result->fetch()) 中不识别索引。
  • 可能唯一实用的方法是单独做一个select count(*)。但是,如果您无论如何都要获取所有数据(并且它不是一个非常庞大的数据集),那么请获取一个数组并在之后计算行数。
  • 但是使用 select count(*) 需要对数据库执行两个查询,一个用于比较,另一个用于获取数据...如果不存在其他方式,我需要这样做。

标签: php mysql pdo sql-server-2008-r2 rowcount


【解决方案1】:

我知道这是一个老话题,但今天早上我有类似的问题,实际上rowcount() 函数可以与 SQL 服务器一起使用。

我正在使用这样的连接字符串(连接到 SQL 服务器数据库):

$connection = new PDO("sqlsrv:Server=" . $this->sourceServer . ";Database=" . $this->sourceDB, $this->sourceUser, $this->sourcePW);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

$rs = $connection->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

这是来自 Microsoft 网站的示例:https://msdn.microsoft.com/en-us/library/ff628154(v=sql.105).aspx

嗯,分享一个好的解决方案永远不会太晚,

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

【讨论】:

    【解决方案2】:

    只需引用manual

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

    【讨论】:

    • 我不知道......你知道另一种获取查询总行数的方法吗?我尝试使用 $r = $result->fetchColumn(); $numrows = 计数($r);但在 while($row = $r) 或 while($row = $result->fetch()) 中不识别索引。
    • 除了单独创建select count(*) 之外,还可以获取所有行(使用fetchAll() 方法)并计算结果数组,或者只是定义rowcount 变量并在每个fetch() 之后递增它。要使用fetch 获取索引/关联数组,请使用其中一个获取样式作为第一个参数。
    • 但是要使用 select count() 获取行,我需要重复相同的代码,不同的是 count() 语句对吗?
    • 是的,但是单独查询只检查预期行数是很正常的
    【解决方案3】:

    您实际上并不需要此功能。以及大部分其他代码

    $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);
    }
    

    就是你需要的所有代码。

    【讨论】:

      【解决方案4】:

      只需在 $stmt->execute();

      之后添加 $result = $stmt->fetchAll();
      $stmt = $db->prepare($query);
      $stmt->execute();
      $result = $stmt->fetchAll();
      $numrows = $stmt->rowCount();
      

      【讨论】:

        猜你喜欢
        • 2017-03-04
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多