我刚刚更改了数据库连接。我还不习惯PDO类或OOP。无论如何,我这样连接到数据库:
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;
try
{
$this->db = new PDO($dsn, DB_USER, DB_PASS);
}
catch ( Exception $e )
{
die ( $e->getMessage() );
}
我正在尝试从此查询中获取行数:
$ip = $this->ip();
$sql = "SELECT `id` FROM `login_failed`
WHERE `ip` = :ip AND `time` BETWEEN NOW( ) - INTERVAL 120 MINUTE AND NOW( )
LIMIT 3";
try
{
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':ip', $ip, PDO::PARAM_STR);
$result = $stmt->execute(); // $result = true
$n = $stmt->num_rows ; // n = NULL?
$stmt->closeCursor();
}
catch (Exception $e)
{
die ($e->getMessage() );
}
在phpmyadmin
我收到了一个结果,因此我的查询是正确的,但由于某种原因,$n
为NULL
..如何获得PDO
<的行数/ p>
答案 0 :(得分:12)
$stmt
的类型为PDOStatement
。该类没有num_rows
属性。
您可能正在寻找rowCount
,但该文档的文档说明:
如果执行的最后一条SQL语句 相关的PDOStatement是一个 SELECT语句,有些数据库可能 返回返回的行数 那句话。但是,这个 所有人都无法保证行为 数据库,不应该依赖 用于便携式应用。
如果你想要实际SELECT
所有数据,那么长和短,你可以通过迭代结果集来可靠地确定返回的行数(或者只是调用{{3}并计算数组中的项目)。如果您不需要数据而只需要数字,请改用SELECT COUNT
。
因此,要在不更改查询的情况下计算行数:
$result = $stmt->execute();
$rows = $stmt->fetchAll(); // assuming $result == true
$n = count($rows);