PHP+MySQL基于内连接的登录系统无法正常登录求助
登录按钮无响应的问题排查与修复
我来帮你解决这个登录无响应的问题,你的代码主要是逻辑结构和几个细节出错了,下面一步步分析并修正:
主要问题点
- 登录逻辑未被触发:核心的查询和结果判断代码不在登录提交的判断块内,导致点击按钮后只有表单值被获取,后续逻辑完全不执行。
- 不必要的MD5加密:对学科名称做MD5加密后,和数据库里的明文字段无法匹配,导致查询不到结果。
- 未初始化的变量:
$errors数组和$result变量存在作用域或未定义的问题,会导致脚本静默失败。
修正后的完整代码
PHP 部分
<?php session_start(); // 必须开启会话,否则$_SESSION无法正常使用 $errors = []; // 初始化错误数组,避免count()报错 // 请确保这里已经正确完成数据库连接,比如: // $db = mysqli_connect('localhost', 'username', 'password', 'dbname'); // LOGIN USER if (isset($_POST['login'])) { $name = mysqli_real_escape_string($db, $_POST['name']); $studentid = mysqli_real_escape_string($db, $_POST['studentid']); if (count($errors) == 0) { // 移除不必要的MD5加密,除非数据库里的discipline.name是MD5加密存储的 // $name = md5($name); $query = "SELECT discipline.name, student.studentid FROM discipline INNER JOIN student ON discipline.disciplineid = student.disciplineid WHERE discipline.name='$name' AND student.studentid='$studentid'"; $result = mysqli_query($db, $query); if (mysqli_num_rows($result) == 1) { // 存储明文的学科名称到会话,方便后续页面使用 $_SESSION['name'] = $name; $_SESSION['studentid'] = $studentid; // 可顺便存储学生ID header('location: Assessment.php'); exit; // 跳转后必须exit,防止后续代码继续执行 } else { array_push($errors, "Wrong username/password combination"); } } } // logout if (isset($_GET['logout'])) { session_destroy(); unset($_SESSION['name']); // 对应登录时存储的会话键名 unset($_SESSION['studentid']); header('location: index.php'); exit; } ?>
HTML 表单部分
<div class="form"> <ul class="row justify-content-center"> <form method="post" action="index.php"> <!-- 新增错误信息显示区域,方便用户查看失败原因 --> <?php if (!empty($errors)): ?> <div class="error"> <?php foreach ($errors as $error): ?> <p><?php echo $error; ?></p> <?php endforeach; ?> </div> <?php endif; ?> <p> <label>Your ID </label> <input type="text" id="studentid" name="studentid" required /> </p> <p> <label>name of discipline:</label> <input type="text" id="name" name="name" required /> </p> <p> <button type="submit" class="btn" name="login">Login</button> </p> </form> </ul> </div>
关键修改说明
- 包裹登录逻辑:把所有登录相关的代码(获取值、查询、结果判断)都放到
if (isset($_POST['login']))块内,确保点击登录按钮时这些代码会执行。 - 移除MD5加密:如果数据库里的学科名称是明文,这行加密代码会导致查询匹配失败,直接删除即可;如果数据库里确实是MD5加密的,再保留这行。
- 初始化变量:添加
$errors = [];避免count报错,同时确保$result在查询逻辑内定义,不会出现未定义的情况。 - 添加会话开启:必须在使用
$_SESSION前调用session_start();,否则会话无法正常工作。 - 跳转后exit:使用
header()跳转后,一定要加上exit;防止脚本继续执行后续代码。 - 添加错误提示:在表单里加入错误信息显示,方便用户知道登录失败的原因。
内容的提问来源于stack exchange,提问作者nad
相关产品推荐
相关产品推荐

