我遇到了一个奇怪的问题,这个问题一直困扰着我。
我有以下代码:
$today = date("m/d/Y");
$sql = "SELECT * FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date";
$ps = $pdo->prepare($sql);
if (!$ps) {
echo "PDO::errorInfo():";
print_r($pdo->errorInfo());
}else{
$ps->execute();
$number_of_rows = $ps->rowCount();
当我显示$number_of_rows的值时,它总是显示-1,即使我得到结果也是如此。
其他人有这个问题吗?
哦,我使用的数据库不是MySQL,而是可爱的MS Access。我怀疑这可能是问题所在。
rowCount()
方法不返回SELECT
语句中的行数。这是常见的错误。
PDOStatement::rowCount()返回受对应的执行的最后一个DELETE、INSERT或UPDATE语句PDOStatement对象。如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,某些数据库可能会返回行数由该声明返回。但是,不能保证这种行为适用于所有数据库,不应依赖于可移植应用程序。
您可以在文档中找到更多详细信息。
因此,要获得行数,必须使用sqlCOUNT(*)
函数编写SELECT
语句。在您的情况下:
$sql = "SELECT COUNT(*) AS `count` FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date";
或使用PHP:
$number_of_rows = count($ps->fetchAll());
您还应该学习以正确的方式准备查询
您应该使用iterator_count
来计算行数,即
$number_of_rows = iterator_count($ps);