2010-08-15 49 views
0

由于某种原因,$ password(从表单发送的那个)将变为空白。来自POST表单的PHP变量变为空白

我手动此与此代码检查:

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>"; 
} 

?> 
+0

但你无法从POST输入取'$ dbpassword',是吗? – 2010-08-15 10:24:49

+1

你能否填写表格,发送并显示'print_r($ _ POST)'? – barroco 2010-08-15 11:00:18

+0

EHWWWWEWEWEWEWEWEW SQL注入! http://bit.ly/everythingyouaredoingisbad – mattbasta 2010-08-15 11:04:38

回答

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用户其中username = $用户名”“;

这只是乞求一些SQL注入善良来颠覆你的系统。有很多关于什么是SQL注入的资源,以及如何解决它,所以我不会在这里重新提供。你滚了这一点之前,请修复(并认为,如果有人试图用' OR 1=1为自己的用户名登录,会发生什么

4:

while ($row = mysqli_fetch_assoc($result)) 

假设你的表是正确的建成,这里只有两种可能的结果,因为用户名不存在;或者一行代表用户的数据,没有必要做一个循环来获取所有匹配的用户名,当然,也许你允许多个“John Smith”帐户,并且如果John Smith#1的密码与John Smith#2的密码非常相似,并且两个人之一通过输入错误“猜测”了另一个的密码?现在,有一个人登录了另一个人的账户。

5:

而不是做一个die()如果有任何的不匹配,它被认为是礼貌的做法再次显示已提交,以便用户可以再次尝试形式。您的系统要求用户在可以再次尝试之前重新回到登录表单。您应该重构代码,以便在出现错误时显示该错误,并与登录表单一并显示。

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> 
0

在你的代码来看,我觉得有可能是您的格式问题和语法。学习在代码中使用空格。当你写这样的东西:$username&&$password PHP可能会使用&$password作为变量的参考,而不是$password的变量。因此,通过您的代码并添加空格:

if ($username && $password){ 

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

这可能会解决您的问题。