为什么 SESSION 变量在重新加载后会更改其值?

问题描述 投票:0回答:0

我正在尝试编写视口识别器代码。

每当新用户进入网站时,都会检查屏幕宽度,为用户提供匹配的导航栏(手机或电脑)。当它低于 768px 时,设备被归类为移动设备,否则它是 PC。然后数据会自动输入到具有隐藏输入的表单中。 要将这些值发布到 PHP,我使用带有表单数据的获取语句并将其发送到执行以下操作的 PHP 文件:

  1. 它使用 POST 从表单中获取数据
  2. 数据是第一次加载和移动。
  3. 它将数据保存到会话变量
  4. 它将数据转换成json
  5. 它返回数组 正如我所说,我通过 fetch 获得了这个数组,在我进一步的 javascript 代码中,我根据 json
  6. 设置了名为“isFirstLoadHelper”和“isMobileMiddleManText”的文本字段的值

为了给用户匹配的导航栏,我只检查会话变量 isMobile, 但无论如何: 第一次加载时我没有导航栏, 在第二次加载时,我总是在每台设备上获得移动导航栏。 这很奇怪,我认为这很有趣让我们问吧。

<?php
  session_start();
?>
<script>
  window.addEventListener("load", async function(){
    if (typeof isMobileJSVar == "undefined" || isMobileJSVar == null){
      function determineIfIsMobile(){
      let screenWidth = screen.width;
      let isMobileDevice;
      //Verhindern des erneuten Formular Übermittlungs-Dialog
        if ( window.history.replaceState ) {
          window.history.replaceState( null, null, window.location.href );
        }
        //Feststellen des Wievport WIdths
        switch(screenWidth){
          case (screenWidth <= 768)   : isMobileDevice = true;
          return isMobileDevice;
          break;
          case (screenWidth > 768)    : isMobileDevice = false;
          return isMobileDevice;
          break;
          default                     : isMobileDevice = false;
          return isMobileDevice;
          break;
        }
    }
    //Elemente initialisieren
    let isSubmitted = false;
    let isMobileHelperURL = "./wp-content/themes/almondotheme/template_parts/outsourcedPHP/isMobileHelper.php";
    let isMobileMiddleManTextElement = document.getElementById("isMobileMiddleManText");
    let isFirstLoadHelperELement = document.getElementById("isFirstLoadHelper");
    let mobileMiddleManFormElement = document.getElementById("mobileMiddleManForm");
    let isUserMobile = determineIfIsMobile();
    //Kommunikation mit PHP mittels Fetch
    function isMobile(){
      isMobileMiddleManTextElement.value = isUserMobile;
      fetch(isMobileHelperURL,{
        method: 'POST',
        body: new FormData(document.getElementById('mobileMiddleManForm')),
      })
        .then(returnedisMobileJSON=>{
          return returnedisMobileJSON.json();
        })
        .then(parsedisMobileJSON=>{
          
          var setHelperInputsFunction= function() {
            document.getElementById("isFirstLoadHelper").value = parsedisMobileJSON.isFirstLoad;
            document.getElementById("isMobileMiddleManText").value = parsedisMobileJSON.isMobile;
          }()
        })


        let isFirstLoadJSVar = document.getElementById("isFirstLoadHelper").value;
        let isMobileJSVar = document.getElementById("isMobileMiddleManText").value;
        alert(isMobileJSVar);
      };
      isMobile();
    }

  })
</script>

这是 php 文件提取,将表单数据发送到:

<?php
session_start();
$isMobileArray = array();
if(isset($_SESSION["isFirstLoad"])){
    $_SESSION["isFirstLoad"] = false;
    $isMobileArray["isFirstLoad"] = $_SESSION["isFirstLoad"];
}
else{
    $_SESSION["isFirstLoad"] = true;
    $isMobileArray["isFirstLoad"] = $_SESSION["isFirstLoad"];
}


if(!(isset($isMobileArray["isMobile"]))){
    $_SESSION["isMobile"] = $_POST["isMobileMiddleManText"];
    $isMobileArray["isMobile"] = $_POST["isMobileMiddleManText"];
    
}
else{
    $_SESSION["isMobile"] = $_POST["isMobileMiddleManText"];
    $isMobileArray["isMobile"] = $_POST["isMobileMiddleManText"];
}



$JSONToReturn = json_encode($isMobileArray);

echo $JSONToReturn;

?>

在我刚做的网站的导航栏区域

<?php
    //Check ob Mobilgerät
    if(isset($_SESSION["isMobile"])){
        if ($_SESSION["isMobile"] == true){
            get_template_part("./template_parts/navigation_mobile");
        }
        else{
            get_template_part("./template_parts/navbar_pc.php");
        }
    }
    else{
        get_template_part("./template_parts/navbar_pc.php");
    }
  
?>

但是在第一次加载时我没有导航栏,在第二次加载时我总是得到移动导航栏。 奇怪,不是吗?

感谢您抽出宝贵时间, 祝你有个愉快的星期天,

你的Alwin.

javascript php forms fetch
© www.soinside.com 2019 - 2024. All rights reserved.