使用PHP如何将登录表单错误返回到同一页面?

5
我很新于PHP,尝试在互联网上找到了答案,但最终失败。我已经查看了无数的示例,但人们似乎都有不同于我系统的登录方式,这让我很难理解。

以下是我目前的代码:

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Video for Education Log In</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>



<body>
<div id="wrapper">
<div id="header">
    <div id="logo">
        videoedu.edu    </div>
    <div id="menu">
        <ul>
            <li><a href="account.html" class="menua">Create Account</a></li>
            <li><a href="about.html" class="menua">About Us</a></li>
        </ul>
    </div>
</div>
<br><br><br><br>
<div id="page">

<div id="content">
    <h2>Video for Education helps you connect and share with the videos in your life.</h2>
    <h3>Upload Share Create Using video for your education purposes. Lecturers Welcome
    Upload Share Create Using video for your education purposes. Lecturers Welcome
    Upload Share Create Using video for your education purposes. Lecturers Welcome</h3>
    <div class= "form">
    <form name="login" method="post" action="checklogin.php">
        Username: <input type="text" name="myusername" id="myusername" class="textb"/><br />
        Password  :  <input type="password" name="mypassword" id="mypassword" class="textb"/><br />
        <br>
        <input type="submit" name="login" value="Login" id="login" class="texta" />
    </form>
    </div>
</div>
</div>
</div>
</body>
</html>

checklogin.php

<?php

$host = "localhost";
$username = "root";
$password = "";
$db_name = "test";
$tbl_name = "members";

mysql_connect("$host", "$username", "$password")or die("Cannot connect.");
mysql_select_db("$db_name")or die("Cannot select DB.");

$myusername=$_POST["myusername"];
$mypassword=$_POST["mypassword"];


    if ($myusername&&$mypassword)
    {

    $myusername = stripslashes($myusername);
    $mypassword = stripslashes($mypassword);
    $myusername = mysql_real_escape_string($myusername);
    $mypassword = mysql_real_escape_string($mypassword);

    $sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
    $result = mysql_query($sql);

    $count = mysql_num_rows($result);

    if($count == 1){
    session_register("myusername");
    session_register("mypassword"); 
    header("location:login_success.php");
        }
    else 
        {
    echo "Wrong Username or Password";
        }
    }

    else

    echo "You have left one or more fields blank.";

?>

login_success.php

<? 
session_start();
if( !isset( $_SESSION['myusername'] ) ){
header("location:account.html");
}

echo "Welcome, ".$_SESSION['myusername']." - You are now logged in.<br>";

echo "<a href=logout.php>Logout</a>"
?>

<html>
<body>

</body>
</html>

logout.php

<?php

session_start();

session_destroy();

echo "You have been logged out, <a href='index.php'>click here</a> to return."

?>

我已经尝试将此内容插入到index.html中,并将文件名更改为index.php。

$submit = $_POST["login"];

if($submit)
{

}

...但它始终在页面底部显示一个错误信息(“用户名或密码错误”)。

我希望当用户输入错误的用户名或密码,或者留空必填字段时,错误信息将弹出在同一页上,而不是跳转到一个新的丑陋的PHP页面,并在左上角显示错误信息。


1
使用JavaScript(jQuery或其他框架也可以)检查所需的空白更容易。在回答错误的用户名或密码消息之前,您需要在哪个文件(可能是div)中显示该消息?请澄清一下,我会发布我的答案。 - Ogulcan Orhan
5个回答

5

在checklogin.php中,不要输出错误信息,使用以下代码:

die(header("location:index.html?loginFailed=true&reason=password"));

或类似的东西,在您的index.html页面中,只需让PHP生成HTML消息,就像这样:
    <input type="submit" name="login" value="Login" id="login" class="texta" /><br /><br />
    <?php $reasons = array("password" => "Wrong Username or Password", "blank" => "You have left one or more fields blank."); if ($_GET["loginFailed"]) echo $reasons[$_GET["reason"]]; ?>
