PHP用户友好错误处理:登录错误在指定文本框展示方法咨询
解决PHP登录场景的错误提示与表单回显问题
嘿,咱们一步步来搞定这个登录错误处理的需求。你想要在用户名/密码为空、登录失败时,把友好提示显示到Error文本框里,还能回显用户之前输入的内容——下面是具体实现方法,顺便帮你修复几个代码里的安全隐患:
第一步:修改login.php,传递错误状态与用户输入
你现在的代码跳转回index.php时没带任何错误信息,所以页面根本不知道出了啥问题。我们可以通过URL的GET参数传递错误类型,同时把用户输入的用户名带回去(密码千万别回显,安全第一):
<?php if($_SERVER["REQUEST_METHOD"] == "POST"){ // 先获取并清理用户输入,方便后续传递 $username = trim($_POST['username'] ?? ''); $password = trim($_POST['password'] ?? ''); if(empty($username) || empty($password)){ // 空字段错误,跳转时携带错误标识和用户名(用urlencode处理特殊字符) header("Location: index.php?error=empty_fields&username=" . urlencode($username)); exit; // 跳转后必须加exit,避免后续代码继续执行 } else { // 数据库连接优化:直接在connect时指定数据库,减少一步操作 $conn = mysqli_connect("localhost", "root", "", "loginsystem"); if(!$conn){ die("数据库连接失败: " . mysqli_connect_error()); } // 重点:改用预处理语句防止SQL注入!你的原代码直接拼接用户输入,风险极高 $stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE Username = ? AND Password = ?"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $rows = mysqli_num_rows($result); if($rows == 1){ // 登录成功:建议加上session记录用户状态,不然welcome.php没法判断用户是否登录 session_start(); $_SESSION['username'] = $username; header("Location: welcome.php"); exit; } else { // 凭据错误,跳转时携带错误标识和用户名 header("Location: index.php?error=invalid_credentials&username=" . urlencode($username)); exit; } mysqli_stmt_close($stmt); mysqli_close($conn); } } ?>
第二步:修改index.php,显示错误信息与回显用户名
在index.php里,我们要检查URL里的GET参数,把对应的友好提示填充到Error文本框,同时把之前输入的用户名放回输入框:
<?php // 初始化变量 $errorMsg = ''; $savedUsername = ''; // 根据URL参数判断错误类型,生成对应提示 if(isset($_GET['error'])){ switch($_GET['error']){ case 'empty_fields': $errorMsg = '用户名和密码不能为空哦!'; break; case 'invalid_credentials': $errorMsg = '用户名或密码错误,请重新输入~'; break; default: $errorMsg = '登录出错了,请重试!'; } } // 回显之前输入的用户名,用htmlspecialchars防止XSS攻击 if(isset($_GET['username'])){ $savedUsername = htmlspecialchars($_GET['username'], ENT_QUOTES); } ?> <html> <head> <title>Form site</title> <link rel="stylesheet" type ="text/css" href="style.css"> </head> <body> <img src="imge/logo.png" id="logo" width="270" height="130"> <div id ="frm"> <form method="post" action="login.php"> <p> Username : <input type="text" name="username" id="username" value="<?php echo $savedUsername; ?>"><br><br> Password : <input type="password" name="password" id="password"><br><br> <input type="submit" value="Login" id="btn" name="submit"> <!-- 把错误信息填充到Error文本框,加readonly防止用户修改 --> <input type="text" value="<?php echo htmlspecialchars($errorMsg, ENT_QUOTES); ?>" id="Error" name="Error" readonly> </p> </form> </div> </body> </html>
额外的优化小建议
- 密码存储安全:绝对不要明文存密码!应该用
password_hash()加密后再存到数据库,登录时用password_verify()验证,这是PHP安全的基本要求 - 错误提示样式:可以把
Error文本框改成<div>标签,给它加红色字体样式,比文本框更友好 - Session安全:登录成功后,建议设置Session的安全参数(比如
session_set_cookie_params()),防止会话劫持
内容的提问来源于stack exchange,提问作者Krizs
相关产品推荐
相关产品推荐

