Php MySql Select count与准备好的语句返回始终为1

Php MySql Select count与准备好的语句返回始终为1,php,mysql,sql,Php,Mysql,Sql,我正在使用此方法获取并创建登录Web服务: 问题是$gNumb始终返回1,即使sql表不包含用户名和密码。知道问题出在哪里吗?您忘了获取结果: ... $stmt->bind_param('ss', $user, $pass); if ($stmt->execute()) { $stmt->bind_result($gNumb); $stmt->fetch(); } else { $gNumb = 0; } ... 你为什么认

我正在使用此方法获取并创建登录Web服务:


问题是$gNumb始终返回1,即使sql表不包含用户名和密码。知道问题出在哪里吗?

您忘了获取结果:

...
 $stmt->bind_param('ss', $user, $pass);
 if ($stmt->execute()) {
      $stmt->bind_result($gNumb);
      $stmt->fetch();
 } else {
      $gNumb = 0;
 }
...

你为什么认为这是个问题?如果查询成功,gNumb为TRUE;如果有错误,gNumb为FALSE。计数0不是错误。您需要使用fetch获取包含该计数的行。您不应该存储纯文本密码-了解$result的用途吗?你分配它,但从不使用它。就像@NigelRen说的,最好是使用密码\u散列和密码\u验证,它还可以防止定时攻击。。运行用户名=?密码=?在SQL中,如果密码列也在B树索引中,则SQL可能容易受到定时攻击,因为该算法的时间复杂度几乎是线性的,我认为它可能容易受到定时攻击。。所以我做了一些改变密码散列长度的测试,我注意到散列越像密码散列,MySQL需要更长的时间来执行大部分非运行,所以我认为我的陈述可能是正确的。
...
 $stmt->bind_param('ss', $user, $pass);
 if ($stmt->execute()) {
      $stmt->bind_result($gNumb);
      $stmt->fetch();
 } else {
      $gNumb = 0;
 }
...