Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema cookie con linguaggio php

    Ciao a tutti,
    naviganto per la rete ho trovato uno script, realizzato in PHP, per un conteggio visite.
    Io ho aggiunto un cookie per far si che, anche se la pagina viene aggiornata, il counter non aumenti il valore di 1, ma non funziona.
    Il codice è:
    <?php
    // identificativo numerico della pagina
    $pagina = "1";

    //Data e Ora
    $data_ora = date("H:i:s d/m/Y");

    //Impostazioni cookie
    session_start();
    setcookie('davide','blocco aggiornamento pagina',time()+30);

    // connessione al database MySQL
    mysql_connect("localhost", "nomeutente", "password");
    mysql_select_db("nomedatabase");


    // numero di visite attuali

    $res = mysql_query("UPDATE contatore SET visite = visite + 1 WHERE pagina = $pagina");

    // visualizzo il numero di visite
    $res = mysql_query("SELECT visite FROM contatore WHERE pagina = $pagina");
    $visite = mysql_fetch_assoc($res);
    echo "La pagina è stata visitata ".$visite['visite']." volte
    $data_ora
    ";
    ?>
    Mi sapreste dire dove ho sbaglito

    Grazie,
    Davide

  2. #2
    I cookie, vanno attivati prima di qualsiasi output, anche una riga vuota è considerata come output.
    Quindi tutti i vari setcookie('nome', 'valore'); vanno inseriti all'inizio del file.

    http://it.php.net/manual/it/function.setcookie.php

  3. #3
    Originariamente inviato da the be$t
    I cookie, vanno attivati prima di qualsiasi output, anche una riga vuota è considerata come output.
    Quindi tutti i vari setcookie('nome', 'valore'); vanno inseriti all'inizio del file.

    http://it.php.net/manual/it/function.setcookie.php
    nel codice che ha postato non sembra ci siano echo, print o funzioni che inviino qualcosa al browser, a parte eventuali spazi vuoti che, se ci sono, non penso abbia incollato qui

    il problema potrebbe essere, per lo più, dovuto al fatto che il tempo limite del cookie è stato impostato a 30 secondi dall'accesso della pagina!

    Inoltre, il codice postato invia il cookie, si, ma non verifica se questo è presente per effettuare l'inserimento

    codice:
    <?php
    
    // Avvia la sessione (l'ho lasciato ma con i cookie non ha nulla a che fare)
    session_start();
    
    // Si connette al database MySQL
    mysql_connect("localhost", "nomeutente", "password");
    mysql_select_db("nomedatabase");
    
    // Costruisce il nome del cookie convertendo tutti i caratteri che non sono lettere, numeri, punti, underscore e dash in dash
    $cookieName = '__visited_pages#' . strtolower(preg_replace('/([^A-Z0-9-]+)/i', '-', $_SERVER['PHP_SELF']));
    
    // Imposta, a prescindere, un cookie per identificare l'accesso alla pagina corrente, impostando la scadenza
    // su un anno dal momento del settaggio del cookie in modo che la scadenza sia sempre prolungata
    setcookie($cookieName, $_SERVER['PHP_SELF'], time() + (60 * 60 * 24 * 365), '/');
    
    // Acquisisce il numero di visite
    $query = mysql_unbuffered_query("SELECT visite FROM contatore WHERE pagina = '" . mysql_reale_escape_string($_SERVER['PHP_SELF']) . "'") or die(mysql_error());
    while($row = mysql_fetch_row($query))
    {
        $visite = $row[0];
    }
    mysql_free_result($query);
    
    if (isset($visite) === false)
    {
        $visite = 0;
    }
    
    // Verifica se il cookie è settato ovvero se la pagina è stata già visitata
    if (isset($_COOKIE[$cookieName]) === false)
    {
        // Incrementa il contatore delle visite
        $visite++;
        
        // Aggiorna il database
        $res = mysql_query("INSERT INTO contatore (visite, pagina) VALUES ({$visite}, '" . mysql_reale_escape_string($_SERVER['PHP_SELF']) . "') ON DUPLICATE KEY UPDATE visite = {$visite};") or die(mysql_error());
    
    }
    
    echo "La pagina è stata visitata {$visite} volte
    ";
    
    ?>
    In parole semplici lo script fa partire la sessione e si connette al database, ho spostato questo codice all'inizio perché se non va lui non deve fare altro. Dopo di che costruisce il nome del cookie usando un prefisso, in questo caso __visited_pages# e poi una versione "ripulita" del percorso web della pagina richiesta, ovvero tutto quello che non sono lettere, numeri e trattini viene convertito in trattini.
    Una volta fatto questo setta il cookie a prescindere dal fatto che c'è già o meno, cosi da aggiornare la data della scadenza, dopo di che estrae il numero di visite effettuate a quella pagina e verifica se il cookie è presente o meno in modo che se non è presente incrementa il valore e lo setta usando il replace

    Fatto il tutto visualizza il numero di visite alla pagina.

    Usando questo sistema non hai bisogno di inserire manualmente tutte le pagine nella tabella del database, le inserisce da solo, tu devi semplicemente impostare il campo pagina come chiave primary key di tipo varchar(255)!

    Quando fa l'estrazione non imposta direttamente il valore bensì usa il while in modo da estrarre il valore se c'è, mentre se non c'è non setta la variabile che viene sistemata subito dopo nell'if isset

    Qui ti posto qualche link
    http://www.php.net/mysql_unbuffered_query
    http://www.php.net/mysql_real_escape_string
    http://www.php.net/mysql_fetch_row
    http://www.php.net/mysql_free_result
    http://www.php.net/preg_replace
    http://www.php.net/strtolower
    http://www.php.net/isset

    Riguardo all'insert speciale
    http://dev.mysql.com/doc/refman/5.0/...duplicate.html

  4. #4

    Re:

    Vi spiego meglio cosa sto facendo, per fare un po' di chiarezza...

    In realtà a me non interessa nulla fare il conteggio delle visite, ma mi interessa fare una cosa del genere:

    L'utente "Pierino" visita: "www.sito.it/index.php", quando "Pierino" esegue l'accesso viene creata una tabella chiamata ec_$nick (dove $nick = $mkportals->member['name'] nella quale viene salvato un numero (questo numero deve essere incrementato di 5).
    Solo che bisogna inserire un cookie per far si che, anche se l'utente continua a fare il logout/login, non venga aggiornato il database con n+5. Il cookie deve essere impostato in modo tale che la data di scadenza sia dopo 24h cioè time()+86400.

    Nella tabella devono esserci: id, punti ec, data, ora, $ip_address.
    (dove $ip_address = $mkportals->member['ip']; e punti ec è il numero delle visite).

    Spero sono stato un po' più chiaro

  5. #5
    va bene anche il codice che ho postato, devi semplicemente variare la durata e aggiungere i vari campi oltre all'id di riferimento dell'utente loggato invece di fare una tabella ad hoc per utente

  6. #6

    Re:

    Mi viene fuori questo errore:

    Fatal error: Call to undefined function mysql_reale_escape_string() in C:\Siti Web Locali\Spazio Prove\prova2.php on line 18

    Come faccio per incrementare il valore di 5 ???

    Grazie

  7. #7
    scusami è mysql_real_escape_string

    se dovesse darti di nuovo errore usa mysql_escape_string

  8. #8

    Re:

    Ok grazie ora funziona perfettamente

    Adesso dovrei caricare le funzioni $mkportals e $DB solo che, solitamente uso il global, ma credo che in questo caso non funziona.

    Per ora sono arrivato qui...
    <?php

    // Avvia la sessione (l'ho lasciato ma con i cookie non ha nulla a che fare)
    session_start();

    // Dati
    $ora = date("H:i:s");
    $data = date("j, n, Y");
    $ip_address = $mkportals->member['ip'];
    $nick = $mkportals->member['name']

    // Si connette al database MySQL
    mysql_connect("localhost", "nome", "pass");
    mysql_select_db("nome_db");

    // Creazione tabella

    $DB->query("
    CREATE TABLE IF NOT EXISTS `ec_$nick` (
    `id` int(10) NOT NULL auto_increment,
    `punti` text NOT NULL,
    `data` text NOT NULL,
    `ora` text NOT NULL,
    `Indirizzo ip` text NOT NULL,
    PRIMARY KEY (`id`)
    ) ");

    // Costruisce il nome del cookie convertendo tutti i caratteri che non sono lettere, numeri, punti, underscore e dash in dash
    $cookieName = '__visited_pages#' . strtolower(preg_replace('/([^A-Z0-9-]+)/i', '-', $_SERVER['PHP_SELF']));

    // Imposta, a prescindere, un cookie per identificare l'accesso alla pagina corrente, impostando la scadenza
    // su un anno dal momento del settaggio del cookie in modo che la scadenza sia sempre prolungata
    setcookie($cookieName, $_SERVER['PHP_SELF'], time()+86400, '/');

    // Acquisisce il numero di visite
    $query = mysql_unbuffered_query("SELECT visite FROM contatore WHERE pagina = '" . mysql_real_escape_string($_SERVER['PHP_SELF']) . "'") or die(mysql_error());
    while($row = mysql_fetch_row($query))
    {
    $visite = $row[0];
    }
    mysql_free_result($query);

    if (isset($visite) === false)
    {
    $visite = 0;
    }

    // Verifica se il cookie è settato ovvero se la pagina è stata già visitata
    if (isset($_COOKIE[$cookieName]) === false)
    {
    // Incrementa il contatore delle visite
    $visite++;
    $visite++;
    $visite++;
    $visite++;
    $visite++;

    // Aggiorna il database
    $res = mysql_query("INSERT INTO contatore (visite, pagina) VALUES ({$visite}, '" . mysql_real_escape_string($_SERVER['PHP_SELF']) . "') ON DUPLICATE KEY UPDATE visite = {$visite};") or die(mysql_error());

    }

    echo "La pagina è stata visitata {$visite} volte
    ";

    ?>

  9. #9
    Adesso è tutto apposto

    Grazie mille per l'aiuto !!!

  10. #10
    scusami, ho guardato il codice che hai postato

    è veramente poco sensato fare una tabella per ogni nick, tranne se hai troppe pagine sul sito. inoltre mi pare di capire che tu usi mkportal il che signifa che non si può usare php_self perché si riferisce al nome dello script php ... per non tiene in considerazione i parametri passati via GET

    inoltre come richiami questa pagina?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.