Script compteur de pages

Répondre
jackbocar
le 04/10/2007 à 08:25
jackbocar
Bonjour,

Je recherche une bonne idée pour créer un compteur de pages, ce compteur doit calculer le nombre de fois que la page d'index d'une rubrique a été ouverte, à savoir que sur mon site il y a 17 rubriques et entre 10 et 30 pages par rubrique ; Le tout fonctionnant avec une table SQL.

Je me servais d'un script en PHP4, qui bien entendu ne fonctionne plus en PHP5. J'ai essayé sans aucun succès de mètre à jour ce script pour PHP5.

Voir les fonctions du script dans le wall : http://www.lephpfacile.com/wall/wall-473.php

Pour le moment j'ai créé une page avec tous les scripts des compteurs mais le hic, c'est que tous ces compteurs font appel à un fichier .TXT.

C'est à mon avis, un répertoire inutile avec 17 fichiers .TXT à l'intérieur.

Alors, j'attends vos suggestions pour réaliser ce compteur de pages. Des suggestions avec des bouts de codes, que je puisse tester.

Merci

Jack Bocar
LupusMic
le 04/10/2007 à 08:53
LupusMic
Ça veut dire quoi « ne marche plus » ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 04/10/2007 à 09:54
jackbocar
Bonjour,

Quelque soit les modifications de scripts apportés avec les instructions OBJ ou PROCEDURAL avec connexion à la base :

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$link = mysqli_connect("localhost", "my_user", "my_password", "world");



J'ai systématiquement ces erreurs :

<?php
function updateCompteurs($cle) {
$query = ("select * from compteurs where cle='$cle'");
if ($result = mysqli_query($link, $query)) { //ligne 13
$obj = mysqli_fetch_object($result);
if ($row) {
$cpt = $row->nbHit + 1;
mysqli_query($link, "update compteurs set nbHit = $cpt where cle = '$cle'");
}
}
mysqli_free_result($result);
}
?>


Warning: mysqli_query() expects parameter 1 to be mysqli, null given in F:\www\www.test-net\function_compteur_pages.php on line 13


Idem pour les autres lignes

Si tu veux tester, voici la table :


#
# Structure de la table 'compteurs'
#

CREATE TABLE compteurs (
cle varchar(255) NOT NULL,
nbHit int(11) DEFAULT '0' NOT NULL,
nomComplet varchar(255) NOT NULL,
url varchar(255) NOT NULL,
PRIMARY KEY (cle)
);
#
# Contenu de la table 'compteurs'
#

INSERT INTO compteurs VALUES ( 'page01', '0', 'Première page', 'page01.php');
INSERT INTO compteurs VALUES ( 'page02', '0', 'Deuxième page', 'page02.php');
INSERT INTO compteurs VALUES ( 'page03', '0', 'Troisième page', 'page03.php');
INSERT INTO compteurs VALUES ( 'page04', '0', 'Quatrième page', 'page04.php');
INSERT INTO compteurs VALUES ( 'page05', '0', 'Cinquième page', 'page05.php');
LupusMic
le 04/10/2007 à 10:07
LupusMic
Avec MySQLi, la connexion s'effectue à la création de l'objet :

exemple.php
<?php

$con = new MySQLi('localhost', 'my_user', 'my_password', 'world') ;
$result = $con->query("select*from compteurs where cle='$cle'") ;

while($obj = $result->fetch_object())
{
// Do stuff here
}

?>


Il faut bien sûr balader une référence vers l'objet de connexion, d'où l'intérêt de passer ton compteur du procédural vers de l'orienté objet. Ou alors tu conserve ton objet en global, mais c'est sale !

En PHP5, l'usage d'une variable globale dans un bloc de code doit être impérativement précédée de sa déclaration explicite.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 04/10/2007 à 14:11
jackbocar
Voila, ça fonctionne, si ça intéresse quelqu'un, le code complet :