</form>

此外,当您使用“header”重定向页面时,请确保使用“die()”或“exit()”,否则您的脚本的其余部分将继续运行。

谢谢大家,我现在正在审核你们的答案,等我有了结果会给出反馈!我很新手 PHP,所以理解你们的修复措施需要一些时间。 - Callum O' Riordan
嗨Travesty3。我理解你使用数组根据错误原因输出错误的概念,但是在if($_GET["loginFailed"]这一行中,我遇到了一个错误,说loginFailed是一个未定义的索引。这个条件是从哪里来的? - Callum O' Riordan
1
这是一个 PHP 的 注意事项(notice),而不是一个 错误(error)。这意味着您在 php.ini 中的 error_reporting 设置中设置为显示通知。请尝试使用 if (isset($_GET["loginFailed"])) - Travesty3
还是没有任何东西!“loginFailed”条件从哪里来?if(isset($_GET["loginFailed"]))在检查什么以及如何检查? - Callum O' Riordan
你需要修改checklogin.php文件,将其重定向到URL index.html?loginFailed=true&reason=password。这就是"loginFailed"的来源。if(isset($_GET["loginFailed"]))检查URL中是否设置了参数'loginFailed',如果按照上述方式修改了checklogin.php脚本,则应该设置该参数。 - Travesty3
显示剩余5条评论

3
你可以在数据无效时将页面重定向回去。将错误信息存储到session中并在页面上显示出来,例如:
<?php if(isset($_SESSION['Login.Error'])  { echo $_SESSION['Login.Error'];
 unset($_SESSION['Login.Error']); } ?>
<form ....

如果出现错误,它会在页面上显示。

在您的PHP代码中

 $_SESSION["Login.Error"] = 'Invalid credentials';//redirect back to your login page

谢谢大家,我正在审查你们所有的答案,一旦有结果,我会发布反馈!我对PHP非常陌生,所以弄清楚你们的修复措施需要一些时间。 - Callum O' Riordan
这是一个很棒的解决方案。它既兼容PRG,又避免将错误信息附加到查询字符串中。 - user3187724

2
在checklogin.php中,如果用户输入了错误的用户名或密码,请使用以下代码:
echo "<script language=\"JavaScript\">\n";
echo "alert('Username or Password was incorrect!');\n";
echo "window.location='login.php'";
echo "</script>";

它会在同一页面(登录页面)弹出错误消息,而不是跳转到空白的PHP页面。

这是可行的(我把它作为暂时的解决方案)。但是我需要比这更优雅的解决方案。 - gihanchanuka
@AlpiGC,你认为优美的解决方案是什么意思? - Ian

1

您需要将index.html页面变成PHP页面,并使表单提交到自身,即index.php。这样,您的索引页面可以检查表单值的登录状态并适当地显示页面输出,或使用标题重定向(headers)进行验证。

如果没有完整上下文,很难确定您的尝试可能产生的影响,但情况的要点是您需要让表单提交到自身并处理其登录过程。


谢谢大家,我正在审查你们所有的答案,一旦有结果,我会发布反馈!我对PHP非常陌生,所以弄清楚你们的修复方法需要一些时间。 - Callum O' Riordan
http://stackoverflow.com/questions/9386301/login-form-redirecting-back-to-itself-on-submit - thescientist

1

看起来你想/需要将它与jQuery或其他JavaScript/AJAX库集成,以使事情更具可呈现性。jQuery有一个表单验证插件,非常容易集成到您的项目中(显然,jQuery库是最低要求)。 jQuery网站jQuery验证插件。 您还可以考虑使用像CodeIgniter这样的PHP框架,它也有一个非常有用的表单验证库。CodeIgniter在开始时可能会让人感到害怕(就像所有基于MVC的编程库/框架一样),但它是值得的。您可以观看一些netTuts+上的教程,他们创建了一系列名为CodeIgniter From Scratch的教程,虽然不是最新版本,但很容易适应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接