0

我正在使用 HTML5 创建一个基于 Web 的应用程序,它连接到一个 mySQL 数据库。我正在尝试使用 PHP 来连接两者。

我正在尝试创建一个登录页面,该页面检查数据库中的号码和密码,以查看它是否是有效的登录名。对数字和密码进行硬编码可以正常工作,但是在尝试将其应用于数据库时,即使登录凭据无效,我总是会收到“登录”消息。我尝试同时使用 $_POST 和 $dbRow 但无济于事。

<?php

session_start();

$s_number = $_POST["snumber"];
$s_pass = $_POST["passwd"];

//$s_number = "12345";
//$s_pass = "qwerty";
//$s_permission = "manager";

include ("dbConnect.php");

$dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
$dbResult = mysql_query($dbQuery);
$dbRow=mysql_fetch_array($dbResult);

if ($_POST["snumber"]==$s_number) {
    if ($_POST["passwd"]==$s_pass) {
        echo "<p>Logged in!</p>";
    } else {
        echo "<p>Wrong Password</p>";
    }
}

else echo "<p>Bad username and password</p>";

/*if ($dbRow["username"]==$s_number) {       
     if ($dbRow["password"]==$s_pass) {
        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  } else {
        echo "<p>Bad username and password</p>";
  }*/

?>

我对 PHP 很陌生。我已经搜索了其他示例,但似乎有很多不同的方法可以做到这一点,我不明白。任何帮助将非常感激!

4

3 回答 3

0

试试这个:

<?php


include ("dbConnect.php");

if(isset($_POST["snumber"]))
{
  $s_number = mysql_real_escape_string($_POST["snumber"]);
  $s_pass = mysql_real_escape_string($_POST["passwd"]);
  $dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
  $dbResult = mysql_query($dbQuery);
  $dbRow=mysql_fetch_assoc($dbResult);

  if ($dbRow["staff_number"]==$s_number && $dbRow["password"]==$s_pass) {       

        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  }
   else {
        echo "<p>Bad username and password</p>";
  }



?>

PS:去 mysqli 或 PDO ;) ; 您可以尝试计数或 mysql_num_rows 来查看匹配结果是否为零。

萨卢多斯。

于 2013-03-29T21:53:31.583 回答
0

阿德里安和罗伯特已经解决了部分问题。

如果您只是在学习 PHP,那么您更有理由开始编写代码以使用 mysqli API 而不是已弃用的 mysql_ 函数。它们几乎相同——但后者将在未来的某个时候消失。

如果您正在编写登录页面,那么您可能会担心安全性 - 但是如果没有正确转义您的代码,绕过控制机制是微不足道的(并且在某些情况下会使您的数据库暴露于严重的破坏/泄露问题)。

此外,即使通过修复 SQL 注入问题,使用会话固定也很容易通过身份验证。

下一个错误是您从不检查与数据库的交互是否成功。

因此,这看起来像是这个问题的重复- 尽管由于该帖子的答案/讨论质量差,我没有将其标记为这样。

此外,既然您只从数据库中选择了与用户名/密码匹配的行,为什么还要将用户名和密码与您检索的数据进行比较?

它通常被认为是良好的安全实践,不解释为什么在某些提供身份验证详细信息时登录失败。

所以再试一次......

<?php

session_start();
include ("dbConnect.php");

function auth($user, $pass)
{
   $user=mysqli_real_escape_string($user);
   $pass=mysqli_real_escape_string($pass);
   $qry="SELECT SUM(1) AS matches 
 FROM YOURDB.staff_details 
 WHERE staff_number='$user' 
 AND password='$pass'";
   $res=mysqli_query($qry) || die "Sorry - not available";
   $r=mysql_fetch_assoc($res);
   return $r['matches'];
}
if (auth($_POST["snumber"], $_POST["passwd"])) {
      session_regenerate_id();
      echo "<p>Logged in!</p>";
} else {
      echo "<p>Sorry - invalid authentication</p>";
}
于 2013-03-29T22:15:26.910 回答
-1

您需要使用 $dbRow 而不是 $_POST。目前您只是将 $_POST 与 $_POST 进行比较。

它总是一样的。

其次,您在查询和数组键中指定了不同的字段名称。

试试这个。

<?php

session_start();

$s_number = $_POST["snumber"];
$s_pass = $_POST["passwd"];

//$s_number = "12345";
//$s_pass = "qwerty";
//$s_permission = "manager";

include ("dbConnect.php");

$dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
$dbResult = mysql_query($dbQuery);
$dbRow=mysql_fetch_array($dbResult);

if ($_POST["snumber"]==$dbRow['staff_number']) {
    if ($_POST["passwd"]==$dbRow['password']) {
        echo "<p>Logged in!</p>";
    } else {
        echo "<p>Wrong Password</p>";
    }
}

else echo "<p>Bad username and password</p>";

/*if ($dbRow["username"]==$s_number) {       
     if ($dbRow["password"]==$s_pass) {
        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  } else {
        echo "<p>Bad username and password</p>";
  }*/

?>

编辑:虽然你真的不需要在之后执行 If 语句。如果您从数据库查询中获得用户名/密码匹配的结果,则凭据是正确的。

所以你可以这样做,

 if (!empty($dbRow)){
            echo "<p>Logged in!</p>";
        } else {
            echo "<p>Wrong Password</p>";
        }
    }
于 2013-03-29T21:45:13.700 回答