2013-10-27 53 views
0

我正在組織一個處理H & S備忘錄的網站,我需要會員確認他們已經閱讀了他們的備忘錄。我已經研究了處理這個問題的方法,它們基於假設成員上次登錄時已經閱讀了備忘錄。我不能使用這種方法,因爲我需要向他們的公司保證他們的工作人員已經閱讀了他們的安全備忘錄。將備忘標記爲已讀

我已經嘗試過這樣做的各種方法,但沒有一個工作得很好。

主要問題是爲他們點擊過的備忘錄選擇正確的ID號碼,然後將其更新爲memo_read表格。任何指針,解決方法或解決方案非常讚賞。

這是我到目前爲止有:

<?php 
$user_id = $user_data['user_id'] ; 
$company_id = $user_data['company']; 
$nothing = ''; 

$result1 = mysql_query ("SELECT `user`, `memo_id` FROM`memo_read` WHERE `user`= '$user_id '") or die(mysql_error()); 
$memo_id_query = ''; 
while($row = mysql_fetch_array($result1)){ 
$memo_id_query .= " AND `id`!= '".$row['memo_id']."'"; 
} 

?> 
<div id="memo"> 
<h7>These are your unread memos!</h7> 
<table class="bit"> 
    <thead><tr><th>Title</th><th>Author</th><th>Time/Date</th><th>Memo</th></tr></thead> 
<?php 
$result = mysql_query ("SELECT `id`, `memos`, `author`, `time`, `title` FROM `memo` WHERE `worker`= 1 AND `company`='$company_id' ".$memo_id_query) or die(mysql_error()); 
while($row = mysql_fetch_array($result)) { 

    $id    = $row['id']; 
    $memo  = $row['memos']; 
    $author  = $row['author']; 
    $time  = $row['time']; 
    $title   = $row['title']; 
    global $id; 
?> 
    <tbody><tr><td><?php echo $title; ?></td> 
    <td><?php echo $author; ?></td> 
    <td><?php echo $time;?></td> 
    <td id="mem"><a class="toggle" href="#.bit" >read/hide</a> 
    <div class="hiddenDiv" ><?php echo $memo; ?><br> 
    <form id="tickmemo" action="" method="post"> 
    <input type="submit" name="submit" value="mark as read"> 
    </form> 
    </div></td></tr><tbody> 
<?php 
} 
if (empty($_POST['submit']) === false) { 
    $q=("INSERT INTO `memo_read` VALUES ('$nothing', '$user_id', '$id') "); 
    $result = mysql_query($q) or die(mysql_error()); 
    } 
?></table></div> 

(編輯) 這是工作,現在很好,我就會把它在這裏是否有人需要它,或者如果你能提出任何tweeks!

<?php 
$user_id = $user_data['user_id'] ; 
$company_id = $user_data['company']; 
$nothing = ''; 
$result1 = mysql_query ("SELECT `user`, `memo_id` FROM`memo_read` WHERE `user`= '$user_id '") or die(mysql_error()); 
$memo_id_query = ''; 
while($row = mysql_fetch_array($result1)){ 
$memo_id_query .= " AND `id`!= '".$row['memo_id']."'"; 
} 
if (isset($_GET['success']) && empty($_GET['success'])) { 
    echo 'You have marked that memo as read!<br>We will send you back in 3 seconds!'; 
    header("Refresh: 3; url=\"http://www.testbed1.tk/login/index.php\""); 
    } else { 
?> 
<div id="memo"> 
<h7>These are your unread memos!</h7> 
<table class="bit"> 
    <thead><tr><th>Title</th><th>Author</th><th>Time/Date</th><th>Memo</th></tr></thead> 
<?php 
$result = mysql_query ("SELECT `id`, `memos`, `author`, `time`, `title` FROM `memo` WHERE `worker`= 1 AND `company`= '$company_id' ".$memo_id_query) or die(mysql_error()); 
while($row = mysql_fetch_array($result)) { 

    $id    = $row['id']; 
    $memo  = $row['memos']; 
    $author  = $row['author']; 
    $time  = $row['time']; 
    $title   = $row['title']; 
?> 
    <tbody><tr><td><?php echo $title; ?></td> 
    <td><?php echo $author; ?></td> 
    <td><?php echo $time;?></td> 
    <td id="mem"><a class="toggle" href="#.bit" >read/hide</a> 
    <div class="hiddenDiv" ><?php echo $memo; ?><br> 
    <form id="tickmemo" action="#" method="post"> 
    <input type="hidden" name="id" value="<?php echo $id;?>" /> 
    <input type="submit" name="submit" value="mark as read"> 
    </form> 
    </div></td></tr><tbody> 
<?php 
} 
$id = $_POST['id']; 
if (empty($_POST['id']) === false) { 
    $q=("INSERT INTO `memo_read` VALUES   (''".mysql_real_escape_string($nothing)."'','".mysql_real_escape_string($user_id)."','".mysql_real_escape_string($id)."') "); 
    $result = mysql_query($q) or die(mysql_error()); 
    header('Location: worker.php?success'); 
    } 
?></table></div> 
<?php } ?> 

回答

1

有廣泛的方面這裏要評論:

  1. 您還沒有輸入字段「ID」在您的形式,因此有人提交表單無法溝通他們想要什麼ID標記爲已讀

  2. 假設寄存器全局變量已打開,變量$ id將填充一個值。取而代之的是使用$ _POST ['id']

  3. 您的數據庫查詢可能導致SQL注入攻擊,因爲您不檢查任何輸入。至少使用INTVAL($ _ POST [「身份證」])保存到數據庫

  4. 的mysql_query將在PHP5.5我覺得被關閉的時候,移動到PDO

  5. 有什麼不妥做全部在一個文件中,但良好的編程風格是將動作邏輯放在最上面,輸出放在最下面。

  6. 如果您需要縮放「讀」表一對夫婦10萬行,請使用this

  7. 我認爲商業案例是有缺陷的爲好。它可能會導致人們點擊備忘錄作爲閱讀,最好是讓他們實際閱讀,但不能理解和記憶。創建點對點測驗系統來記憶備忘可能會更好。

+0

1.我試圖從while循環中獲取'id'字段所以用戶不必添加它,在每個備忘錄末尾都有一個按鈕,我試圖從備忘錄中的按鈕所在的位置拉出備忘錄ID –

+0

2.我的糟糕的全局是從試圖看到得到它的工作,我試圖使用$ _POST,但沒有運氣:( –

+0

3. SQL沒有公開SQL注入攻擊,因爲沒有地方可以放置它,因爲沒有開放的字段或GET信息。 –

0

您的應用程序流程它不是很清楚。您應該有:

  1. 您可以在其中列出未讀備忘錄給用戶的頁面。每個列表項目都應該有一個指向備忘錄描述頁面的鏈接。

  2. 備註說明頁 - 在這個頁面中你實際插入的memo_read表中的user_idmemo_id已被閱讀。

+0

謝謝,我確實有一個擺在首位,但它決定備忘錄的很可能是小的,並在不同的頁面不好看,所以就決定這一做法:( –

+0

是的,但在這你可以很容易地選擇ajax在用戶讀取備忘錄時向服務器發出請求。在ajax請求中,你將更新用戶已經閱讀了備忘錄 –

相關問題