2013-10-27 52 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请求中,你将更新用户已经阅读了备忘录 –

相关问题