PHP登录开发疑问:include引入的mylogin.php加载即执行问题
问题分析与解决方案
你遇到的核心问题是页面加载时就执行了mylogin.php的代码,这是因为你在index.php的末尾直接用include("mylogin.php");引入了它——PHP在处理index.php请求时,会按顺序执行所有PHP代码,包括这个引入的文件,不管用户有没有提交表单。
再加上mylogin.php里的逻辑判断有漏洞,第一次加载页面时$_POST数组是空的,访问$_POST["username"]、$_POST["password"]这些未定义的索引还会触发PHP警告,这就是你看到响应里有异常内容的原因。
具体问题拆解
- 即时执行的根源:
index.php里的include语句没有任何条件判断,只要加载页面就会运行mylogin.php的代码。 - 逻辑判断错误:
if(empty($_POST["submit"]))这个判断有问题——首次加载页面时$_POST["submit"]根本不存在,empty()会返回true,进而进入内部的空值检查逻辑,此时访问未定义的$_POST索引会产生警告。 - 潜在风险:你的SQL语句直接拼接用户输入,存在严重的SQL注入风险,这是Web开发的大忌。
修复方案
第一步:调整index.php,只在表单提交时执行验证逻辑
修改index.php,把include放到POST请求的判断里,只有用户点击登录按钮提交表单时,才加载并执行mylogin.php的代码:
<!DOCTYPE html> <html> <head> <title> Welcome </title> </head> <body> <h1> Please login</h1> <br> <form method="post" action=""> <label>Username:</label><br> <input type="text" name="username" placeholder="username" /><br><br> <label>Password:</label><br> <input type="password" name="password" placeholder="password" /> <br><br> <input type="submit" name="submit" value="Login" /> </form> <?php // 只有当用户通过POST提交表单时,才执行登录验证 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST["submit"])) { include("mylogin.php"); } ?> </body> </html>
第二步:修正mylogin.php的逻辑与安全问题
更新mylogin.php,修复判断逻辑、避免未定义索引警告,同时解决SQL注入问题:
<?php // 启动Session(如果后续页面需要验证登录状态,必须加这个) session_start(); include("myconnection.php"); $error = ""; // 先安全获取POST参数,避免未定义索引警告 $username = isset($_POST["username"]) ? trim($_POST["username"]) : ''; $password = isset($_POST["password"]) ? trim($_POST["password"]) : ''; if (empty($username) || empty($password)) { $error = 'Please fill the blanks!'; echo "<p style='color:red;'>$error</p>"; } else { // 使用预处理语句防止SQL注入(非常重要!) $sql = "SELECT * FROM users WHERE username = ? AND password = ?"; $stmt = mysqli_prepare($db, $sql); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($result) === 1) { // 将登录用户信息存入Session,方便后续页面验证 $_SESSION['login_user'] = $username; // 跳转后必须exit,防止后续代码执行 header("location: myhome.php"); exit; } else { $error = "Incorrect Username/Password"; echo "<p style='color:red;'>$error</p>"; } } ?>
额外注意事项
- 密码存储:不要明文存储密码!应该用
password_hash()加密后存储,验证时用password_verify()比对,这是用户数据安全的基本要求。 - Session初始化:所有用到Session的页面(比如
myhome.php)都要在最开头加上session_start();,否则无法读取Session信息。 - 错误处理:可以把错误信息整合到页面中,让用户更直观地看到问题,而不是只在后台输出。
内容的提问来源于stack exchange,提问作者BRond
相关产品推荐
相关产品推荐

