2013-04-21 77 views
3

如果我在頂部有一個session_start()的php聯繫表格,我知道這會創建一個會話。但是,如果用戶沒有填寫表單並導航到不同的頁面呢?PHP - 在未提交的表單頁面上正確銷燬會話?

我是否還需要使用session_destroy,因爲我只想在用戶通過我的聯繫頁面提交php表單時創建會話?

謝謝。

更新:對於我的表單中沒有發佈冗長的代碼更好的主意。

接觸form.html

<?php session_start(); ?> 
<?php $fname = isset($_SESSION['fname']) ? $_SESSION['fname'] : NULL ; ?> 
<form method="post" action="http://www.mysite.com/form-process.php"> 
    <input value="<?php echo $fname ?>" type="text" id="fname" name="fname" /> 
    <input type="submit" value="Submit Request" /> 
</form> 

形式,process.php

<?php 
session_start(); 
$_SESSION['fname'] = $_POST['fname']; 
$user = "John" ; 
session_write_close(); 
if ($_SESSION['fname'] != $user) { 
    header('Location: http://www.mysite.com/contact-form.html'); 
} 
else { 
    $_SESSION = array(); 
    session_destroy(); 
    header('Location: http://www.mysite.com/thankyou.html'); 
} 
?> 
+2

你的申請有多大?創建一個會話的成本是最小的,所以我會說你99/100不需要關心這個。 – alexn 2013-04-21 14:41:23

+1

您可以檢查POST變量是否每次都提交(可能使用隱藏字段標識符將其與其他表單區分開來)。如果他們不存在,只需銷燬會話。 – 2013-04-21 14:41:28

+0

感謝您的評論。該應用程序只是兩頁:)。 contact-form.php和process-form.php與session_start()僅在網站內的這兩個頁面上。我相信下面的答案,但解決我的關切:)。 – Damainman 2013-04-22 06:12:04

回答

2

如果您只想在用戶提交特定表單時創建會話,請按照您的描述進行操作。在網站的每個頁面上放置session_start()並不是強制性的,它不需要是文件中的第一行(它只需要能夠生成cookie,因此它需要在任何輸出之前)。

// contact-form.php 
if($_SERVER['REQUEST_METHOD']=='POST'){ 
    session_start(); 
    // ... 
} 

HTTP的無狀態性使得如果用戶沒有完成某個任務,就無法主動刪除一個會話。但是,如果您沒有在站點的其他部分加載會話,那麼即使用戶仍在瀏覽您的站點,會話文件也會在其到期時間後的下一次垃圾收集中被刪除。除此之外,會話只是一個無害地位於臨時目錄中的小文本文件。

+0

從來沒有想過這樣做。特別是因爲多人提醒說session_start()之前絕對沒有空間。儘管如此,我的contact-form.php文件發送了一個form-process.php文件來處理聯繫表單的輸入。在這種情況下你的代碼不能正常工作?由於POST轉到另一個頁面,因此contact-form.php文件不會重新加載以啓動該會話的IF語句。 – Damainman 2013-04-22 06:09:03

+0

沒有空間可以**發送到瀏覽器** - 這是「session_start()之前沒有輸出」的特殊情況。如果你瞭解餅乾的工作方式,你會發現沒有錯誤縮進session_start()行。如果你明白它的作用,我的代碼可以適應你的場景 - 它不適用於盲拷+粘貼。 – 2013-04-23 07:50:11

+0

我已經接受你的回答作爲答案,因爲它更詳細,幷包含代碼建議。我理解你的代碼在做什麼,但是如果我的form-process.php腳本將用戶發送到contact-us.php表單來糾正輸入的信息,那麼我不確定這是如何工作的。如果會話存在或類似的東西,我會把一個IF語句只使用session_start()嗎? – Damainman 2013-04-24 21:01:06

4

創建會話的開銷是微乎其微的,還有雖然你可能你需要session_destroy()沒有真正的理由如果您只想在用戶發佈時使用會話,則將session_start()放在檢測帖子的塊中,而不是在腳本的頂部。

+0

感謝@Oshawott的迴應。這是一個艱難的選擇,但我接受了另一個答案,因爲它提供了更多的細節。 – Damainman 2013-04-24 21:02:32