2016-02-01 92 views
3

背景:我正在設計一個在線虛擬教室管理系統......它通過在教師創建時生成隨機會話密鑰(md5(time))來工作教室並將其存儲在數據庫中。在設定的過期時間(例如5分鐘)後刪除數據庫行

要訪問教室,學生訪問唯一的教室網址,代碼將URL中的會話密鑰(使用GET)與數據庫中的會話密鑰進行比較。如果有匹配,教室就會顯示。

的URL通常是這樣的:/classroom.php?instance=a529501db8373609f2d47a7843a461ea

編碼需要幫助:我希望我的老師也可以設置一個會話「長度」,所以教室是訪問15分鐘,25分鐘或50分鐘。

enter image description here

當因爲教室的創建時間超過實例25分鐘,然後會話密鑰被從數據庫中刪除,教室不能再訪問。

我有什麼至今:

當教師點擊按鈕來創建classroo的PHP下方存儲會話密鑰($實例),並在數據庫中的會話長度($時間).. 。

<?php 
session_start(); 
if (isset($_SESSION['id'])) { 
    if (isset($_POST['hidden'])) { 

     // Connects to the database 
     include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php"); 
     mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

     // Sets the session duration 
     $currentTime = time(); 
     $duration = $currentTime + $_POST['duration']; 

     // Session variables 
     $uid = $_SESSION['id']; 
     $usname = $_SESSION['username']; 

     // To generate the random hash from the current time 
     $time = time(); // time to hash 
     $instance = md5($time); // hash stored in variable 

     // Stores the session hash (instance) and duration in the instance database 
     $query = ("INSERT INTO `my-db-name-foo`.`instances` (`instance`, `expiry`) VALUES (`$instance`, $duration`);"); 
     mysql_query($query) or die(mysql_error()); 

     // Closes the database connection 
     mysql_close(); 

     // Redirects the teacher header('Location:classroom.php?instance='.$instance); 
    } 
} else { 
    echo 'Please login'; 
    die(); 
} 
?> 

那麼實際classroom.php頁面上的代碼片段檢查是否會話過期...如果它是它刪除它從數據庫中。

<?php 

$currentTime = time(); 

if ($currentTime > $duration){ 
    // Connect to database and delete the row 
} else { 
    // show the classroom 
} 
?> 

任何幫助或建議將不勝感激!

UPDATE ----

感謝所有偉大的答案,在這裏是怎麼工作的時刻...

在createclassroom.php頁我存儲實例還有NOW()日期和時間,持續時間爲NOW()+ $ _ POST [「時間」]; ...

<?php 
session_start(); 
if (isset($_SESSION['id'])) { 
    if (isset($_POST['duration']) && !EMPTY($_POST['duration'])) { 

     // Connects to the database 
     include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php"); 

     // Session variables 
     $uid = $_SESSION['id']; 
     $usname = $_SESSION['username']; 

     // To generate the random hash from the current time 
     $time = time(); // time to hash 
     $instance = md5($time); // hash stored in variable 

     // $duration = $_POST['duration']; 
     $duration = $_POST['duration']; 

     // Stores the hash (instance) in the instance database 
     $sql = ("INSERT INTO `xxx_xxxx`.`instances` (`id`, `teacher`, `instance`, `startdate`, `expiredate`) VALUES ('$uid', '$usname', '$instance', NOW(), NOW() + $duration);"); 
     $query = mysqli_query($dbConnect, $sql)or die(mysql_error()); 

     // Redirects the teacher   
     header('Location:classroom.php?instance='.$instance); 
    } else if (isset($_POST['hidden'])) { 
     echo 'Please select a duration'; 
    } 
} else { 
    echo 'Please login'; 
    die(); 
} 
?> 

實際classroom.php頁我只檢查會話實例是沒有過期。

<?php 
session_start(); 

// Connects to the database 
include_once("$_SERVER[DOCUMENT_ROOT]/classes/includes/dbconnect.php"); 

$instance = $_GET['instance']; // GETs instance from URL 
$usname = $_SESSION['username']; // Gets teacher name 

// script to retrieve all the Instances in the database and store them in a variable '$dbInstance' 
$sql = "SELECT instance, expiredate FROM instances WHERE instance = '$instance' AND instances.expiredate > NOW()"; 
$query = mysqli_query($dbConnect, $sql); 
$row = mysqli_fetch_row($query); 

$dbInstance = $row[0]; 

if ($dbInstance == $instance){ 
    echo $dbInstance.'<br>'; 
    echo $instance; 
} else { 
    echo $dbInstance.'<br>'; 
    echo $instance.'<br>'; 
    die('Instance not initiated'); 
} 
?> 

現在我只需要決定如何經常清理數據庫。真的,我想感謝你們的幫助,正是我需要的!

+0

爲什麼不給老師一個*關閉空間*按鈕,將數據庫中的值設置爲false,因此無法訪問?最好保留這樣的東西,以供審查/不快樂的學生復活等。 –

+0

這是我見過的最快的迴應,好主意!將不得不考慮我將如何實現這個想法,以及它是否解決了我所有的問題。謝謝。 –

+0

您需要在數據庫中存儲課程可用時間(開始時間和日期)和持續時間。通過這種方式,您可以將持續時間添加到開始並計算用戶嘗試登錄時類是否關閉 –

回答

3

這類行到期的通常的處理如下:

  1. 把到期DATETIME每排。 INSERT INTO tbl (id, expiration) VALUES (whatever, NOW() + INTERVAL 5 MINUTE)
  2. 查詢行時,請在查詢中使用類似AND tbl.expiration > NOW()的內容。這將使過期的行似乎消失。
  3. 如果方便,也許是一個通宵工作或每小時的情況下,擺脫了過期行:DELETE FROM tbl WHERE tbl.expiration <= NOW()

這是更容易和更多的時間,精確不是試圖實際DELETE有權在到期行他們到期的時刻。它對彈性的DELETE操作失敗也具有適應性,並且可以很好地擴展。

+0

進入INTERVAL路線的問題是你不能使用列值動態設置數字,所以它需要一個具有有限數量選項的'CASE'語句,或者更改php查詢字符串中的值,這可能需要額外的查詢以查找到期分鐘值... – WebChemist

+0

我不確定這是一個大問題還是不是?我只需要3個值,看起來我可以通過寫入INSERT INTO'dbname'.'instances'('instance','expiry')來設置它。VALUES('$ instance',NOW()+ $ duration); –

3

expiry DATETIME添加到教室表中,創建它時會設置它到期的時間。

在教室頁面中,只需比較過期時間和當前時間。

獎勵:如果人們在到期後不嘗試訪問教室,您的數據庫可能會變大。你可以做一個cronjob,在一段時間一次刪除過期的教室:DELETE FROM classroom WHERE expiry < NOW()

1

所以說你的表看起來是這樣的:

CREATE TABLE IF NOT EXISTS sessions (
     classroom_id int(10) unsigned NOT NULL AUTO_INCREMENT, 
     session_key varchar(60) NOT NULL, 
     duration tinyint(3) unsigned NOT NULL, 
     created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
     PRIMARY KEY (classroom_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

和你的時間總是在幾秒鐘內,你可以達到你想要什麼像這樣的一個查詢:

SELECT classroom_id 
FROM sessions 
WHERE session_key = :key 
AND  (UNIX_TIMESTAMP(created) + (duration * 60)) > UNIX_TIMESTAMP(NOW()); 
相關問題