วันอังคารที่ 16 มกราคม พ.ศ. 2561

การเก็บ Log ลง Database บน YII

[ Yii ตอนที่ 18 ] การเก็บ Log ลง SQL Database บน Yii Framework

เว็บไซท์ในทุกๆเว็บ ควรจะมีการเก็บ Log ต่างๆของ User ในทุกการกระทำไม่ว่าจะเป็น Login, Logout, Update profile, Create, Delete

บทความนี้จะสอนเกี่ยวกับ การ เก็บ Log ของ Action ต่างๆ ครับ

ซึ่ง code ในบทความนี้ผมออกแบบเอง หากผิดพลาดประการใด ขออภัยด้วยนะครับ



1. สร้าง Table ใน Database


CREATE TABLE IF NOT EXISTS `log` (
  `log_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `url_address` tinytext COLLATE utf8_unicode_ci NOT NULL,
  `ip_address` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `log_type` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `log_date` datetime NOT NULL,
  `log_fulltext` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`log_id`),
  KEY `fk_tb_log_user1_idx` (`username`),
  KEY `fk_tb_log_log_type1_idx` (`log_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;


2. สร้าง Class Log ใน protected/components/Log.php

Script จะมีการเก็บค่า username, url address, ip address, log type, log date และ Full text ใช้ในการเก็บรายละเอียดเชิงลึก

<?php
class Log {
 
// public static function datethai( ตัวแปรที่รับ ) {}
public static function save_log($url_address,$log_type,$reference) {

    $username=Yii::app()->user->username;
    //$url_address=$this->getId();
    $ip_address=$_SERVER['REMOTE_ADDR'];
    //$log_type=$this->getAction()->getId();
    $log_date=date('Y-m-d H:i:s');
    //$reference=$this->logMessage;
    // function: insert('ชื่อตาราง', array('ชื่อ Fields' => 'ข้อมูลที่ต้องการ'));
    $conn = Yii::app()->db->createCommand()
        ->insert('log', array(
            'username' => $username,
            'url_address' => $url_address,
            'ip_address' => $ip_address,
            'log_type' => $log_type,
            'log_date' => $log_date,
            'log_fulltext' => 'User '.$username.' '.$log_type.' [ '.$reference.' ] "'.$url_address.'"   From '.$ip_address,
        ));
    

    return "Log Saved";
}

วิธีนำไปใช้ก็ง่ายๆครับ

ใชกับไฟล์ที่อยู่ใน protected/controllers

ทุกครั้งที่มีการกระทำอะไรก็ตาม เช่น update profile

เราก็กำหนด log_type เป็น UpdateProfile

ตัวแปล $reference ใช้ในการเก็บค่าอย่างละเอียด


//  save Log    
$url_address=$this->getId();
$log_type='UpdateProfile';
$reference='UserID='.Yii::app()->user->user_id.' '.$model->firstname.' '.$model->lastname.' '.$model->telephone;
// echo ชื่อ class :: ชื่อ function( ตัวแปรส่งค่า );
Log::save_log($url_address,$log_type,$reference);



ตัวอย่างการนำไปใช้ในการเก็บ  Log Update Profile

อันนี้เป็นตัวอย่างในไฟล์ protected/controllers/SiteController.php

/**
 * Displays the profile page
 */
public function actionUpdateProfile()
{
    $model=$this->loadModel(Yii::app()->user->user_id);

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST['ProfileUser']))
    {
        $model->attributes=$_POST['ProfileUser'];
        if($model->save()){

            Yii::app()->user->setFlash('updateProfile','อัพเดทข้อมูลเสร็จสมบูรณ์');
                            
            //  save Log    
            $url_address=$this->getId();
            $log_type='UpdateProfile';
            $reference='UserID='.Yii::app()->user->user_id.' '.$model->firstname.' '.$model->lastname.' '.$model->telephone;
            // echo ชื่อ class :: ชื่อ function( ตัวแปรส่งค่า );
            Log::save_log($url_address,$log_type,$reference);
                
            $this->refresh();
        }
    }

    $this->render('updateprofile',array(
        'model'=>$model,
    ));
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น