2015-10-18 33 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> "; 
    ?>