<?php
function db_connect()
{
$result = new mysqli("localhost", "my_user", "my_password", "world");
if (!$result)
throw new Exception('Could not connect to database server');
else
return $result;
}


function updateCompteurs($cle) {
$conn = db_connect();
$result = mysqli_query($conn, "select * from compteurs where cle='$cle'");
$row = mysqli_fetch_object($result);
if ($row) {
$cpt = $row->nbHit + 1;
mysqli_query($conn, "update compteurs set nbHit = $cpt where cle = '$cle'");
}
mysqli_free_result($result);
}

// --------------------------------

function getCompteurs($cle) {
$conn = db_connect();
$result = mysqli_query($conn, "select * from compteurs where cle='$cle'");
$row = mysqli_fetch_object($result);
if ($row)
$cpt = $row->nbHit;
else
$cpt = 0;
mysqli_free_result($result);
return $cpt;
}

// --------------------------------

function getNom($cle) {
$conn = db_connect();
$result = mysqli_query($conn, "select * from compteurs where cle='$cle'");
$row = mysqli_fetch_object($result);
if ($row)
$res = $row->nomComplet;
else
$res = "";
mysqli_free_result($result);
return $res;
}

// --------------------------------

function getTotalHitsCompteurs() {
$conn = db_connect();
$result = mysqli_query($conn, "select sum(nbHit) as total from compteurs");
$row = mysqli_fetch_object($result);
if ($row)
$total = $row->total;
else
$total = 0;
mysqli_free_result($result);
return $total;
}
?>


La page ou doit s'afficher le compteur :


<html>
<head>
</head>
<body>
<center>
<?php
include "function_compteur_pages.php";
updateCompteurs("page01");
echo "<br /><br />La home page &agrave; &eacute;t&eacute; visit&eacute;e <strong> ".getNom("page01")." </strong> ".getCompteurs("page01")." fois";
?>
</center>
</body>
</html>





la table :


#
# Structure de la table 'compteurs'
#

CREATE TABLE compteurs (
cle varchar(255) NOT NULL,
nbHit int(11) DEFAULT '0' NOT NULL,
nomComplet varchar(255) NOT NULL,
url varchar(255) NOT NULL,
PRIMARY KEY (cle)
);
#
# Contenu de la table 'compteurs'
#

INSERT INTO compteurs VALUES ( 'page01', '0', 'Premi&egrave;re page', 'page01.php');
INSERT INTO compteurs VALUES ( 'page02', '0', 'Deuxi&egrave;me page', 'page02.php');
INSERT INTO compteurs VALUES ( 'page03', '0', 'Troisi&egrave;me page', 'page03.php');
INSERT INTO compteurs VALUES ( 'page04', '0', 'Quatri&egrave;me page', 'page04.php');
INSERT INTO compteurs VALUES ( 'page05', '0', 'Cinqui&egrave;me page', 'page05.php');
LupusMic
le 05/10/2007 à 19:28
LupusMic
Et moi qui pensait être un bourrin. Tiens, une version objet dans le wall, mais pas testée.

C'est pas parfait, mais c'est plus dans l'esprit objet. Et ça tévitera de faire 4 connections MySQL dans la même page !

Pour l'utiliser :
<?php
$dbcon = MySQLi(...) ;
Counter::connect($dbcon) ;

echo "Le site fut frappé". Counter::sum()." fois !" ;

// En supposant que la clé soit le nom du fichier
$counter = Counter::get(__FILE__) ;
$counter->hit() ;

echo "Le site fut frappée". $counter->hits." fois !" ;

?>
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 06/10/2007 à 09:42
jackbocar
Bonjour,

Merci pour ce code, il est bien trop professionnel pour moi, je suis incapable de faire les modifications des erreurs, je ne le comprends pas.

Désolé.

Fatal error: Cannot redefine class constant Counter::FETCH in F:\www\www.test-net\test-compteur.php on line 6

const FETCH = "select sum(nbHit) as sum from compteurs" ;

Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE in F:\www\www.test-net\test-compteur.php on line 56

