2013-01-07 13 views
6

Klient wymaga, aby wszystkie żądania GET/POST były rejestrowane i przechowywane przez 90 dni dla ich aplikacji. Napisałem HOOK, który wydaje się rejestrować niektóre z GETS/POSTS, ale jest mniej danych, niż się spodziewałem. Na przykład przy przesyłaniu danych formularzy wpisy nie są umieszczane w dzienniku. Czy ktoś napisał coś podobnego, co działa?Codeigniter - haczyk do zalogowania GET/POST REQUESTS

Oto moja wersja tej pory:

class Logging { 

    function __construct() { 
     $this->CI =& get_instance(); 
    } 

    function index() { 
     $this->CI->load->model('Logging_m'); 
     $this->CI->load->model('Portal_m'); 

     //get POST and GET values for LOGGING   
     $post = trim(print_r($this->CI->input->post(), TRUE)); 
     $get = trim(print_r($this->CI->input->get(), TRUE)); 

     $this->CI->Logging_m->logPageView(array(
       'portal_id' => $this->CI->Portal_m->getPortalId(), 
       'user_id' => (!$this->CI->User_m->getUserId() ? NULL : $this->CI->User_m->getUserId()), 
       'domain' => $_SERVER["SERVER_NAME"], 
       'page' => $_SERVER["REQUEST_URI"], 
       'post' => $post, 
       'get' => $get, 
       'ip' => $this->CI->input->ip_address(), 
       'datetime' => date('Y-m-d H:i:s') 
     )); 
    } 

} 

Dane te są przechowywane w modelu o nazwie „Logging_m”, który wygląda tak:

<?php 
class Logging_m extends CI_Model { 

    function __construct() { 
    parent::__construct(); 
    } 

    function logPageView($data) { 
    $this->db->insert('port_logging', $data); 
    } 

} 

/* End of file logging_m.php */ 
/* Location: ./application/models/logging_m.php */ 
+0

Czy możesz opublikować formularz, w którym brakuje jego działań. –

+1

Interesujące pytanie +1. Czy możesz zrobić var_dump z formularza wejściowego i opublikować go obok logu dla tego samego wejścia, abyśmy mogli odszukać różnicę. – WebweaverD

+0

Czy wszystkie wartości w tablicach są ustawione zgodnie z oczekiwaniami, czy jest to tylko informacja GET/POST? Ponadto, jestem po prostu ciekawy, dlaczego używasz print_r, aby zwrócić tablicę $ _POST, gdy $ this-> input-> post() już zwraca dane. Wydaje się, że nie czyścisz danych, tylko je przycinasz. To po prostu wydaje się zbędne. –

Odpowiedz

10

Jak wymieniono Patrick Savalle należy użyć haków . Użyj haka post_controller_constructor, abyś mógł używać wszystkich innych rzeczy CI.

1) ./application/config/config.php ustawione $config['enable_hooks'] = TRUE

2) ./application/config/hooks.php dodać następujące hak

$hook['post_controller_constructor'] = array(
    'class' => 'Http_request_logger', 
    'function' => 'log_all', 
    'filename' => 'http_request_logger.php', 
    'filepath' => 'hooks', 
    'params' => array() 
); 

3) Tworzenie pliku ./application/hooks/http_request_logger.php i dodać następujące kodu jako przykład.

if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class Http_request_logger { 

    public function log_all() { 
     $CI = & get_instance(); 
     log_message('info', 'GET --> ' . var_export($CI->input->get(null), true)); 
     log_message('info', 'POST --> ' . var_export($CI->input->post(null), true));     
     log_message('info', '$_SERVER -->' . var_export($_SERVER, true)); 
    } 

} 

Przetestowałem to i działa dla mnie (upewnij się, że rejestracja została aktywowana w pliku konfiguracyjnym).

+0

Czy można zadeklarować wartość CI jako publiczną w pliku haka? –

+0

@ VipinKr.Singh Patrząc na to ponownie, nie widzę żadnego powodu, aby zadeklarować go poza funkcją. Zmodyfikowałem ten przykład. –

+0

Nic nie pisze na stronie informacyjnej, żadna strona nie jest tworzona z twojego kodu. :( –