如何使用php和mysql记录用户操作?

时间:2010-03-21 18:48:38

标签: php mysql android-activity logging

我正在使用我的CMS,我希望它能够记录用户和其他管理员的活动。 例如:当新用户注册或管理员发布新帖时 - >更新上次活动。

我想知道什么是最好最简单的方法。

5 个答案:

答案 0 :(得分:14)

  • 在数据库中创建一个表格 记录您的用户活动。
  • 定义各种活动类型 这可能发生在您的应用程序中。
  • 创建一个记录的常用功能 对该表的任何活动。
  • 从任何地方调用该功能 你在中进行有针对性的活动 你的应用。

然后,您可以编写一个报告工具,让您的管理员可以访问这些已记录的活动,您可以按用户,时间和活动类型进行过滤。

在我的日志框架中,我特意标记了可被视为恶意操作的活动,并为其分配了不同的数字威胁值。如果用户的线程值之和达到某个阈值,则我会注销用户。

理想情况下,如果您编写一个应用程序,您可以编写基础结构代码,例如在开始时进行日志记录,然后在以后的所有业务逻辑代码中使用它。

编辑以进行清理:

随着时间的推移,您可能会收集该表中的大量记录。根据您的要求,您可以做不同的事情。

  • 删除超过x天(可能是一年)的所有条目

  • 删除超过x天的某些类型的条目,但保留其他类型的条目更长或永久。

  • 将超过特定阈值的条目移动到存档日志表中。这样可以使主表保持较小,但如果确实需要,可以访问较旧的日志数据。我的评论日志页面上有一个复选框Use archive

答案 1 :(得分:4)

基本答案

不要自己动手,从头开始查看一些现有系统是如何做到的,如果他们的许可证允许,请使用他们的设计和代码(确保记录您使用的代码并向您添加版权声明) CMS某处)。

可能有用的例子

我不确定PHP CMS是做什么的,但我知道Django's管理员应用程序。 Django是用Python实现的,但将这段代码移植到PHP应该相当简单。即使代码不是直接端口,也可以移植设计。

包含日志记录的文件位于models.py中的admin模块中。

一些关键方面:

日志记录表的数据模型:

class LogEntry(models.Model):
  action_time = models.DateTimeField(_('action time'), auto_now=True)
  user = models.ForeignKey(User)
  content_type = models.ForeignKey(ContentType, blank=True, null=True)
  object_id = models.TextField(_('object id'), blank=True, null=True)
  object_repr = models.CharField(_('object repr'), max_length=200)
  action_flag = models.PositiveSmallIntegerField(_('action flag'))
  change_message = models.TextField(_('change message'), blank=True)
  objects = LogEntryManager()

LogEntryManager,它保存实际的日志条目:

class LogEntryManager(models.Manager):
  def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
    e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), object_repr[:200], action_flag, change_message)
    e.save()
HTH,祝你好运!

答案 2 :(得分:2)

我使用两个表进行活动,一个用于为每个活动提供一个id,另一个用于记录用户ID,活动ID和时间戳。我这样做是因为int占用的空间少于字符串,所以为什么要反复记录相同的字符串呢?第二个并不是必需的,你只需将动作代码轻松保存在文本文件中供自己参考,但数据库似乎更容易记住。

在过去,我使用了一个函数来处理实际的日志记录操作,但是下次我这样做时,我将使用Observer模式。它看起来更灵活,而且我已经不得不编辑掉我以前没有记录任何东西的旧代码的日志函数调用。我更喜欢重用代码而不需要编辑。

答案 3 :(得分:0)

使用 PHP / JAVA FUNCTION JQUERY 及其 AJAX 数据发布方法非常简单... 在发布解决方案之前 - 让我们阅读这两行

  

为什么以及我们想要录制什么?   ---我们只知道在数据库中记录交易 - 不是所有的点击和检查 - 但是可以使用这个解决方案....

以下是逐步解决方案: -

1. create a DB Table -- to record these things
     a) Page Name.
     b) logged in user name
     c) session details (To record all the sessions).
     d) POST/GET data details (To record all the post/get data for the       
        page)
     e) Record Created Date.

或您要记录的任何其他内容。     2.创建一个Jquery函数或PHP函数 - 每个页面都会自动触发。     3.此功能将收集该页面的所有会话,用户登录的详细信息以及传递给该页面的数据。 除此之外 - 您还可以记录 - 从哪个页面调用这个新页面 - 即使在已经运行的旧软件中,它也是实现logg记录功能的非常简单和最好的方式:)

