Laravel visitatori contatore

Sto cercando di costruire un contatore visitatori in Laravel….

Non so che cosa il posto migliore è quello di mettere il codice in modo che si carichi su OGNI pagina… Ma ho messo all’interno del routes.php….

Penso che un posto migliore all’interno del basecontroller?

Ma va bene, il Mio codice simile a questo ora:

    //stats

$date = new \DateTime;

$check_if_exists = DB::table('visitor')->where('ip', $_SERVER['REMOTE_ADDR'])->first();

$get_visit_day = DB::table('visitor')->select('visit_date')->where('ip', $_SERVER['REMOTE_ADDR'])->first();

$value = date_create($get_visit_day->visit_date);

if(!$check_if_exists)
{

    DB::table('visitor')->insert(array('ip' => $_SERVER['REMOTE_ADDR'], 'hits' => '1', 'visit_date' => $date));

}else{

    DB::table('visitor')->where('ip', $_SERVER['REMOTE_ADDR'])->increment('hits');
}


$value = date_create($get_visit_day->visit_date);

if ($check_if_exists && date_format($value, 'd') != date('d')) {

    DB::table('visitor')->insert(array('ip' => $_SERVER['REMOTE_ADDR'], 'hits' => '1', 'visit_date' => $date));
}

Che funziona bene, ma il problema è che il mio colonne del database sempre aggiungere un nuovo valore.

Quindi questo è il mio database:
Laravel visitatori contatore

Dalla tabella ‘visitatore’.

Mantiene l’aggiunta di una nuova IP, colpire e visit_date…

Come è possibile aggiornare solo le hit di oggi (il giorno) e se il giorno è passato, per impostare un IP nuovo valore e di conteggio in quella colonna?

InformationsquelleAutor Robin | 2015-04-17

 

