PHP SESSION 取不到求老司机指点!

窝最近在写一个注册的页面,需要邮箱验证的。窝的思路是这样的:
按下发送按钮,就用AJAX(原生的)请求PHP发送验证码。
PHP(参数op=send_ve)生成验证码,存到$_SESSION里面,然后把验证码发到用户邮箱。
提交表单之后,PHP(同一个文件,参数op=submit)比对验证码字段的内容和$_SESSION里面的,不一样就输出“验证码错误!”
窝试了一下然后很尴尬的“验证码错误”了。然后在朋友的建议下试过各种方法:
把session_start();放到页面最开始。
用了一个固定的键名:"ve"(本来是用邮箱做)
测试是不是所有的$_SESSION都不能用:
于是我在发送验证码的地方加了一句$_SESSION["OK"]="OK";
打印错误信息(“验证码错误”)的地方输出$_SESSION。
啥也没输出,就一个空的

代码如下:
前端HTML,那个链接就是了。
后端PHP:
Mushouse-Signup
Signup

注册信息

functionecho_text($text)
{
echo"".$text."

";
}
functiondie_text($text)
{
die("".$text."

");
}
functionqm_str($str)
{
return"\"".$str."\"";
}
error_reporting(E_ALL);
header("Content-Type:text/html;charset=utf-8");
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Headers:Content-Type,Content-Length,Accept-Encoding,X-Requested-with,Origin");
usePHPMailer\PHPMailer\PHPMailer;
usePHPMailer\PHPMailer\Exception;
require"./PHPMailer/src/Exception.php";
require"./PHPMailer/src/PHPMailer.php";
require"./PHPMailer/src/SMTP.php";
try
{
if($_GET["op"]=="send_ve")
{
$ve="";
for($i=0;$i<6;$i++)
$ve.=mt_rand(0,9);
$_SESSION["ve"]=$ve;
#Test:
$_SESSION["OK"]="OK";
#Note:开始发送邮件!
$mail=newPHPMailer(true);
$mail->CharSet="UTF-8";
$mail->SMTPDebug=0;
$mail->isSMTP();
$mail->Host="smtp.qq.com";
$mail->SMTPAuth=true;
$mail->Username="fork_killet@qq.com";
$mail->Password="xxxx";
$mail->SMTPSecure="ssl";
$mail->Port=465;
$mail->setFrom("fork_killet@qq.com","IceLava团队");
echo$_POST["email"];
$mail->addAddress($_POST["email"],$_POST["email"]);
$mail->isHTML(true);
$mail->Subject="Mushouse注册验证码";
$mail->Body="这是IceLava团队向您发来的验证邮件,
如果不是您本人在注册Mushouse账户,请不要理睬!

";
$mail->Body.="

6位数字验证码:".$ve.",请在注册页面填写。


";
$mail->Body.="

--IceLava团队

";
$mail->AltBody="很抱歉,您的邮箱太屑了,不支持HTML邮件内容!";
$mail->send();
}
elseif($_GET["op"]=="submit")
{
if($_POST["pw"]!=$_POST["pw2"])
echo_text("两次密码输入不一致!");
elseif(preg_match("/[^A-Za-z0-9_]/",$_POST["pw"]))
echo_text("密码不能包含数字、大小写字母和下划线以外的字符!");
elseif(strlen($_POST["pw"])<6)
echo_text("密码长度必须大于6!");
elseif(strlen($_POST["pw"])>16)
echo_text("密码长度必须小于16!");
elseif(preg_match("/[^A-Za-z0-9_]/",$_POST["un"]))
echo_text("用户名不能包含数字、大小写字母和下划线以外的字符!");
elseif(strlen($_POST["un"])<4)
echo_text("用户名长度必须大于4!");
elseif(strlen($_POST["un"])>16)
echo_text("用户名长度必须小于16!");
elseif(!preg_match("/^([A-Za-z0-9_\.\-])+\@(([A-Za-z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/",$_POST["email"]))
echo_text("邮箱格式不正确!");
#Note:验证码检查
elseif($_POST["ve"]!=$_SESSION["ve"])
{
echo_text($_SESSION["ve"]);
echo_text("验证码不正确!");
}
else
{
$conn=newmysqli("xxx","xxx","xxx","icelavag");
if($conn->connect_error)
die_text("数据库连接失败:".$conn->connect_error);
$rst=$conn->query
(
"SELECT*FROMuser_infoWHEREun=".qm_str($_POST["un"])
);
if($rst->num_rows==1)
echo_text("用户名".$_POST["un"]."已被注册!");
else
{
$conn->query
(
"INSERTINTOuser_info(un,pw,email)VALUES(".
qm_str($_POST["un"]).",".qm_str($_POST["pw"]).",".qm_str($_POST["email"]).")"
);
echo_text("注册成功!您可以去登陆了,".$_POST["un"]."~");
echo_text($_SESSION["OK"]);
}
}
}
}
catch(\Exception$err)
{
echo_text($err->getMessage());
}
?>
ABOUTYOU
浏览 236回答 2
2回答

阿晨1998

先看一下PHP是不是真的没写Session,直接看php.ini里面的session.save_path(默认/var/lib/php/session)的位置是什么,如果Session目录啥也没有,检查一下文件夹的权限是否正确。如果用的是mem,redis,进去看一下有没有对应的key还有就是另一种可能,后端读取cookies的PHPSESSID读错了,检查一下浏览器的cookies是不是有两个PHPSESSID,把cookies删除了再试试测试Session功能是否正常的时候,新开一个文件,写入Session,然后再读一下
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript