来自POST表单的PHP变量空白

时间:2010-08-15 10:19:24

标签: php variables login

由于某种原因,$ password(从表单发送的密码)显示为空白。

我使用以下代码手动检查:

echo "<p>$username does not match $firstandlast</p>";
echo "<p>$password does not match $dbpassword</p>";

这是我的代码......

            <?php
 if(isset ($_POST['submit'])) {
  $username = $_POST['name'];
  $password = $_POST['pw'];

  if ($username&&$password){

   require('includes/cxn.php');
   $login_query = "SELECT * FROM users WHERE username='$username'";
   $result = mysqli_query($cxn,$login_query) or die("Couldn't execute query.");
   $numrows = mysqli_num_rows($result);
   if($numrows!=0){

    while ($row = mysqli_fetch_assoc($result)) 
    {
     $firstandlast = $row['firstName'] . " " . $row['lastName']; 
     $dbpassword = $row['password'];
     $userID = $row['userid'];

     if ($username==$firstandlast&&$password==$dbpassword){
      echo "You are now logged in! <a href='profile.php?userID=" . $userID . "'>Click Here</a> to continue.";
      $_SESSION['username'] = $dbusername;
      $_SESSION['id'] = $userID;
     } 
     else {
      echo "<p>$username does not match $firstandlast</p>";
         echo "<p>$password does not match $dbpassword</p>";
         echo "Password does not exist.";
     }
    }
   } else {
    echo "This user doesn't exist.";
   }
  } else {
   die("You Must Enter both a username and password");
  }
} else {
 echo "
 <div id='login'>
 <form action='login.php' method='post' id='loginform'>
 <table>
   <tr>
  <td width='90'>Name:</td>
  <td width='825'><input type='text' name='name' /></td>
   </tr>
   <tr>
  <td>Password:</td>
  <td><input type='password' name='pw' /></td>
   </tr>
   <tr>
  <td>&nbsp;</td>
  <td><button type='submit' name='submit'>Sumbit</button></td>
   </tr>
 </table></form></div>";
}

?>

2 个答案:

答案 0 :(得分:3)

需要考虑的一些事项:

1

if(isset ($_POST['submit'])) {

仅当表单中的提交按钮具有name="submit"输入元素时才有效,但情况可能并非总是如此。您可能忘记将其添加到提交按钮中。更好的检查是:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

如果表单是POST,则无论提交了哪些字段或点击了按钮,都是如此。

2:

if ($username&&$password){

可以更好地重写为:

if(!empty($username) && !empty($password)) {

最好明确说明你希望它们是非空的,以便日后其他人更容易理解。

3:

$ login_query =“SELECT * FROM users WHERE username ='$ username'”;

这只是要求一些SQL注入优点来破坏你的系统。关于SQL注入是什么以及如何解决它有很多资源,所以我不会在这里重复它。请在解决之前进行修复(并考虑如果有人尝试使用' OR 1=1作为用户名登录时会发生什么。

4:

while ($row = mysqli_fetch_assoc($result)) 

假设您的表格构建正确,查询中只有两个可能的结果。没什么,因为用户名不存在;或一行,表示该用户的数据。没有必要循环来获取所有匹配的用户名。当然,也许您允许多个“John Smith”帐户,并通过他们的密码识别它们,但这是相当不安全的。如果约翰史密斯#1的密码与约翰史密斯#2的密码非常相似,并且两个“猜测”其中一个通过输入错误怎么办?现在你有一个人登录到另一个人的帐户。

5:

如果有任何不匹配的内容,而不是die(),则重新显示已提交的表单以便用户可以重试,这被认为是礼貌的做法。您的系统要求用户点击后退以返回登录表单,然后才能再次尝试。您应该重新构建代码,以便在出现错误时显示该错误,并使用登录表单ALONG。

6:

echo "
<div id='login'>
....
</table></form></div>";

生成这样的长文本字符串很痛苦,特别是如果你必须在其中使用引号。请改用HEREDOC,专门用于构建多行字符串。作为奖励,它的作用类似于双引号字符串,因此您可以在构建字符串时将变量插入到字符串中:

echo <<<EOL
<div id="login">
....
</table></form></div>
EOF

7:

不是显示“您现在已登录”,而是显示配置文件页面的链接,为什么不自动将用户重定向到个人资料页面?

所以,毕竟,你的脚本看起来像这样:

<?php

$error = NULL;

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = $_POST['name'];
    $password = $_POST['pw'];

    if (!empty($username) && !empty($password) {
        $qusername = mysql_real_escape_string($username);
        $qpassword = mysql_real_escape_string($password);

        $query = <<<EOL
SELECT *
FROM users
WHERE (username = $qusername) AND (password = $qpassword)
EOL;
        $stmt = mysql_query($query);
        if (mysql_num_rows($stmt) == 1) {
             // store user details in session here
             redirect("profile.php?userID=$id");
        } else {
             $error = "Invalid username or password";
        }
    } else {
        $error = "Must specify both username and password";
    }
}

?>
<html>

<body>

<?php if (!empty($error)) { ?>
<h3><?php echo $error ?></h3>
<? } ?>

<form ...>
<table ...>
<tr>
   <td><input type="text" name="name" value="<?php echo htmlspecialchars($name) ?>" /></td>
</tr>
<tr>
   <td><input type="password" name="pw" /></td>
</tr>
<table>
<input type="submit" value="Login" />

</form>

答案 1 :(得分:0)

查看代码,我认为您的格式和语法可能存在问题。学习在代码中使用空格。当您编写类似的内容时:$username&&$password PHP可能正在使用&$password作为变量的引用,而不是$password变量。所以仔细检查代码并添加空格:

if ($username && $password){

if ($username == $firstandlast && $password == $dbpassword){

这可能会解决您的问题。