我正在组建一个处理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>


(编辑)
现在这很好用,如果有人需要它,或者您可以建议任何tweek,我会把它放在这里!

<?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 } ?>

最佳答案

这里有很多方面可以评论:


您的表单中没有输入字段“ id”,因此提交表单的人无法传达他们想要标记为已读的id
您假设为变量$ id填充一个值而启用了全局寄存器注册。而是使用$ _POST ['id']
您的数据库查询很容易受到SQL注入攻击,因为您无需检查任何输入。保存到数据库时至少使用intval($ _ POST ['id'])
我认为mysql_query将在PHP5.5中关闭,移至PDO
在一个文件中完成所有操作并没有错,但是好的编程风格是将动作逻辑放在顶部,输出放在底部。
如果您需要将“已读”表扩展到两万行,请使用this
我认为该业务案例也存在缺陷。可能会导致人们单击已读的备忘录,最好的情况是使他们实际阅读但未被理解和记忆。创建点对点测验系统来存储备忘录可能会更好。

09-25 16:59