【问题标题】:Accessing deleted user's information访问已删除用户的信息
【发布时间】:2012-06-15 11:56:24
【问题描述】:

我想跟踪用户的信息,即使他们已从数据库中删除。

我想这样做有两个原因。首先,删除用户后,我想显示一条消息“$name 已成功删除”。其次,我想将被删除用户的名称写入日志文件。

我现在所拥有的不起作用,因为当从数据库中删除用户时,名称变为 NULL(我正在使用 $_SESSION 变量)。有没有办法访问这些信息?最聪明的方法是什么?

【问题讨论】:

    标签: php database logging


    【解决方案1】:

    您在数据库中添加了一个额外字段以表示该记录已“删除”,并在您尝试使用这些记录的任何地方进行适当的过滤,以便不会显示任何“deleted=true”记录,例如登录时:

    SELECT ...
    FROM users
    WHERE (username = '...') AND (password = '...') AND (deleted = FALSE)
    

    这样您将整个用户记录保留在数据库中,但由于已被标记为已删除,因此无法使用。

    【讨论】:

    • 你在不到 5 秒的时间内击败了我 :(
    • 更好的方法是有一个“状态”字段(整数),它可以让您拥有多个状态,并且不必创建另一个数据库列。然后,您只需使用:... AND status!='0' 如果“0”被删除。
    • 作为用户,我不会对此感到高兴。如果我删除了我的帐户,我希望它会被删除。在某些司法管辖区甚至可能是非法的。
    • 你也打败了我! @Joe - 这取决于上下文。您的 T&C 应涵盖您对数据的处理方式。
    • @Polynomial 是的,这只是一个愚蠢的错误。会话变量运行良好。谢谢:-)
    【解决方案2】:

    最聪明的答案是不要删除用户。

    在数据库中有一个列标记用户已被删除,然后将其视为该记录在其余查询中不存在。

    【讨论】:

    • @Joe 设置一个每日 cronjob 来清除超过一周的“已删除”用户是微不足道的。
    • 是的。您可以将其添加到您的答案中。
    • @joe - 从数据保护的角度来看,这也是正确的方法,因为您在请求时不会破坏任何东西。如果您必须保持此表较小,您可以稍后创建一个清洁器
    • @BrianHoover 不同类型的数据保护 - Joe 指的是在用户要求您删除用户信息后“不道德地”存储用户信息。
    • 我说的是一个非常直截了当的情况,我想结束与某个组织的关系。如果我通过请求删除我的帐户来做到这一点,我希望如此。如果按钮显示“暂停帐户”或“阻止我登录但保留我的数据”,那将是另一回事。我认为在英国,组织必须根据要求保持数据最新,这与仅使其无法访问是不相容的。
    【解决方案3】:

    如果你想保留用户的“故事”并通过用户名或 id 访问它,为什么不在用户被删除时添加一个“活动”列,即“假”?

    显然,当您创建用户时,该值将是“True”,并且与通用用户相关的每个操作(但如果您很聪明,我们只说登录)都必须考虑该列值

    【讨论】:

    • 您好,感谢您的回答。但是拥有一个 $_SESSION 变量不是更简单吗?为什么它们在这种情况下不起作用?
    • 因为$_SESSION 是客户端的东西,它会给您带来所有“问题”
    【解决方案4】:

    绝对最好的方法是永远不要删除任何数据。

    您只需在表中添加一个标记为“is_active”(默认值为 true)或“is_deleted”(默认值为 false)的位标志,以指示是否可以访问某条数据。

    如果有人想删除那条信息,您可以交换标志值 - 您还确保在对该表执行的任何查询中使用该标志,以仅查找活动数据。

    【讨论】:

      【解决方案5】:

      如果您只是想在删除确认页面上显示他们的姓名,您可以简单地将姓名作为 GET 参数传递:

      $name = user_get_name($user_id);
      user_delete($user_id);
      
      header('Location: deleted.php?user=' . urlencode($name));
      

      然后,在您的 deleted.php 中,执行以下操作:

      echo 'User "' . htmlspecialchars($_GET['user']) . '" has been deleted.';
      

      仅供参考,htmlspecialchars 电话可以让您免受 XSS 攻击。

      更新:确保您在第二个脚本中调用session_start(),并且在删除用户或注销用户时未取消设置会话变量。

      【讨论】:

        【解决方案6】:

        喜欢:

        $username = $user->get_name(); // OR Copy the object and use the copy for logging and messages
        ......
        
        $user->delete();
        
        $log->write_log('...... $username....');
        

        PS。请记住,在某些国家/地区删除个人资料后存储用户数据是违法的!

        【讨论】:

        • 相当肯定 OP 在第二页中执行此操作,例如确认用户“foo”已被删除,该行已被删除。
        【解决方案7】:

        您总是可以在删除用户之前写入日志文件并显示消息吗?这样,您仍然可以在需要时访问他们的所有信息。

        【讨论】:

        • 您好,感谢您的回答。这并不理想,因为如果用户改变主意反对删除,则会将错误消息发送到日志文件和用户
        • 您将所有三个动作作为同一例程的一部分进行;用户没有机会改变主意。
        • 当他们点击返回时,他们的账户仍然会被删除。
        • 没错,我想让用户改变主意(防止意外删除等等)
        • 所以您放入了一个插页式页面 - “您确定要删除您的帐户吗?这无法撤消”
        【解决方案8】:

        在这里。我最终使用了会话变量(现在有效,这是我的愚蠢错误)。我认为这是最简单的方法,因为我只想要被删除的用户名。同时也消除了是否将已删除用户信息保留在数据库中的窘境

        【讨论】:

          猜你喜欢
          • 2015-02-22
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          相关资源
          最近更新 更多