2015-10-18 34 views
0

我对后端编程还很陌生,似乎无法找到一个简单(在我看来)问题的答案。我明白,如果我只想显示给定用户的特定数据(例如购物车中的物品),我将使用会话ID来标识该用户,并将该数据库中特定用户的任何信息插入到我的页面中通过php的echo函数。现在,如果我有一个包含大量html代码行的页面,并且希望仅在有会话时才运行代码,那该怎么办?我应该把所有的代码放到其他{回声“...的html代码...”;},有一个页面看起来像这样:PHP会话 - 阻止整个页面加载

<?php 
    session_start();  
    if (!isset($_SESSION['id'])) { 
     header('location:../'); 
     exit(); 
    } else { 
     echo " 
      <html> 
      <body> 
       code 
       code 
       code 
       code 
      </body> 
      </html> "; 
    } 
?> 

这似乎是工作,但整个方法似乎非常庞大,我的直觉告诉我,除非用户登录,否则我不应该加载每个页面。此外,此方法会使用引号创建各种问题,并使代码非常难以阅读和调试。

+2

您不需要别的你可以做这样的事情。如果因为exit();终止脚本而满足'if'条件,则该代码将永远不会运行。 –

回答

1
<?php 
    session_start();  
    if (!isset($_SESSION['id'])) { 
    header('location:../'); 
    exit(); // <-- terminates the current script 
    } 
// close the php tag and write your HTML :) 
?> 
<html> 
    <body> 
    code 
    code 
    <!-- if you need another php tag somewhere else --> 
    <?php if(1 != 2) echo '<em>PHP works :)</em>'; ?> 
    code 
    code 
    </body> 
</html> 
+0

在这样的脚本中使用exit()会不会是一种糟糕的形式,因为它终止了线程并且破坏了让线程可以重用的多线程应用程序服务器的目的?除非你使用纯CGI。 – Laserbeak

0

您的会议无论您是否认识用户,我都会在那里。 您可以通过表单变量或会话cookie传递会话ID。并通过设置会话ID呼叫会话

session_id($session_var_passed); 
session_start(); 

您应该测试会话变量传递。

0

你可以这样做。

<?php 

    $shouldShow = 0; 
    session_start(); 
    if (isset($_SESSION['id'])){ 
     $shouldShow = 1; 



} 
?> 
<html> 
<body> 


<script> 

var shouldLoad = <?php echo $shouldShow; ?>; 
if (shouldLoad == 1){ 

    loadPage(true); // load page is an imaginary Javascript function which 
      //you can make to load the page. 

} 

</script> 
</body> 
</html> 

这样,你混淆了PHP和Java脚本来达到你的目标,使网站对用户更友好。

第一个php部分包含php变量,如果会话存在,它将被设置为1。

现在,您已经拥有HTML部分,您在其中有一个脚本标记,其下有一个变量。您只需将php变量“shouldLoad”的值回显到此JavaScript变量中即可。所以,现在你的JavaScript知道要加载或不加载网页。根据变量的值,在JavaScript代码中进行必要的调整以加载网页。

这样做的另一种方法是。

<?php 


    session_start(); 
    if (!isset($_SESSION['id'])){   
     header('Location: http://myhost.com/mypage.php'); 
     // redirect the page to another location (a page saying no session found) 

} 

?> 


<html> 
<body> 
    your html codes you want to show 
</body> 
</html> 

此外,如果你只是想退出你的PHP脚本,不关心的炫酷UI,你可以简单地把“退出()”你的“如果”的条件内,使脚本终止它不找到所需的会话ID。

+0

谢谢你。但是,如果标题被重定向,但是在服务器仍然尝试运行整个代码之后没有退出(),您是不是会打开自己的安全风险?或者更改头文件是否阻止该行下面的任何代码运行? – Alze

+0

我刚刚向你展示了一个例子,不管任何安全漏洞。 是的,头只是一行要求浏览器重定向的数据,但如果它没有及时重定向或客户端设法跳过,代码仍然会执行。更好地使用退出或死后标题或添加另一行的保护代码,然后服务的HTML。 – phositronax

+0

@phositronax通过手动将var shouldLoad更改为1,可以轻易地在开发人员工具控制台中篡改此代码。 –

0

,如果你认为页面太笨重

<?php 
    session_start();  
    if (!isset($_SESSION['id'])) { 
     header('yourFile.php); 
     exit(); 

} 

“你file.php”

<?php 
    echo " 
       <html> 
       <body> 
        code 
        code 
        code 
        code 
       </body> 
       </html> "; 
    ?>