【问题标题】:Returning count from database从数据库返回计数
【发布时间】:2011-04-15 18:45:26
【问题描述】:

我的以下脚本无法正常工作:

$DBH = new PDO( "mysql:host=localhost;dbname=database_name", "user", "pass" );
$DBH -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$STH = $DBH -> prepare( "select count( users_id ) from table1 where username = :username" );

$STH -> bindParam( ':username', $_POST['username'], PDO::PARAM_STR, 100 );

$STH -> execute();

$strCount = $STH -> rowCount();

if( $strCount == 1 ) {
    echo $strCount;
    echo "user has already registered, do nothing";
} elseif ( $strCount == 0 ) {
    echo $strCount;
    echo "user has not registered, insert into db";
} else {
    echo $strCount;
    echo "something is wrong, should only ever be 0 or 1";
}

$strCount 似乎总是返回 1

在 table1 中,我只有 1 行的用户名是 username1。如果发布的值为 username1,那么我希望 $strCount 为 1,但由于某种原因,如果发布的值为 username2,我仍然得到 $strCount 为 1。

有人知道我做错了什么吗?

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

你在数两次!计数()和行计数()。 PDOStatement::rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。

尝试定期获取

$count = $db->query("select count(*) from table")->fetch(); 

【讨论】:

  • 如果我去掉 sql 中的计数怎么办。这也能解决问题吗?
  • 在任何一个地方都能享受到计数的乐趣。但我建议在 PDO 阶段摆脱它。当您在 SQl 中进行计数时,它只返回计数,从而节省 CPU、网络带宽并保持整体清洁。而在另一种情况下,它必须返回行数,然后查看计数(受影响)
【解决方案2】:

您正在查询中执行 COUNT(),这意味着您只会返回一行,其中包含一个字段,其中包含记录的计数。

您必须检索该行和字段,然后根据该值做出决定。

【讨论】:

  • 如果我去掉 sql 中的计数怎么办。这也能解决问题吗?
  • 不,那么您将强制数据库检索所有匹配的行,然后将它们丢弃。由于您只需要行数,因此基于查询的 COUNT() 函数效率更高。
【解决方案3】:

count(blah) 将返回包含计数值的单行。我认为您需要在执行并从那里读取值之后调用 fetch(..),而不是调用 rowCount()。这是基于 PHP 文档的。

http://www.php.net/manual/en/pdostatement.fetch.php

我不是 PHP 开发人员,所以我不想给你糟糕的代码。

【讨论】:

  • 这正是我以为我在做的事情,但整体代码不起作用。
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 2021-11-22
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多