我需要根据等于登录用户名的行从数据库中的列进行计数
$this->setParams('username', $users->getInfo($_SESSION['user']['id'], 'username'));
我需要它来计算用户名在该表中重复的次数。
<?php echo number_format(mysql_num_rows(mysql_query("SELECT from login_logs WHERE username = '".$_SESSION['user']['id'] ."username"))); ?>
即使我在数据库中看到 4 个值,它也显示为 0。
如何获得正确的计数?
最佳答案
首先,就像每个看到 mysql_query
的人所说的那样,使用 PDO。然而,出于学习的目的,mysql_query
很好,但在生产服务器上完全 Not Acceptable 。主要是因为 mysql_query
非常不安全。它很容易出现诸如 SQL 注入(inject)之类的问题,这些问题可能会真正搞乱服务器,甚至给黑客提供访问权限。一旦您熟悉了 PHP 和 MySQL,请阅读有关 sql 注入(inject)和保护代码的内容。
回到真正的问题,您没有看到任何内容,因为您的选择查询完全不正常。 让我们来分解一下。我只是缩进了您的查询,以便我们可以详细讨论它。
SELECT
from login_logs
WHERE username = '".$_SESSION['user']['id'] ."username"
此查询存在几个问题。
- 您没有定义要选择的内容。
SELECT *
将返回每一列。但是,如果您只是进行计数而不关心检索数据,则可以使用索引列,例如 id 字段SELECT id
。这提高了性能。也许你以后想读一些东西。 - 通过向其附加
"username"
,您的 where 条件几乎变得毫无用处。假设我是登录用户。我的用户名是khuderm
,因此$_SESSION['user']['id']
将返回khuderm
。因此,如果您用我的用户名替换该变量,它就会变成WHERE username = 'khudermusername
,而它应该只是寻找khuderm
。因此删除它可以部分解决问题。此外,您还缺少围绕用户名值的结束引号。因此,您不应将文字"username"
附加到实际登录用户的用户名中,而应该附加"'"
来结束开头的引用WHERE 用户名 = '"
如果您能按照这些步骤操作,您应该能够解决您的问题。在 PHP 中调试 MySQL 查询的一个简单方法是回显它以获得带有变量和填充的最终查询。因此,在代码中的任何位置,回显 "SELECT from login_logs WHERE username = '".$_SESSION['user ']['id'] ."username"
将准确显示发送到数据库进行查询的内容。一旦你有了这个,在 phpmyadmin 或工作台或任何你用来查看数据库的东西中运行 echo 的结果,它应该告诉你查询出了什么问题。
不要忘记阅读 SQL 注入(inject)、PDO 和准备好的语句。希望这是一次富有洞察力和快乐的编码!
关于php - 需要根据登录的用户名计算列中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40795730/