2009-10-14 6 views
0

Je me demandais comment modifier mon code afin qu'il puisse compter les pages vues pour chaque page lorsque plusieurs pages sont présentes et afficher les pages vues correctes pour chaque page.Compteur de pages vues utilisant PHP et MySQL?

Voici mon code php ci-dessous.

//Adds one to the counter 
$mysqli = new mysqli("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"UPDATE counter SET counter = counter + 1"); 

//Retreives the current count 
$count = mysqli_fetch_row(mysqli_query($mysqli,"SELECT counter FROM counter")); 

if (!$dbc) 
{ 
    // There was an error...do something about it here... 
    print mysqli_error(); 
} 

Et voici mon code MySQL.

CREATE TABLE `counter` (`counter` INT(20) NOT NULL); 
INSERT INTO counter VALUES (0); 

C'était ma table alternative avant.

CREATE TABLE `counter` (
    `id` int(11) NOT NULL auto_increment, 
    `ip` varchar(15) NOT NULL default '', 
    `page` varchar(100) NOT NULL default '', 
    PRIMARY KEY (`id`), 
KEY `ip` (`ip`,`page`) 
) 

C'était mon ancien comptoir de la page que je suis en train de se combiner avec mon nouveau compteur de page.

//Get the viewer's IP Address and the page he/she is viewing 
$ip = $_SERVER['REMOTE_ADDR']; 
$page = $_SERVER['PHP_SELF']; 

//Check that the IP is not already listed for the current page 
$viewer_check_query = "SELECT * FROM counter WHERE ip = '$ip' AND page = '$page'"; 
$viewer_check_result = mysql_query($viewer_check_query); 
$viewer_check_numrows = mysql_num_rows($viewer_check_result); 
    //If numrows is equal to zero, then the user is new 
    if($viewer_check_numrows == 0){ 
     //Add the new entry 
     $viewer_new_query = "INSERT INTO counter (ip, page) VALUES 
     ('$ip', '$page')"; 
     $viewer_new_result = mysql_query($viewer_new_query); 
    } 

//Get the total number of viewers for this page 
$viewer_total_query = "SELECT * FROM counter WHERE page = '$page'"; 
$viewer_total_result = mysql_query($viewer_total_query); 
$viewer_total_numrows = mysql_num_rows($viewer_total_result); 
+2

devoirs? Qu'avez-vous essayé, quel est votre plan d'action, votre idée de la façon de résoudre ce problème? – markus

+0

quelle autre information auriez-vous besoin de faire cela? Où le rangez-vous? comment voulez-vous l'enregistrer, comment l'interroger? – markus

+0

ne pas publier le code ici, éditez-le à votre question! – markus

Répondre

1

Vous devez ajouter un champ "path" qui contiendra le chemin de votre page.

CREATE TABLE `counter` (`counter` INT(20) NOT NULL, 
      `path` VARCHAR(255) IS NOT NULL); 

Et dans votre requête, vous créez un nouveau compteur vide s'il n'existe pas encore. Et vous l'incrémentez si elle existe déjà.

$mysqli = new mysqli("localhost", "root", "", "sitename"); 

// We get the counter the current URL 
$counter = mysqli_query($mysqli, "SELECT counter 
            FROM counter 
            WHERE `path` = '" . $_SERVER['REQUEST_URI'] . "'"; 
if ($counter === NULL) 
{ 
    // If the counter does not exists yet, we create it 
    mysqli_query($mysqli, "INSERT INTO counter 
          VALUES (0, '" . $_SERVER['REQUEST_URI'] . "')"; 
} 

// And we increment the counter 
mysqli_query($mysqli, "UPDATE counter 
         SET counter = counter + 1 
         WHERE path = '" . $_SERVER['REQUEST_URI'] . "'"); 
+0

Attention, vous devez avoir écrit JS les dernières heures. Vous êtes en train de concaténer avec + au lieu de. – markus

+0

ne serait-il pas suffisant d'écrire simplement 'SET counter ++' – markus

+0

Plus comme, il a écrit dans un langage qui utilise un opérateur de concaténation logique. ;) –

3

Je ne vous recommande pas de mettre à jour la base de données "en direct". Mais plutôt utiliser mod_log_mysql ou analyser le fichier journal Apache "hors ligne".

Pourquoi pas? Vous pourriez vous demander, si vous avez beaucoup de visiteurs un jour, le chargement de la page stagnerait jusqu'à ce que la base de données a été mise à jour. Ou si la base de données est lourdement chargée, la mise à jour retarderait le chargement de la page Web.

Et une astuce, utilisez jQuery ou javascript pour écrire un « logevent » spécial à votre journal apache de sorte que vous ne serez pas enregistrer tous les robots d'exploration, etc. J'utilise le code suivant:

function logger() { 
    var currenturl = location.href; 
    $.get("/logthis", { url: currenturl }); 
} 
$(document).ready(function(){ 
    logger(); 
});