Concrètement, il faudra donc dans un premier temps créer une table
[comment?] dans laquelle sera stockée les URLs et les compteurs. Vous pouvez pour cela vous appuyer sur la requête SQL
[c'est quoi?] suivante
CREATE TABLE clics (id INTEGER AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(128) UNIQUE NOT NULL,
compteur INTEGER DEFAULT 0)
|
- Cette requête, parce qu'elle déclare un champ auto incrémenté, ne fonctionnera pas avec toutes les bases de données. Elle fonctionne toutefois au moins avec SQLite[c'est quoi?] 2 et MySQL.
|
Cette table devra être alimentée, soit avec un outil d'administration de votre base ou via des requêtes du type
INSERT INTO clics (url) VALUES ($url)
Voici un exemple de création et alimentation de la table, via un script PHP, pour une base SQLite
[c'est quoi?]:
<?php
$base = 'phpfacile_compteclic.sqlite';
try {
$bd = new SQLiteDatabase($base);
} catch (SQLiteException $e) {
die("La creation ou l'ouverture de la base [$base] a echouee ".
"pour la raison suivante: ".$e->getMessage());
}
// Creation de la table
$sql = "CREATE TABLE clics (id INTEGER AUTO_INCREMENT PRIMARY KEY,".
"url VARCHAR(128) UNIQUE NOT NULL,".
"compteur INTEGER DEFAULT 0)";
$reponse = $bd->queryExec($sql, $err);
if ($reponse === FALSE) {
echo "La requete CREATE a echouee pour la raison suivante: ".$err;
$bd = null;
die();
}
$urls = array("http://www.phpfacile.com/?testcompteurdeclics",
"http://www.sqlfacile.com/?testcompteurdeclics");
foreach ($urls as $url) {
$sql = "INSERT INTO clics (url) VALUES ('".$url."')";
$reponse = $bd->queryExec($sql, $err);
if ($reponse === FALSE) {
echo "L'url [$url] n'a pu etre ajoutee pour la raison suivante: ".$err;
}
}
// Deconnexion
$bd = null;
?>
Voici un exemple d'implémentation du script pour SQLite
<?php
$base = 'phpfacile_compteclic.sqlite';
$urlId = $_GET["urlid"];
function recupereURL($id, $base)
{
// Controle de securite: Est-ce que id est un entier ?
if ((intVal($id) != $id) || strlen($id) == 0) return false;
try {
$bd = new SQLiteDatabase($base);
} catch (SQLiteException $e) {
echo "L'ouverture de la base [$base] a echouee ".
"pour la raison suivante: ".$e->getMessage();
return false;
}
// REM: $id a ete controle avec d'etre utilise dans la requete
$sql = "SELECT url FROM clics WHERE id=".$id;
$reponse = $bd->query($sql, SQLITE_BOTH, $err);
if ($reponse === FALSE) {
echo "La requete a echouee pour la raison suivante: ".$err;
} else {
if ($row = $reponse->fetch()) {
$bd = null; // deconnexion
return $row["url"];
}
}
$bd = null; // deconnexion
return false;
}
function incrementeCompteur($id, $base)
{
// Controle de securite: Est-ce que id est un entier ?
if ((intVal($id) != $id) || strlen($id) == 0) return false;
try {
$bd = new SQLiteDatabase($base);
} catch (SQLiteException $e) {
echo "L'ouverture de la base [$base] a echouee ".
"pour la raison suivante: ".$e->getMessage();
return false;
}
// REM: $id a ete controle avec d'etre utilise dans la requete
$sql = "UPDATE clics SET compteur=compteur+1 WHERE id=".$id;
$reponse = $bd->queryExec($sql, $err);
if ($reponse === FALSE) {
//Ne rien afficher sinon, la redirection risque de ne pas fonctionner
//echo "La requete a echouee pour la raison suivante: ".$err;
}
$bd = null; // deconnexion
}
$url = recupereURL($urlId, $base);
if ($url === FALSE) {
die("Identifiant d'URL inconnu");
}
incrementeCompteur($urlId, $base);
header("Location: ".$url);
die();
?>
Pour connaître la valeur des compteurs il suffit de faire une requête SQL de type SELECT comme nous avons pu le voir dans les chapitres dédiés aux différentes bases de données. Voici, un exemple d'implémentation pour SQLite:
<?php
$base = 'phpfacile_compteclic.sqlite';
try {
$bd = new SQLiteDatabase($base);
} catch (SQLiteException $e) {
die("La creation ou l'ouverture de la base [$base] a echouee ".
"pour la raison suivante: ".$e->getMessage());
}
// Lecture des donnees dans la table
$sql = "SELECT * FROM clics";
$reponse = $bd->query($sql, SQLITE_BOTH, $err);
if ($reponse === FALSE) {
echo "La requete a echouee pour la raison suivante: ".$err;
} else {
echo "Voici le decompte des clics:<br />\n";
while ($row = $reponse->fetch()) {
echo $row['url'].": ".$row['compteur']." clic(s)<br />\n";
}
}
// Deconnexion
$bd = null;
?>