static public connect(mysqli $con)
{
self::$con = $con ;
}


Jack Bocar
LupusMic
le 06/10/2007 à 13:47
LupusMic
C'est pour ce genre d'erreurs à la con qu'il faut toujours tester ^^;

Un copier-coller malheureux dans le quel il fallait remplacer FETCH par SUM :
<?php
const SUM = "select sum(nbHit) as sum from compteurs" ;
?>


Et l'oublie du mot clé « function » (quelle idée aussi d'introduire ce mot clé inutile) :
<?php
static public function connect(mysqli $con)
{
self::$con = $con ;
}
?>


Très franchement Jackbobar, tu es largement capable de comprendre ce code, et de programmer comme ça. Si tu t'y mets, ça pourrait t'éviter des surprises.

Si tu veux je peux commenter le code pour expliquer pourquoi j'ai fait telle ou telle chose. Comme ça, tu le fais tiens ;)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 06/10/2007 à 14:59
jackbocar
Bonjour LupusMic,

Avec ces Rectifications, ça fonctionne.

<?php
$dbcon = new mysqli('localhost', 'jackbocar', 'password', 'test');
Counter::connect($dbcon);

//echo "Le site fut frappés". Counter::sum()." fois !" ;

$counter = Counter::get(__FILE__);
//$counter->nbhits();

//echo "Le site fut cliqué". $counter->hits." fois !" ;
echo "Le nombre total est de ". Counter::sum()." pages vues !";
?>


En fait ce compteur additionne les cliques des différentes pages.

Comme un script de statistique des clics total du site.

Jack Bocar
jackbocar
le 06/10/2007 à 15:26
jackbocar
La différence avec le mien est tout de même, que le mien calcul chaque clique d'un index.php dans chaque rubrique.

Ensuite, tu peux faire des statistiques sur les pages les plus vues, le nombre total des hits sur l'ensemble du site, Exemple :

Ma page de statistique :

[Home Page] [Page 01] [Page 02] [Page 03] [Page 04] [Page 05] [Statistiques]

Ci-dessous se trouve les statistiques du site

Rang Page Nombre de hits
1 Home page 52
2 Troisième page 12
3 Cinquième page 12
4 Deuxième page 11
5 Première 10
6 Quatrième page 10
Total 107


J'avoue tout de même qu'au point de vue programmation, ton script est de la programmation pure et dure comme je n'en ai jamais fait.

N'oublie pas que je suis un autodidacte, et que tous ce que je connais c'est sur les sites de PHP que je l'ai appri et particulièrement celui du PHPfacile et ce que j'ai appris et apprends encore est dans des livres sur le PHP.

Exemple : Introduction à PHP5 O'Reilly
PHP à 200% O'Reilly
PHP5 le guide complet Micro Application
PHP5 et Mysql 5 CampusPress
Sur aucun de mes ouvrages, il y a un code aussi long avec des fonctions codées.

Les seules fonctions sont en HTML, à la place d'un include, on met do_html_top, ou do_html_footer, do_html_menu etc...

L'avantage est que tout le code HTML est installé sur une page et que tu fais appel à ce code via cette page.

Et pour tous les autres codes comme les compteurs d'index de rubrique idem.

Exemple :

<?php
function display_compteur_home()
{
updateCompteurs("page01");
echo "La ".getNom("page01")." du site &agrave; &eacute;t&eacute; visit&eacute;e <strong class=R>".getCompteurs("page01")."</strong> fois";
include (PATH_INCLUDE.'/_require/nombre_online.php');
}

function display_compteur_accusateurs()
{
updateCompteurs("page025");
echo "La page des ".getNom("page025")." &agrave; &eacute;t&eacute; visit&eacute;e <strong class=R>".getCompteurs("page025")."</strong> fois";
include (PATH_INCLUDE.'/_require/nombre_online.php');
}
?>


Jack Bocar
Répondre
LoadingChargement en cours