如果您想要使用上面提到的所有代码 - 通过NET搜索我已经定义的机制只需要功能代码 - 自动执行功能代码 - 简单

答案 4 :(得分:-1)

PHP 和 MYSQL

  1. 创建一个表来保存日志
CREATE TABLE `test_loq` (
   id int(11) PRIMARY KEY AUTO_INCREMENT,
   page varchar(255) NOT NULL,
   username varchar(255) NOT NULL,
   log_time datetime DEFAULT CURRENT_TIMESTAMP,
   log_action longtext NOT NULL,
   log_name varchar(255) NOT NULL,
   user_id int(11) NOT NULL,
   ip int(11) NOT NULL
   )

解释:

  • log_action 是在此处执行的操作类型,您可以写入有关已执行操作的大量信息。
  • page 是执行操作的页面,php 文件的名称
  • log_name 是已完成操作的名称
  • username 是执行此操作的用户名
  • user_id 是执行此操作的用户的 ID
  • ip是用户的ip地址

2. 创建一个类
class log
{  
    CONST ENVIRONMENT = 'developemnt';

    private $id;
    protected $log_action;
    protected $username;
    protected $page;
    protected $ip;
    protected $log_name;
    private $user_id;

    public function __construct(string $log_action, string $username, string $log_name)
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        
        if(!empty($_SESSION['id'])){
            $id = $_SESSION['id'];
        } else {
            $id = 0;
        }
        $this->log_action = $log_action;
        $this->username = $username;
        $this->log_name = $log_name;
        $this->user_id = $id;
        $this->page =  basename($_SERVER['PHP_SELF']);
        $this->ip = $ip;
    }

    public function createAction()
    {
        global $conn;

        if(!$conn) {
           echo mysqli_error($conn); die;
        }
        $sql = "INSERT INTO test_log (`log_action`,`username`,`log_name`,`page`,`user_id`,`ip`) values ('".$this->log_action."','".$this->username."','".$this->log_name."','".$this->page."','".$this->user_id."','".$this->ip."')" ;
        $sql_query = mysqli_query($conn,$sql);
        if(!$sql_query){
            echo mysqli_error($conn); die;
        }

        if(ENVIRONMENT == 'development'){
            $_SESSION['msg'] = 'A new log was created ' . $this->log_name;
        }
        
    } }

解释:
  • ENVIRONMENT 可以是 development 或 production ,如果它正在开发中,它将显示有关已制作日志的闪存消息
    3.记录一个动作!
    示例:登录尝试的日志操作 创建一个 php 文件 logincheck.php
    <?php 
    session_start();
    include("include/configurationadmin.php");
    //include_once('../include/classes/config.inc.php');
    
    $username = $_REQUEST['username'];
    $password = $_REQUEST['password'];
    $sql  = mysqli_query($conn,"select * from ".$sufix."admin where username='".$username."'") ;
    

// HERE HOW TO LOG ACTION

    $log = new log("Logging in attempt from $username" , $username ,'Login Attempt' );
    $log->createAction();
    
//SIMPLE AND COOL RIGHT?

    if(mysqli_num_rows($sql) > 0)
    {
        $rows = mysqli_fetch_assoc($sql);
        if(md5($password) == $rows['password']) {
            $_SESSION['id'] = $rows['id'];
            $_SESSION['username'] = $rows['username'];
            $_SESSION['usertype'] = $rows['type'];
            mysqli_query($conn,"update ".$sufix."admin set lastlogin='".date('Y-m-d')."' where id = '".$rows['id']."' and username='".$rows['username']."'") ;
            $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
            setcookie('rrdssrdda', $rows['id'], time()+120, '/', $domain, false);
            header("Location: http://localhost/test/admin-new/dashboard");
            exit();
        } else {
            $_SESSION['message']="<div class='alert alert-danger' role='alert'>Invalid userid/password!</div>";
            header("Location: http://localhost/test/admin-new/");
            exit();
    
        }
    
    } else { 
        $_SESSION['message']="<div class='alert alert-danger' role='alert'>Invalid userid/password!</div>";
        header("Location: http://localhost/test/admin-new/");
        exit();
       
   } ?>

快乐编码!