4 Replies
  1. 13

    Io non sono sicuro al 100% su questo, ma si dovrebbe essere in grado di fare qualcosa di simile a questo. Non è testato, e non ci può essere un modo più elegante per farlo, ma è un punto di partenza per voi.

    Modificare la tabella

    Modificare il visit_date (datetime) colonna in visit_date (date) e visit_time (time) colonne, quindi creare un id colonna di chiave primaria. Infine, impostare ip + date essere una chiave unica per garantire che non si può avere lo stesso IP inserito due volte per un giorno.

    Creare un Eloquente modello

    Questo è solo per facilità: un Eloquente di un modello di tabella quindi non è necessario utilizzare Fluentemente (query builder) per tutto il tempo:

    class Tracker extends Eloquent {
    
        public $attributes = [ 'hits' => 0 ];
    
        protected $fillable = [ 'ip', 'date' ];
        protected $table = 'table_name';
    
        public static function boot() {
            //Any time the instance is updated (but not created)
            static::saving( function ($tracker) {
                $tracker->visit_time = date('H:i:s');
                $tracker->hits++;
            } );
        }
    
        public static function hit() {
            static::firstOrCreate([
                      'ip'   => $_SERVER['REMOTE_ADDR'],
                      'date' => date('Y-m-d'),
                  ])->save();
        }
    
    }

    Ora si dovrebbe essere in grado di fare quello che si desidera semplicemente chiamando questo:

    Tracker::hit();
    • Forse basta usare un composto unico tasto. La chiave primaria può ancora essere semplicemente uno standard con incremento automatico ID, che sarebbe probabilmente fare di meglio.
    • sì, che probabilmente funziona meglio, guardando indietro su di esso. Originariamente stavo pensando che si potrebbe utilizzare per fare firstOrCreate si limita al giorno/ip combinazione, ma dal momento che viene specificato nel Eloquente comunque ridondante
    • Call to undefined method Illuminare\Database\Query\Builder::firstOrCreate() è l’errore che ricevo…
    • Ho il sospetto che forse ho sbagliato l’impostazione per firstOrCreate – controllare il post aggiornato che possa funzionare ora. Docs sono laravel.com/docs/4.2/eloquent#insert-update-delete se avete bisogno di
    • Ora l’errore è cambiato solo il messaggio “ip”, schermo può essere trovato qui: prntscr.com/6usgqs
    • risolto; ha solo bisogno di essere contrassegnati come ‘compilabile’. Detto questo, Martin risposta qui sotto sembra molto più elegante rispetto al mio ed è probabilmente la pena di verificare
    • La tua versione non aggiunge più volte lo stesso indirizzo IP, Se cambio il giorno, quindi non aggiorna la data di ritorno, oggi si continua a contare…

  2. 5

    Guardando il tuo codice e leggendo la tua descrizione, sto supponendo che si desidera calcolare il numero di visite da un indirizzo IP al giorno. Si potrebbe fare questo utilizzando Eloquente del updateOrNew() metodo:

    $ip = Request::getClientIp();
    $visit_date = Carbon::now()->toDateString();
    
    $visitor = Visitor::findOrNew(compact('ip', 'visit_date'));
    $visitor->increment('hits');

    Tuttavia, vorrei aggiungere a questo una coda, in modo che si stanno colpendo il database ad ogni richiesta e incrementare il vostro conteggio può essere fatto attraverso un processo in background:

    Queue::push('RecordVisit', compact('ip', 'visit_date'));

    In termini di dove bootstrap questo, il App::before() filtro suona come un buon candidato:

    App::before(function($request)
    {
        $ip = $request->getClientIp();
        $visit_date = Carbon::now()->toDateString();
    
        Queue::push('RecordVisit', compact('ip', 'visit_date'));
    );

    Si potrebbe fare un ulteriore passo in ascolto per questo evento in un fornitore di servizi e sparare la tua coda di lavoro, in modo che il contatore visite è il suo componente indipendente e può essere aggiunto o rimosso facilmente da questo e altri progetti.

    • Dove devo posizionare i primi codici?
    • Dove mai si vuole registrare una visita. Io suggerirei l’ App::before() filtro.
    • Quando ho messo il tutto dentro app::before() , mi dà questo errore: prntscr.com/6utyyk Il App::before() assomiglia a questo: prntscr.com/6utzmf
    • Mi dispiace, il metodo chiamato getClientIp(), oppure è possibile utilizzare il più breve ip() metodo. Ho aggiornato la mia risposta.
    • Non funziona… ho messo tutto all’interno del App::before(), ma ancora, ho creato un modello di calles Visitor, ma non funziona…. l’errore che ricevo: Call to undefined method Illuminare\Database\Query\Builder::updateOrNew()
    • Scusa, il mio male di nuovo. Provare findOrNew() invece. Ho scritto il codice per il bracciale.

  3. 3

    Grazie a @Joe per aiutare me fulley fuori!

    @Martin, è anche grazie, ma gli script di @Joe ha lavorato per il mio problema.

    La soluzione:

    Tracker::hit();

    All’interno della mia App::la prima();

    E una nuova classe:

    <?php
    
    class Tracker Extends Eloquent {
    
        public $attributes = ['hits' => 0];
    
        protected $fillable = ['ip', 'date'];
    
        public $timestamps = false;
    
        protected $table = 'visitor';
    
        public static function boot() {
            //When a new instance of this model is created...
            static::creating(function ($tracker) {
                $tracker->hits = 0;
            } );
    
            //Any time the instance is saved (create OR update)
            static::saving(function ($tracker) {
                $tracker->visit_date = date('Y-m-d');
                $tracker->visit_time = date('H:i:s');
                $tracker->hits++;
            } );
        }
    
        //Fill in the IP and today's date
        public function scopeCurrent($query) {
            return $query->where('ip', $_SERVER['REMOTE_ADDR'])
                         ->where('date', date('Y-m-d'));
        }
    
        public static function hit() {
            static::firstOrCreate([
                      'ip'   => $_SERVER['REMOTE_ADDR'],
                      'date' => date('Y-m-d'),
                  ])->save();
        }
    }

    Denominato ‘tracker’ 🙂

  4. 0
    public $attributes = ['hits' => 0];
    
    protected $fillable = ['ip', 'date'];
    
    public $timestamps = false;
    
    protected $table = 'trackers';
    
    public static function boot() {
        //When a new instance of this model is created...
        parent::boot();
        static::creating(function ($tracker) {
            $tracker->hits = 0;
        } );
    
        //Any time the instance is saved (create OR update)
        static::saving(function ($tracker) {
            $tracker->visit_date = date('Y-m-d');
            $tracker->visit_time = date('H:i:s');
            $tracker->hits++;
        } );
    }
    
    //Fill in the IP and today's date
    public function scopeCurrent($query) {
        return $query->where('ip', $_SERVER['REMOTE_ADDR'])
                     ->where('date', date('Y-m-d'));
    }
    
    public static function hit() {
       /* $test= request()->server('REMOTE_ADDR');
        echo $test;
        exit();*/
        static::firstOrCreate([
                  'ip'   => $_SERVER['REMOTE_ADDR'],
    
                  'date' => date('Y-m-d'),
                 //exit()
              ])->save();
    
    }

    In laravel 5.7 e ‘ richiesto parent::boot() in caso contrario verrà visualizzato Undefined index: App\Tracker
    https://github.com/laravel/framework/issues/25455

Lascia un commento