PHP如何实现点击alert确定后返回登录页,header跳转失效怎么办
问题描述
开发PHP登录验证功能时遇到跳转失效问题,现有验证代码如下:
<?php include "connect.php"; $nama = $_POST['nama']; $password = $_POST['password']; $message = "Your data is not in our database! check for mistake"; $sql = "select * from tbuser where nama = '$nama' and pass = '$password'"; $query = mysqli_query($con,$sql) or die("error $sql"); $num = mysqli_num_rows($query); $result = mysqli_fetch_array($query); if($num==1){ header("location: home.php"); } else{ echo "<script type='text/javascript'>alert('$message');</script>"; } ?>
当前当用户输入的账号信息不在数据库中时会弹出alert提示,希望用户点击alert的确定按钮后自动跳转回登录页index.php,尝试使用header("location:index.php")实现跳转但未生效。
原因说明
header() 函数要求必须在任何实际输出(包括echo输出的内容、HTML代码、空格、换行等)发送到客户端之前调用,你在else分支已经先执行了echo输出alert的JS代码,此时HTTP响应头已经发送完毕,后续再调用header()自然无法生效。
解决方案
直接在JS的alert逻辑后追加页面跳转代码即可,修改else分支的代码如下:
else{ echo "<script type='text/javascript'> alert('$message'); // 点击alert确定后执行跳转 location.href='index.php'; </script>"; // 可选兜底方案:应对用户浏览器禁用JS的场景 echo "<meta http-equiv='refresh' content='0;url=index.php'>"; exit; }
额外安全优化建议
- 当前SQL语句直接拼接用户输入参数,存在严重SQL注入风险,建议改为mysqli预处理语句执行查询,避免注入攻击。
- 不要在数据库中明文存储用户密码,建议使用PHP内置的
password_hash()函数加密存储密码,验证时使用password_verify()做校验。 - 登录验证通过后建议为用户设置session标识身份,同时在home.php顶部增加登录状态校验,避免未登录用户直接访问后台页面。
内容的提问来源于stack exchange,提问作者Vincent Xaviera
相关产品推荐
相关产品推荐

