php中session函数如何调用的同时也改变函数内的数值

我用session函数当计数器,计算还剩多少次密码输入次数,可是里面的值始终是1不变,结果也始终是“还剩3次机会”,请问该如何解决?

<?php

session_start();

$_SESSION['A']=1;

?>

<?php

if ($_POST) {

if($_POST["type"]=="学生"){

$rsRow = db_get_row("select * from user where account='". $_POST["account"] ."'");

if ($rsRow['password'] == $_POST["password"]){

$_SESSION["id"] = $rsRow['id'];

$_SESSION['usercategoryid'] = $rsRow['categoryid'];

$_SESSION['usercategory1id'] = $rsRow['category1id'];

$_SESSION['nickname'] = $rsRow['nickname'];

$_SESSION['type2'] = "学生";

urlMsg("登录成功", "user/index.php");

die;}

else {

$_SESSION['A']=$_SESSION['A']+1;

switch($_SESSION['A']){

case 1:goBakMsg("密码错误,你还有4次机会");break;

case 2:goBakMsg("密码错误,你还有3次机会");break;

case 3:goBakMsg("密码错误,你还有2次机会");break;

case 4:goBakMsg("密码错误,你还有1次机会");break;

default:goBakMsg("请稍后重试");

}

}

}

基于Monster 组和GPT的调写:

  • 这可能是因为每次调用时 $_SESSION['A'] 都被重置为 1,因为在代码开头的 session_start() 函数调用之后,没有检查是否已经设置了 $_SESSION['A'] 的值,如果没有设置,则将其设置为 1。
  • 为了解决这个问题,你可以将 session_start() 调用放在条件语句之前,以确保在每次调用时都可以访问相同的 session 变量。另外,你也可以添加一个额外的检查,以确保在设置 $_SESSION['A'] 之前,检查它是否已经存在,如果不存在则将其设置为 1。

下面是修改后的代码示例:


<?php
session_start();

// 检查是否已经设置了 $_SESSION['A'] 的值,如果没有则将其设置为 1
if (!isset($_SESSION['A'])) {
  $_SESSION['A'] = 1;
}

if ($_POST) {
  if ($_POST["type"] == "学生") {
    $rsRow = db_get_row("select * from user where account='" . $_POST["account"] . "'");
    if ($rsRow['password'] == $_POST["password"]) {
      $_SESSION["id"] = $rsRow['id'];
      $_SESSION['usercategoryid'] = $rsRow['categoryid'];
      $_SESSION['usercategory1id'] = $rsRow['category1id'];
      $_SESSION['nickname'] = $rsRow['nickname'];
      $_SESSION['type2'] = "学生";
      urlMsg("登录成功", "user/index.php");
      die;
    } else {
      $_SESSION['A'] = $_SESSION['A'] + 1;
      switch ($_SESSION['A']) {
        case 1:
          goBakMsg("密码错误,你还有4次机会");
          break;
        case 2:
          goBakMsg("密码错误,你还有3次机会");
          break;
        case 3:
          goBakMsg("密码错误,你还有2次机会");
          break;
        case 4:
          goBakMsg("密码错误,你还有1次机会");
          break;
        default:
          goBakMsg("请稍后重试");
      }
    }
  }
}
?>

这个修改应该能够解决你遇到的问题,让你的 session 计数器正常工作。

这段代码存在几个问题:
1,db_get_row函数未定义,需要先引入相应的数据库操作函数库。
2,if ($_POST) 这行代码需要判断是否有表单提交,可以改为 if ($_SERVER['REQUEST_METHOD'] == 'POST') 。
3,die 函数需要加上括号,正确写法为 die()。
4,在 default 分支里的 goBakMsg 函数也需要定义或者引入相应的函数库。
5,最后,不应该在这里输出密码错误的次数,而应该在页面的表单上输出错误次数。
下面是修改后的代码: