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

Posted

技术标签:

【中文标题】如何使用 PHP 将登录表单错误返回到同一页面?【英文标题】:How do you return login form errors to the same page using PHP? 【发布时间】:2012-03-18 02:36:49 【问题描述】:

我对 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 页面在左上角。

【问题讨论】:

使用 javascript 更容易检查所需的空白(jQuery 或其他框架运行良好)。在回答错误的用户名或密码消息之前,您需要在哪个文件(可能是 div)中显示该消息?澄清这一点,我会发布我的答案。 【参考方案1】:

在 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 很陌生,所以弄清楚你的修复程序在做什么需要一些时间。 header 之后的脚本的其余部分不一定会继续运行(通常不会),但在技术上可以简单地忽略更改的标头而不重定向(这会导致脚本继续)。所以是的,强烈建议在设置标题后立即停止脚本。 嗨 Travesty3。我了解您使用数组根据导致错误的原因输出错误的概念,但是在 if($_GET["loginFailed"] 中,我收到一条错误消息,指出 loginFailed 是未定义的索引。这种情况来自哪里? 这是 PHP 通知,而不是 错误。这意味着您在 php.ini 中设置了 error_reporting 设置以显示通知。请改用if (isset($_GET["loginFailed"])) 还是什么都没有! “loginFailed”条件来自哪里?什么是 if(isset($_GET["loginFailed"])) 检查以及如何检查?【参考方案2】:

如果数据无效,您可以做的是重定向回您的页面。将错误放入会话并在页面上显示:

例如:

<?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 很陌生,所以弄清楚你的修复程序在做什么需要一些时间。 这是一个很好的解决方案。它既与 PRG 兼容,又避免将错误信息附加到查询字符串。【参考方案3】:

在checklogin.php中,如果用户输入了错误的用户名或密码,使用如下代码:

echo "<script language=\"JavaScript\">\n";
echo "alert('Username or Password was incorrect!');\n";
echo "window.location='login.php'";
echo "</script>";

它将在同一页面(登录页面)弹出错误消息,而不是进入空白的PHP页面。

【讨论】:

这是有效的(我用它作为临时解决方案)。但我需要一个比这更优雅的解决方案。 @AlpiGC 优雅的解决方案是什么意思?【参考方案4】:

您希望将 index.html 页面设置为 PHP 页面,并将表单提交给自身,即 index.php。通过这种方式,您的索引页面可以对表单值进行登录检查并适当地显示页面的输出,或者如果一切都验证,则使用标题进行重定向。

如果没有完整的上下文,很难判断您的尝试可能产生的效果,但情况的要点是您需要表单提交给自身并处理它的登录处理。

【讨论】:

谢谢大家,我现在正在审查您的所有答案,当我有工作时我会发布反馈!我对 PHP 很陌生,所以弄清楚你的修复程序在做什么需要一些时间。 ***.com/questions/9386301/…【参考方案5】:

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

【讨论】:

以上是关于如何使用 PHP 将登录表单错误返回到同一页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 php 变量传递给同一页面中的另一个表单?

php,提交后使用同一页面的表单

php 在自己本身的页面如何防止重复提交的

使用 Django 在一个页面上登录和注册表单

登录按钮返回同一页面。而不是家

php将两个角色重定向到同一页面