通过XMLHTTPRequest加载PHP不要共享相同的变量范围

时间:2018-06-08 14:46:53

标签: php html scope xmlhttprequest global-variables

我理解PHP中全局变量的概念,并理解有关全局变量使用的优缺点。尽管如此,我还是决定使用它们,但我遇到了关于它们的范围和可见性的问题。

情况:

根据菜单的选择,我将不同的PHP加载到div中。 PHP需要相同的公共数据集,我希望避免重新加载并保存在每个PHP的内存中。在下面的示例中,GlobalVars.php将保留在内存中两次,并且还将从数据库中获取两次数据。

问题是,通过将它们加载到div中,它们不会共享main.html的范围。 GlobalVars.php中的代码可以查看和访问another.php中的全局变量,但不能在PHP1.php中查看,也不能在PHP2.php中查看。

GlobalVars.php:

<?php
    $var1 = "*";
    $var2 = 5;
    // Various SQL fetches
?>

main.html中:

<?php require_once="./GlobalVars.php"; ?>
<?php require_once="./another.php"; ?>

<script>
    function LoadHTML(href) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", href, false);
        xmlhttp.send();
        return xmlhttp.responseText;   
    }

    switch(menuitem) {
        case 0: break;
        case 1: document.getElementById("contentdiv").innerHTML=LoadHTML("./PHP1.php") break;
        case 2: document.getElementById("contentdiv").innerHTML=LoadHTML("./PHP2.php") break; break;
        case 3: break;
        default:
    }
</script>

PHP1.html:

<?php
    require_once="./GlobalVars.php";
    // code ...
?>

PHP2.html:

<?php
    require_once="./GlobalVars.php";
    // code ...
?>

问题是,如何将PHP加载到div中,并且&#39;请参阅&#39;并使用main.html范围内的变量?

此致

的Carsten

1 个答案:

答案 0 :(得分:0)

我通过不通过JS加载PHP1和PHP2解决了这个问题,但是在PHP引擎运行之前。我现在将PHP加载到不同的DIV中,而不是将PHP加载到同一DIV中。然后,通过JS控制那些DIV的可见性。

变量$LastScreen正从SQL DB中提取并包含显示的最后一个屏幕,以便用户获得与重新加载页面之前相同的屏幕。

生成DIV s:

<html>
    <body>
        <div class="myclass" id="screen1"
            <?php if (strcmp($LastScreen, "screen1") !== 0) {echo " style=\"display:none; \"";} ?>
        >
            <?php require_once './PHP1.php'; ?>
        </div>
        <div class="myclass" id="screen2"
            <?php if (strcmp($LastScreen, "screen2") !== 0) {echo " style=\"display:none; \"";} ?>
            >
            <?php require_once './PHP2.php'; ?>
        </div>
    </body>
</html>

在JS中切换屏幕:

<script>
    function SwitchScreen (screen){
        var arr = document.getElementsByClassName('myclass');
        var i;
        for (i=0; i < arr.length;i++) {
            arr[i].style.display = "none";
            }
        document.getElementById(screen).style.display = "inline";

        // push screen name to SQL
        // ...
    }
</script>

此致

的Carsten