Compare commits

..

1 Commits

Author SHA1 Message Date
JLuc 0a56d1b3ea str_ireplace fait le job 2 years ago
  1. 145
      .gitattributes
  2. 7
      .gitignore
  3. 11
      CHANGELOG.md
  4. 3
      README.md
  5. 44
      action/statistiques_archiver.php
  6. 12
      base/delete_referers.php
  7. 16
      base/delete_stats.php
  8. 98
      base/stats.php
  9. 18
      composer.json
  10. 161
      css/spip_d3_graph.css
  11. 19
      css/spip_d3_statistiques.css
  12. 3
      exec/base_delete_referers.php
  13. 3
      exec/base_delete_stats.php
  14. 4
      formulaires/configurer_compteur.html
  15. 11
      formulaires/configurer_compteur.php
  16. 24
      genie/popularites.php
  17. 153
      genie/visites.php
  18. 153
      inc/referenceurs.php
  19. 62
      inc/statistiques.php
  20. 72
      inc/stats_referers_to_array.php
  21. 223
      inc/stats_visites_to_array.php
  22. 1428
      javascript/excanvas.js
  23. 3168
      javascript/jquery.flot.js
  24. 360
      javascript/jquery.flot.selection.js
  25. 432
      javascript/jquery.flot.time.js
  26. 736
      javascript/jquery.tflot.js
  27. 258
      javascript/spip_d3_graph.js
  28. 358
      javascript/spip_d3_statistiques.js
  29. 125
      lang/statistiques.xml
  30. 19
      lang/statistiques_ar.php
  31. 19
      lang/statistiques_de.php
  32. 21
      lang/statistiques_en.php
  33. 22
      lang/statistiques_es.php
  34. 1
      lang/statistiques_fa.php
  35. 19
      lang/statistiques_fr.php
  36. 19
      lang/statistiques_fr_fem.php
  37. 19
      lang/statistiques_fr_tu.php
  38. 19
      lang/statistiques_it.php
  39. 5
      lang/statistiques_km.php
  40. 3
      lang/statistiques_nl.php
  41. 1
      lang/statistiques_pt.php
  42. 19
      lang/statistiques_pt_br.php
  43. 3
      lang/statistiques_ru.php
  44. 4
      lang/statistiques_sk.php
  45. 25
      lang/statistiques_uk.php
  46. 1438
      lib/d3/API.md
  47. 1655
      lib/d3/CHANGES.md
  48. 13
      lib/d3/LICENSE
  49. 78
      lib/d3/README.md
  50. 20302
      lib/d3/d3.js
  51. 2
      lib/d3/d3.min.js
  52. 10
      lib/d3/time-format/locale/ar-EG.json
  53. 10
      lib/d3/time-format/locale/ar-SY.json
  54. 10
      lib/d3/time-format/locale/ca-ES.json
  55. 10
      lib/d3/time-format/locale/cs-CZ.json
  56. 10
      lib/d3/time-format/locale/da-DK.json
  57. 10
      lib/d3/time-format/locale/de-CH.json
  58. 10
      lib/d3/time-format/locale/de-DE.json
  59. 10
      lib/d3/time-format/locale/en-CA.json
  60. 10
      lib/d3/time-format/locale/en-GB.json
  61. 10
      lib/d3/time-format/locale/en-US.json
  62. 10
      lib/d3/time-format/locale/es-ES.json
  63. 10
      lib/d3/time-format/locale/es-MX.json
  64. 10
      lib/d3/time-format/locale/fa-IR.json
  65. 10
      lib/d3/time-format/locale/fi-FI.json
  66. 10
      lib/d3/time-format/locale/fr-CA.json
  67. 10
      lib/d3/time-format/locale/fr-FR.json
  68. 10
      lib/d3/time-format/locale/he-IL.json
  69. 10
      lib/d3/time-format/locale/hr-HR.json
  70. 10
      lib/d3/time-format/locale/hu-HU.json
  71. 10
      lib/d3/time-format/locale/it-IT.json
  72. 10
      lib/d3/time-format/locale/ja-JP.json
  73. 10
      lib/d3/time-format/locale/ko-KR.json
  74. 10
      lib/d3/time-format/locale/mk-MK.json
  75. 10
      lib/d3/time-format/locale/nb-NO.json
  76. 10
      lib/d3/time-format/locale/nl-BE.json
  77. 10
      lib/d3/time-format/locale/nl-NL.json
  78. 10
      lib/d3/time-format/locale/pl-PL.json
  79. 10
      lib/d3/time-format/locale/pt-BR.json
  80. 10
      lib/d3/time-format/locale/ru-RU.json
  81. 10
      lib/d3/time-format/locale/sv-SE.json
  82. 10
      lib/d3/time-format/locale/tr-TR.json
  83. 10
      lib/d3/time-format/locale/uk-UA.json
  84. 10
      lib/d3/time-format/locale/vi-VN.json
  85. 10
      lib/d3/time-format/locale/zh-CN.json
  86. 10
      lib/d3/time-format/locale/zh-TW.json
  87. 8478
      lib/luxon/luxon.js
  88. 1
      lib/luxon/luxon.min.js
  89. 9
      paquet.xml
  90. 15
      phpcs.xml.dist
  91. 672
      phpstan-baseline.neon
  92. 12
      phpstan.neon.dist
  93. 2
      prive/squelettes/contenu/stats_lang.html
  94. 22
      prive/squelettes/contenu/stats_lang_fonctions.php
  95. 34
      prive/squelettes/contenu/stats_referers.html
  96. 48
      prive/squelettes/contenu/stats_repartition_fonctions.php
  97. 2
      prive/squelettes/contenu/stats_visites.html
  98. 17
      prive/squelettes/inclure/stats-visites-data.html
  99. 39
      prive/squelettes/inclure/stats-visites-data_fonctions.php
  100. 52
      prive/squelettes/inclure/stats-visites-jours-resume.html
  101. Some files were not shown because too many files have changed in this diff Show More

145
.gitattributes vendored

@ -0,0 +1,145 @@
* text=auto !eol
action/statistiques_archiver.php -text
base/delete_referers.php -text
base/delete_stats.php -text
base/stats.php -text
/engines-list.txt -text
exec/base_delete_referers.php -text
exec/base_delete_stats.php -text
formulaires/configurer_compteur.html -text
formulaires/configurer_compteur.php -text
genie/popularites.php -text
genie/visites.php -text
inc/referenceurs.php -text
inc/statistiques.php -text
inc/stats_referers_to_array.php -text
inc/stats_visites_to_array.php -text
javascript/excanvas.js -text
javascript/jquery.flot.js -text
javascript/jquery.flot.selection.js -text
javascript/jquery.flot.time.js -text
javascript/jquery.tflot.js -text
lang/paquet-stats.xml -text
lang/paquet-stats_br.php -text
lang/paquet-stats_de.php -text
lang/paquet-stats_eo.php -text
lang/paquet-stats_es.php -text
lang/paquet-stats_fa.php -text
lang/paquet-stats_fr_fem.php -text
lang/paquet-stats_fr_tu.php -text
lang/paquet-stats_it.php -text
lang/paquet-stats_lb.php -text
lang/paquet-stats_nl.php -text
lang/paquet-stats_oc_ni_mis.php -text
lang/paquet-stats_pt.php -text
lang/paquet-stats_pt_br.php -text
lang/paquet-stats_ru.php -text
lang/paquet-stats_sk.php -text
lang/paquet-stats_uk.php -text
lang/statistiques.xml -text
lang/statistiques_ar.php -text
lang/statistiques_ast.php -text
lang/statistiques_ay.php -text
lang/statistiques_bg.php -text
lang/statistiques_br.php -text
lang/statistiques_bs.php -text
lang/statistiques_ca.php -text
lang/statistiques_co.php -text
lang/statistiques_cpf.php -text
lang/statistiques_cpf_hat.php -text
lang/statistiques_cs.php -text
lang/statistiques_da.php -text
lang/statistiques_de.php -text
lang/statistiques_el.php -text
lang/statistiques_en.php -text
lang/statistiques_en_hx.php -text
lang/statistiques_eo.php -text
lang/statistiques_es.php -text
lang/statistiques_eu.php -text
lang/statistiques_fa.php -text
lang/statistiques_fi.php -text
lang/statistiques_fon.php -text
lang/statistiques_fr.php -text
lang/statistiques_fr_fem.php -text
lang/statistiques_fr_tu.php -text
lang/statistiques_gl.php -text
lang/statistiques_hac.php -text
lang/statistiques_he.php -text
lang/statistiques_hu.php -text
lang/statistiques_id.php -text
lang/statistiques_is.php -text
lang/statistiques_it.php -text
lang/statistiques_it_fem.php -text
lang/statistiques_ja.php -text
lang/statistiques_km.php -text
lang/statistiques_lb.php -text
lang/statistiques_my.php -text
lang/statistiques_nb.php -text
lang/statistiques_nl.php -text
lang/statistiques_no.php -text
lang/statistiques_oc_auv.php -text
lang/statistiques_oc_gsc.php -text
lang/statistiques_oc_lms.php -text
lang/statistiques_oc_lnc.php -text
lang/statistiques_oc_ni.php -text
lang/statistiques_oc_ni_la.php -text
lang/statistiques_oc_ni_mis.php -text
lang/statistiques_oc_prv.php -text
lang/statistiques_oc_va.php -text
lang/statistiques_pl.php -text
lang/statistiques_pt.php -text
lang/statistiques_pt_br.php -text
lang/statistiques_ro.php -text
lang/statistiques_ru.php -text
lang/statistiques_sk.php -text
lang/statistiques_sv.php -text
lang/statistiques_tr.php -text
lang/statistiques_uk.php -text
lang/statistiques_vi.php -text
lang/statistiques_zh.php -text
prive/bouton/statistiques.html -text
prive/squelettes/contenu/stats_archiver.html -text
prive/squelettes/contenu/stats_lang.html -text
prive/squelettes/contenu/stats_lang_fonctions.php -text
prive/squelettes/contenu/stats_referers.html -text
prive/squelettes/contenu/stats_repartition.html -text
prive/squelettes/contenu/stats_repartition_fonctions.php -text
prive/squelettes/contenu/stats_visites.html -text
prive/squelettes/inclure/admin_effacer_stats.html -text
prive/squelettes/inclure/admin_stats_archiver.html -text
prive/squelettes/inclure/stats-visites-data.html -text
prive/squelettes/inclure/stats-visites-data_fonctions.php -text
prive/squelettes/inclure/stats-visites-jours.html -text
prive/squelettes/inclure/stats-visites-jours_fonctions.php -text
prive/squelettes/inclure/stats-visites-mois.html -text
prive/squelettes/inclure/stats-visites-mois_fonctions.php -text
prive/squelettes/inclure/stats-visites-populaires.html -text
prive/squelettes/navigation/stats_archiver.html -text
prive/squelettes/top/stats_lang.html -text
prive/squelettes/top/stats_referers.html -text
prive/squelettes/top/stats_repartition.html -text
prive/squelettes/top/stats_visites.html -text
prive/stats/visites.html -text
prive/style_prive_plugin_stats.html -text
prive/themes/spip/images/licence.txt -text
prive/themes/spip/images/referers-16.png -text
prive/themes/spip/images/referers-24.png -text
prive/themes/spip/images/referers-32.png -text
prive/themes/spip/images/repartition-16.png -text
prive/themes/spip/images/repartition-24.png -text
prive/themes/spip/images/repartition-32.png -text
prive/themes/spip/images/statistique-16.png -text
prive/themes/spip/images/statistique-24.png -text
prive/themes/spip/images/statistique-32.png -text
prive/themes/spip/images/zoomin-16.png -text
prive/themes/spip/images/zoomin-24.png -text
prive/themes/spip/images/zoomin-32.png -text
prive/themes/spip/images/zoomout-16.png -text
prive/themes/spip/images/zoomout-24.png -text
prive/themes/spip/images/zoomout-32.png -text
prive/transmettre/statistiques.html -text
public/stats.php -text
/stats_administrations.php -text
/stats_autoriser.php -text
/stats_ieconfig.php -text
/stats_pipelines.php -text

7
.gitignore vendored

@ -1,7 +0,0 @@
/vendor/
/composer.phar
/composer.lock
/phpcs.xml
/phpstan.neon
/.php_cs.cache
/.php_cs.txt

11
CHANGELOG.md

@ -1,11 +0,0 @@
# Changelog
## [Unreleased]
### Added
- Fichier `README.md`
### Changed
- Nécessite SPIP 4.2.0-dev minimum

3
README.md

@ -1,3 +0,0 @@
# Plugin Statistiques
Ce plugin compatibilise les statistiques de visites sur le site

44
action/statistiques_archiver.php

@ -18,7 +18,7 @@
* @package SPIP\Stats\Actions
**/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -64,15 +64,14 @@ function action_statistiques_archiver_dist($arg = null) {
minipres();
}
if (
!in_array($arg, [
if (!in_array($arg, array(
'archiver_visites_articles',
'nettoyer_visites_articles',
'nettoyer_referers_articles'
])
))
) {
include_spip('inc/minipres');
minipres('Argument non compris');
minipres("Argument non compris");
}
$func = 'statistiques_' . $arg;
@ -174,7 +173,7 @@ function statistiques_archiver_visites_articles() {
statistiques_concatener_visites_par_an($annee_par_an);
}
statistiques_archiver_log('* Optimiser la table spip_visites_articles après les travaux.');
statistiques_archiver_log("* Optimiser la table spip_visites_articles après les travaux.");
sql_optimize('spip_visites_articles');
}
@ -223,7 +222,7 @@ function statistiques_concatener_visites_entre_jours($annee, $debut, $fin) {
$fin = str_pad($fin, 2, '0', STR_PAD_LEFT);
statistiques_archiver_log("\nConcaténer les visites d'articles (jours entre $debut et $fin)");
statistiques_archiver_log('===========================================================');
statistiques_archiver_log("===========================================================");
$annees = range($annee_minimum, $annee);
$mois = range(1, 12);
@ -255,7 +254,7 @@ function statistiques_concatener_annee_minimum() {
}
if (!$annee_minimum) {
statistiques_archiver_log('Erreur de calcul de la plus petite année de statistiques !');
statistiques_archiver_log("Erreur de calcul de la plus petite année de statistiques !");
return false;
}
@ -285,7 +284,7 @@ function statistiques_concatener_visites_par_an($annee) {
}
statistiques_archiver_log("\nConcaténer les visites d'articles (par an)");
statistiques_archiver_log('===========================================================');
statistiques_archiver_log("===========================================================");
$annees = range($annee_minimum, $annee);
@ -311,16 +310,16 @@ function statistiques_concatener_visites_par_an($annee) {
function statistiques_concatener_visites_entre_periode($date_debut, $date_fin) {
// récupérer toutes les visites de cette période (année, mois, entre jour début et fin)
$visites = sql_allfetsel('id_article, date, visites', 'spip_visites_articles', [
'date >= ' . sql_quote($date_debut),
'date <= ' . sql_quote($date_fin),
]);
$visites = sql_allfetsel('id_article, date, visites', 'spip_visites_articles', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
));
if (!$visites) {
return false;
}
$liste = $updates = [];
$liste = $updates = array();
$total = 0;
// - Crée un tableau plus simple (id_article => total des visites de la période) (permettant un array_diff_key facile).
@ -350,27 +349,28 @@ function statistiques_concatener_visites_entre_periode($date_debut, $date_fin) {
statistiques_archiver_log("-- du $date_debut au $date_fin : $total visites dans $nb_articles articles");
if ($liste) {
// formater pour l'insertion dans la base.
$inserts = [];
$inserts = array();
foreach ($liste as $id_article => $visites) {
$inserts[] = [
$inserts[] = array(
'id_article' => $id_article,
'date' => $date_debut,
'visites' => $visites,
];
);
}
statistiques_archiver_log('--- concaténer les statistiques de ' . count($liste) . ' articles');
statistiques_archiver_log("--- concaténer les statistiques de " . count($liste) . " articles");
// /!\ Attention,
// Entre ces 2 requêtes, on peut perdre des données (si timeout ou autre)
// Transaction à faire ?
sql_delete('spip_visites_articles', [
'date >= ' . sql_quote($date_debut),
'date <= ' . sql_quote($date_fin),
sql_delete('spip_visites_articles', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
sql_in('id_article', array_keys($liste)),
]);
));
sql_insertq_multi('spip_visites_articles', $inserts);
}

12
base/delete_referers.php

@ -10,13 +10,13 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
} // securiser
// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
// Afficher la liste de ce qu'on va detruire et demander confirmation
// Afficher la liste de ce qu'on va detruire et demander confirmation
// ca vaudrait mieux
/**
@ -30,12 +30,12 @@ function base_delete_referers_dist($titre = '', $reprise = '') {
if (!$titre) {
return;
} // anti-testeur automatique
sql_delete('spip_referers');
sql_delete('spip_referers_articles');
sql_update('spip_articles', ['referers' => 0]);
sql_delete("spip_referers");
sql_delete("spip_referers_articles");
sql_update("spip_articles", array('referers' => 0));
// un pipeline pour detruire les tables de referers installees par les plugins ?
//pipeline('delete_referers', '');
spip_log('raz des referers operee redirige vers ' . _request('redirect'));
spip_log("raz des referers operee redirige vers " . _request('redirect'));
}

16
base/delete_stats.php

@ -10,13 +10,13 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
} // securiser
// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
// Afficher la liste de ce qu'on va detruire et demander confirmation
// Afficher la liste de ce qu'on va detruire et demander confirmation
// ca vaudrait mieux
/**
@ -30,13 +30,13 @@ function base_delete_stats_dist($titre = '', $reprise = '') {
if (!$titre) {
return;
} // anti-testeur automatique
sql_delete('spip_visites');
sql_delete('spip_visites_articles');
sql_delete('spip_referers');
sql_delete('spip_referers_articles');
sql_update('spip_articles', ['visites' => 0, 'referers' => 0, 'popularite' => 0]);
sql_delete("spip_visites");
sql_delete("spip_visites_articles");
sql_delete("spip_referers");
sql_delete("spip_referers_articles");
sql_update("spip_articles", array('visites' => 0, 'referers' => 0, 'popularite' => 0));
// un pipeline pour detruire les tables de stats installees par les plugins
pipeline('delete_statistiques', '');
spip_log('raz des stats operee redirige vers ' . _request('redirect'));
spip_log("raz des stats operee redirige vers " . _request('redirect'));
}

98
base/stats.php

@ -18,7 +18,7 @@
* @package SPIP\Stats\Pipelines
**/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -39,71 +39,71 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*/
function stats_declarer_tables_auxiliaires($tables_auxiliaires) {
$spip_visites = [
'date' => 'DATE NOT NULL',
'visites' => "int UNSIGNED DEFAULT '0' NOT NULL",
'maj' => 'TIMESTAMP'
];
$spip_visites = array(
"date" => "DATE NOT NULL",
"visites" => "int UNSIGNED DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_visites_key = [
'PRIMARY KEY' => 'date'
];
$spip_visites_key = array(
"PRIMARY KEY" => "date"
);
$spip_visites_articles = [
'date' => 'DATE NOT NULL',
'id_article' => 'int UNSIGNED NOT NULL',
'visites' => "int UNSIGNED DEFAULT '0' NOT NULL",
'maj' => 'TIMESTAMP'
];
$spip_visites_articles = array(
"date" => "DATE NOT NULL",
"id_article" => "int UNSIGNED NOT NULL",
"visites" => "int UNSIGNED DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_visites_articles_key = [
'PRIMARY KEY' => 'date, id_article'
];
$spip_visites_articles_key = array(
"PRIMARY KEY" => "date, id_article"
);
$spip_referers = [
'referer_md5' => 'bigint UNSIGNED NOT NULL',
'date' => 'DATE NOT NULL',
'referer' => 'VARCHAR (255)',
'visites' => 'int UNSIGNED NOT NULL',
'visites_jour' => 'int UNSIGNED NOT NULL',
'visites_veille' => 'int UNSIGNED NOT NULL',
'maj' => 'TIMESTAMP'
];
$spip_referers = array(
"referer_md5" => "bigint UNSIGNED NOT NULL",
"date" => "DATE NOT NULL",
"referer" => "VARCHAR (255)",
"visites" => "int UNSIGNED NOT NULL",
"visites_jour" => "int UNSIGNED NOT NULL",
"visites_veille" => "int UNSIGNED NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_referers_key = [
'PRIMARY KEY' => 'referer_md5'
];
$spip_referers_key = array(
"PRIMARY KEY" => "referer_md5"
);
$spip_referers_articles = [
'id_article' => 'int UNSIGNED NOT NULL',
'referer_md5' => 'bigint UNSIGNED NOT NULL',
'referer' => "VARCHAR (255) DEFAULT '' NOT NULL",
'visites' => 'int UNSIGNED NOT NULL',
'maj' => 'TIMESTAMP'
];
$spip_referers_articles = array(
"id_article" => "int UNSIGNED NOT NULL",
"referer_md5" => "bigint UNSIGNED NOT NULL",
"referer" => "VARCHAR (255) DEFAULT '' NOT NULL",
"visites" => "int UNSIGNED NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_referers_articles_key = [
'PRIMARY KEY' => 'id_article, referer_md5',
'KEY referer_md5' => 'referer_md5'
];
$spip_referers_articles_key = array(
"PRIMARY KEY" => "id_article, referer_md5",
"KEY referer_md5" => "referer_md5"
);
$tables_auxiliaires['spip_visites'] = [
$tables_auxiliaires['spip_visites'] = array(
'field' => &$spip_visites,
'key' => &$spip_visites_key
];
$tables_auxiliaires['spip_visites_articles'] = [
);
$tables_auxiliaires['spip_visites_articles'] = array(
'field' => &$spip_visites_articles,
'key' => &$spip_visites_articles_key
];
$tables_auxiliaires['spip_referers'] = [
);
$tables_auxiliaires['spip_referers'] = array(
'field' => &$spip_referers,
'key' => &$spip_referers_key
];
$tables_auxiliaires['spip_referers_articles'] = [
);
$tables_auxiliaires['spip_referers_articles'] = array(
'field' => &$spip_referers_articles,
'key' => &$spip_referers_articles_key
];
);
return $tables_auxiliaires;
}

18
composer.json

@ -1,18 +0,0 @@
{
"require": {
"php": "^7.4 || ^8.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"phpstan/phpstan": "^1.4",
"spip/coding-standards": "^1.2"
},
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
},
"platform": {
"php": "7.4.27"
}
}
}

161
css/spip_d3_graph.css

@ -1,161 +0,0 @@
.spip_d3_nav {
display:flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
padding: .5em 0 .25em;
}
.spip_d3_nav_caption {
font-size:1.3em;
font-weight: bold;
text-align: center;
line-height: 1;
margin:0;
}
.spip_d3_graph {
--spip-d3--text-color: var(--spip-color-gray-darker);
--spip-d3--border-color: var(--spip-color-gray-lighter);
--spip-d3--background-color: hsl(0, 0%, 98%);
--spip-d3--loader-color: var(--spip-color-theme);
--spip-d3--loader-color--loading: var(--spip-color-theme-dark);
--spip-d3--line-color: var(--spip-color-theme);
--spip-d3--line-color--primary: var(--spip-color-theme);
--spip-d3--line-color--secondary: hsl(calc(var(--spip-color-theme--h) + 120), var(--spip-color-theme--s), var(--spip-color-theme--l));
--spip-d3--line-color--tertiary: hsl(calc(var(--spip-color-theme--h) + 240), var(--spip-color-theme--s), var(--spip-color-theme--l));
--spip-d3--bar-color: var(--spip-color-theme-light);
--spip-d3--bar-color--hover: var(--spip-color-theme);
--spip-d3--grid-color: var(--spip-color-gray-lighter);
}
.spip_d3_graph {
display: grid;
place-items: center;
border: 1px solid var(--spip-d3--border-color);
background-color: var(--spip-d3--background-color);
margin-bottom: 3em;
}
.spip_d3_nav + .spip_d3_graph {
border-top: 2px solid var(--spip-d3--border-color);
}
.spip_d3_graph > * {
grid-area: 1/1;
}
/** ratio */
.spip_d3_graph_ratio {}
/** loader */
.spip_d3_graph_loader {
color: var(--spip-d3--loader-color);
transition: width .3s, height .3s, color .3s;
width: 60px;
height: 60px;
display: none;
z-index: 1000;
}
/** when loading */
.spip_d3_graph--loading .spip_d3_graph_loader {
display: block;
}
/** graphique */
.spip_d3_graph_inner {
width: 100%;
position: relative; /** for tooltip */
align-self: self-start;
}
/* ===================== */
.spip_d3_svg {}
.spip_d3_svg_title {
text-anchor: middle;
fill: var(--spip-d3--text-color);
}
.spip_d3_svg_grid line {
stroke: var(--spip-d3--grid-color);
shape-rendering: crispEdges;
stroke-opacity: 0.7;
}
.spip_d3_svg_grid path {
stroke-width: 0;
}
.spip_d3_svg_grid--horizontal line {
stroke-opacity: 0.7;
}
.spip_d3_svg_grid--vertical line {
stroke-opacity: 0.5;
}
.spip_d3_svg_xaxis,
.spip_d3_svg_yaxis {
color: var(--spip-d3--text-color);
}
[dir=rtl] .spip_d3_svg_yaxis {
text-anchor: start; /* force rtl to align left… for now… */
}
.spip_d3_svg_line {
fill: none;
stroke: var(--spip-d3--line-color);
stroke-width: 2;
stroke-miterLimit: 1;
}
.spip_d3_svg_line--average {
stroke: var(--spip-d3--line-color--secondary);
}
.spip_d3_svg_histogram {}
.spip_d3_svg_bar {
fill: var(--spip-d3--bar-color);
transition: fill .3s;
}
.spip_d3_svg_bar--hover,
.spip_d3_svg_bar:hover {
fill: var(--spip-d3--bar-color--hover);
}
.spip_d3_svg_overlay {
fill: none;
pointer-events: all;
}
/* ===================== */
.spip_d3_tooltip {
position: absolute;
opacity: 0;
border-radius: 5px;
background-color: var(--spip-color-theme-lightest);
border: 1px solid var(--spip-color-theme);
}
.spip_d3_tooltip_list {
list-style-type: none;
margin: 0;
padding: .5em;
}
.spip_d3_tooltip_label {
font-weight: bold;
color: var(--spip-color-theme-darker);
padding-right: .5em;
}
.spip_d3_tooltip_value {
}
/* ====================== */
.spip_d3_table {
margin-bottom: 2em;
}

19
css/spip_d3_statistiques.css

@ -1,19 +0,0 @@
.spip_d3_statistiques {
width: 100%;
min-height: 400px;
padding: 1em;
box-sizing: border-box;
}
.spip_d3_statistiques--visites_quotidiennes {}
table.spip.spip_table--statistiques {
margin-bottom: 3em;
max-width: 100%;
}
table.spip.spip_table--statistiques caption {
margin-bottom: 0;
}

3
exec/base_delete_referers.php

@ -10,7 +10,7 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -29,5 +29,6 @@ function exec_base_delete_referers_dist() {
} else {
redirige_url_ecrire('stats_referers', '');
}
}
}

3
exec/base_delete_stats.php

@ -10,7 +10,7 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -29,5 +29,6 @@ function exec_base_delete_stats_dist() {
} else {
redirige_url_ecrire('stats_visites', '');
}
}
}

4
formulaires/configurer_compteur.html

@ -1,8 +1,8 @@
<div class='formulaire_spip formulaire_configurer formulaire_configurer_compteur' id='formulaire_configurer_compteur'>
<h3 class='titrem'>[(#CHEMIN_IMAGE{statistique-24.png}|balise_img{'',cadre-icone})]<:statistiques:info_forum_statistiques:> #AIDER{confstat}</h3>
[<p class="reponse_formulaire reponse_formulaire_ok" role="status">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur" role="alert">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form action="#ENV{action}#formulaire_configurer_compteur" method="post"><div>
#ACTION_FORMULAIRE
<div class="editer-groupe">

11
formulaires/configurer_compteur.php

@ -10,26 +10,27 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
function formulaires_configurer_compteur_charger_dist() {
$valeurs = [];
$valeurs = array();
$valeurs['activer_statistiques'] = $GLOBALS['meta']['activer_statistiques'];
$valeurs['activer_referers'] = $GLOBALS['meta']['activer_referers'];
$valeurs['activer_captures_referers'] = $GLOBALS['meta']['activer_captures_referers'];
return $valeurs;
}
function formulaires_configurer_compteur_verifier_dist() {
$erreurs = [];
$erreurs = array();
// les checkbox
foreach (['activer_statistiques', 'activer_referers', 'activer_captures_referers'] as $champ) {
foreach (array('activer_statistiques', 'activer_referers', 'activer_captures_referers') as $champ) {
if (_request($champ) != 'oui') {
set_request($champ, 'non');
}
@ -42,5 +43,5 @@ function formulaires_configurer_compteur_traiter_dist() {
include_spip('inc/config');
appliquer_modifs_config();
return ['message_ok' => _T('config_info_enregistree')];
return array('message_ok' => _T('config_info_enregistree'));
}

24
genie/popularites.php

@ -18,7 +18,7 @@
* @package SPIP\Statistiques\Genie
**/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -41,7 +41,7 @@ function genie_popularite_constantes($duree) {
// periode de reference en jours
$periode = 1;
// $a est le coefficient d'amortissement depuis la derniere mesure
$a = 2 ** (-$duree / ($demivie * 24 * 3600));
$a = pow(2, -$duree / ($demivie * 24 * 3600));
// $b est la constante multiplicative permettant d'avoir
// une visite par jour (periode de reference) = un point de popularite
// (en regime stationnaire)
@ -49,7 +49,7 @@ function genie_popularite_constantes($duree) {
// si la demi-vie n'est pas trop proche de la seconde ;)
$b = log(2) * $periode / $demivie;
return [$a, $b];
return array($a, $b);
}
/**
@ -73,15 +73,15 @@ function genie_popularites_dist($t) {
}
$duree = time() - $t;
[$a, $b] = genie_popularite_constantes($duree);
list($a, $b) = genie_popularite_constantes($duree);
// du passe, faisons table (SQL) rase
sql_update('spip_articles', ['maj' => 'maj', 'popularite' => "popularite * $a"], 'popularite>1');
sql_update('spip_articles', array('maj' => 'maj', 'popularite' => "popularite * $a"), 'popularite>1');
// enregistrer les metas...
$row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', 'spip_articles');
ecrire_meta('popularite_max', $row['max']);
ecrire_meta('popularite_total', $row['tot']);
$row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles");
ecrire_meta("popularite_max", $row['max']);
ecrire_meta("popularite_total", $row['tot']);
// Une fois par jour purger les referers du jour ; qui deviennent
@ -90,13 +90,14 @@ function genie_popularites_dist($t) {
// peut etre appele par deux bases SPIP ne partageant pas le meme
// _DIR_TMP, sans tout casser...
$aujourdhui = date('Y-m-d');
$aujourdhui = date("Y-m-d");
if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) {
spip_log("Popularite: purger referer depuis $d");
ecrire_meta('date_statistiques', $aujourdhui);
if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) == 0) {
spip_query('UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0');
} else // version 3 fois plus rapide, mais en 2 requetes
spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
} else
// version 3 fois plus rapide, mais en 2 requetes
#spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
#spip_query("UPDATE spip_referers SET visites_jour=0");
// version 4 fois plus rapide que la premiere, en une seule requete
@ -110,4 +111,5 @@ function genie_popularites_dist($t) {
// et c'est fini pour cette fois-ci
return 1;
}

153
genie/visites.php

@ -18,7 +18,7 @@
* @package SPIP\Statistiques\Genie
**/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
if (!defined('_CRON_LOT_FICHIERS_VISITE')) {
@ -49,7 +49,7 @@ function compte_fichier_visite($fichier, &$visites, &$visites_a, &$referers, &$r
// Noter la visite du site (article 0)
$visites++;
$content = [];
$content = array();
if (lire_fichier($fichier, $content)) {
$content = @unserialize($content);
}
@ -58,7 +58,7 @@ function compte_fichier_visite($fichier, &$visites, &$visites_a, &$referers, &$r
}
foreach ($content as $source => $num) {
[$log_type, $log_id_num, $log_referer]
list($log_type, $log_id_num, $log_referer)
= preg_split(",\t,", $source, 3);
// Noter le referer
@ -71,8 +71,7 @@ function compte_fichier_visite($fichier, &$visites, &$visites_a, &$referers, &$r
}
// S'il s'agit d'un article, noter ses visites
if (
$log_type == 'article'
if ($log_type == 'article'
and $id_article = intval($log_id_num)
) {
if (!isset($visites_a[$id_article])) {
@ -106,10 +105,10 @@ function calculer_visites($t) {
include_spip('base/abstract_sql');
// Initialisations
$visites = []; # visites du site
$visites_a = []; # tableau des visites des articles
$referers = []; # referers du site
$referers_a = []; # tableau des referers des articles
$visites = array(); # visites du site
$visites_a = array(); # tableau des visites des articles
$referers = array(); # referers du site
$referers_a = array(); # tableau des referers des articles
// charger un certain nombre de fichiers de visites,
// et faire les calculs correspondants
@ -124,15 +123,10 @@ function calculer_visites($t) {
if (!$d) {
$d = $date_init;
} // si le fs ne donne pas de date, on prend celle du traitement, mais tout cela risque d'etre bien douteux
$d = date('Y-m-d', $d);
$d = date("Y-m-d", $d);
spip_log("traite la session $item");
compte_fichier_visite(
$item,
$visites[$d],
$visites_a[$d],
$referers[$d],
$referers_a[$d]
);
compte_fichier_visite($item,
$visites[$d], $visites_a[$d], $referers[$d], $referers_a[$d]);
spip_unlink($item);
if (--$compteur <= 0) {
break;
@ -145,7 +139,7 @@ function calculer_visites($t) {
}
include_spip('genie/popularites');
[$a, $b] = genie_popularite_constantes(24 * 3600);
list($a, $b) = genie_popularite_constantes(24 * 3600);
// Maintenant on dispose de plusieurs tableaux qu'il faut ventiler dans
// les tables spip_visites, spip_visites_articles, spip_referers
@ -153,46 +147,38 @@ function calculer_visites($t) {
// date (celle de la visite, pas celle du traitement)
foreach (array_keys($visites) as $date) {
if ($visites[$date]) {
// 1. les visites du site (facile)
if (!sql_countsel('spip_visites', "date='$date'")) {
sql_insertq(
'spip_visites',
['date' => $date, 'visites' => $visites[$date]]
);
sql_insertq('spip_visites',
array('date' => $date, 'visites' => $visites[$date]));
} else {
sql_update('spip_visites', ['visites' => 'visites+' . intval($visites[$date])], "date='$date'");
sql_update('spip_visites', array('visites' => "visites+" . intval($visites[$date])), "date='$date'");
}
// 2. les visites des articles
// 2. les visites des articles
if ($visites_a[$date]) {
$ar = []; # tableau num -> liste des articles ayant num visites
$ar = array(); # tableau num -> liste des articles ayant num visites
foreach ($visites_a[$date] as $id_article => $n) {
if (
!sql_countsel(
'spip_visites_articles',
"id_article=$id_article AND date='$date'"
)
if (!sql_countsel('spip_visites_articles',
"id_article=$id_article AND date='$date'")
) {
sql_insertq(
'spip_visites_articles',
[
sql_insertq('spip_visites_articles',
array(
'id_article' => $id_article,
'visites' => 0,
'date' => $date
]
);
));
}
$ar[$n][] = $id_article;
}
foreach ($ar as $n => $liste) {
$tous = sql_in('id_article', $liste);
sql_update(
'spip_visites_articles',
['visites' => "visites+$n"],
"date='$date' AND $tous"
);
sql_update('spip_visites_articles',
array('visites' => "visites+$n"),
"date='$date' AND $tous");
$ref = $noref = [];
$ref = $noref = array();
foreach ($liste as $id) {
if (isset($referers_a[$id])) {
$ref[] = $id;
@ -202,38 +188,34 @@ function calculer_visites($t) {
}
// il faudrait ponderer la popularite ajoutee ($n) par son anciennete eventuelle
// sur le modele de ce que fait genie/popularites
if (is_countable($noref) ? count($noref) : 0) {
sql_update(
'spip_articles',
[
if (count($noref)) {
sql_update('spip_articles',
array(
'visites' => "visites+$n",
'popularite' => 'popularite+' . number_format(round($n * $b, 2), 2, '.', ''),
'popularite' => "popularite+" . number_format(round($n * $b, 2), 2, '.', ''),
'maj' => 'maj'
],
sql_in('id_article', $noref)
);
),
sql_in('id_article', $noref));
}
if (is_countable($ref) ? count($ref) : 0) {
sql_update(
'spip_articles',
[
'visites' => 'visites+' . ($n + 1),
'popularite' => 'popularite+' . number_format(round($n * $b, 2), 2, '.', ''),
if (count($ref)) {
sql_update('spip_articles',
array(
'visites' => "visites+" . ($n + 1),
'popularite' => "popularite+" . number_format(round($n * $b, 2), 2, '.', ''),
'maj' => 'maj'
],
sql_in('id_article', $ref)
);
),
sql_in('id_article', $ref));
}
## Ajouter un JOIN sur le statut de l'article ?
}
}
if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == 'oui') {
if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == "oui") {
// 3. Les referers du site
// insertion pour les nouveaux, au tableau des increments sinon
if ($referers[$date]) {
$ar = [];
$ar = array();
$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table('referers');
$n = preg_match('/(\d+)/', $desc['field']['referer'], $r);
@ -242,17 +224,15 @@ function calculer_visites($t) {
$referer_md5 = sql_hex(substr(md5($referer), 0, 15));
$referer = substr($referer, 0, $n);
if (!sql_countsel('spip_referers', "referer_md5=$referer_md5")) {
sql_insertq(
'spip_referers',
[
sql_insertq('spip_referers',
array(
'visites' => $num,
'visites_jour' => $num,
'visites_veille' => 0,
'date' => $date,
'referer' => $referer,
'referer_md5' => $referer_md5
]
);
));
} else {
$ar[$num][] = $referer_md5;
}
@ -262,33 +242,28 @@ function calculer_visites($t) {
// attention on appelle sql_in en mode texte et pas array
// pour ne pas passer sql_quote() sur les '0x1234' de referer_md5, cf #849
foreach ($ar as $num => $liste) {
sql_update(
'spip_referers',
['visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"],
sql_in('referer_md5', join(', ', $liste))
);
sql_update('spip_referers', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"),
sql_in('referer_md5', join(', ', $liste)));
}
}
// 4. Les referers d'articles
if ($referers_a[$date]) {
$ar = [];
$insert = [];
$ar = array();
$insert = array();
// s'assurer d'un slot pour chacun
foreach ($referers_a[$date] as $id_article => $referers) {
foreach ($referers as $referer => $num) {
$referer_md5 = sql_hex(substr(md5($referer), 0, 15));
$prim = "(id_article=$id_article AND referer_md5=$referer_md5)";
if (!sql_countsel('spip_referers_articles', $prim)) {
sql_insertq(
'spip_referers_articles',
[
sql_insertq('spip_referers_articles',
array(
'visites' => $num,
'id_article' => $id_article,
'referer' => $referer,
'referer_md5' => $referer_md5
]
);
));
} else {
$ar[$num][] = $prim;
}
@ -296,7 +271,7 @@ function calculer_visites($t) {
}
// ajouter les visites
foreach ($ar as $num => $liste) {
sql_update('spip_referers_articles', ['visites' => "visites+$num"], join(' OR ', $liste));
sql_update('spip_referers_articles', array('visites' => "visites+$num"), join(" OR ", $liste));
## Ajouter un JOIN sur le statut de l'article ?
}
}
@ -306,7 +281,7 @@ function calculer_visites($t) {
// S'il reste des fichiers a manger, le signaler pour reexecution rapide
if ($compteur == 0) {
spip_log('il reste des visites a traiter...');
spip_log("il reste des visites a traiter...");
return -$t;
}
@ -321,9 +296,9 @@ function visites_nettoyer_flood() {
if (!defined('_IP_FLOOD_TTL')) {
define('_IP_FLOOD_TTL', 24 * 3600);
} // 24H par defaut
$options = [
$options = array(
'mtime' => $_SERVER['REQUEST_TIME'] - _IP_FLOOD_TTL,
];
);
purger_repertoire($dir, $options);
}
}
@ -332,17 +307,17 @@ function visites_nettoyer_flood() {
* Nettoyer les urls en enlevant les variables de personnalisation marketing, ou variantes Amp
*/
function nettoyer_referer($url) {
function nettoyer_referer($url){
// &utm_xxx=
$url = preg_replace('`[?&]utm_.*$`', '', $url);
$url = preg_replace("`[?&]utm_.*$`","",$url);
// &fbclid=
$url = preg_replace('`[?&]fbclid.*$`', '', $url);
$url = preg_replace("`[?&]fbclid.*$`","",$url);
// &amp=1
$url = preg_replace('`[?&]amp=1$`', '', $url);
$url = preg_replace("`[?&]amp=1$`","",$url);
return $url ;
}

153
inc/referenceurs.php

@ -10,7 +10,7 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
if (!defined("_ECRIRE_INC_VERSION")) {
return;
}
@ -19,11 +19,12 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* Adaptees du code des "Visiteurs",
* par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
*
* https://code.spip.net/@stats_load_engines
*
* @return array
*/
function stats_load_engines() {
$moteurs = null;
$arr_engines = [];
$arr_engines = array();
lire_fichier(find_in_path('engines-list.txt'), $moteurs);
foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) {
$ligne = trim($ligne);
@ -34,7 +35,7 @@ function stats_load_engines() {
if (preg_match(',=$,', $ligne, $regs)) {
$query = $ligne;
} else {
$arr_engines[] = [$moteur, $query, $ligne];
$arr_engines[] = array($moteur, $query, $ligne);
}
}
}
@ -48,11 +49,12 @@ function stats_load_engines() {
* Adaptees du code des "Visiteurs",
* par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
*
* https://code.spip.net/@stats_show_keywords
*
* @param string $kw_referer
* @return array
*/
function stats_show_keywords($kw_referer) {
$buffer = [];
static $arr_engines = '';
static $url_site;
@ -62,14 +64,14 @@ function stats_show_keywords($kw_referer) {
// initialiser la recherche interne
$url_site = $GLOBALS['meta']['adresse_site'];
$url_site = preg_replace(',^((https?|ftp):?/?/?)?(www\.)?,', '', strtolower($url_site));
$url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site));
}
if ($url = @parse_url($kw_referer)) {
$query = $url['query'] ?? '';
$host = isset($url['host']) ? strtolower($url['host']) : '';
$path = $url['path'] ?? '';
$scheme = $url['scheme'] ?? '';
$query = isset($url['query']) ? $url['query'] : "";
$host = isset($url['host']) ? strtolower($url['host']) : "";
$path = isset($url['path']) ? $url['path'] : "";
$scheme = isset($url['scheme']) ? $url['scheme'] : "";
} else {
$scheme = $query = $host = $path = '';
}
@ -81,39 +83,38 @@ function stats_show_keywords($kw_referer) {
$found = false;
if (!empty($url_site)) {
if (strpos('-' . $kw_referer, (string) $url_site) !== false) {
if (preg_match(',(s|search|r|recherche)=([^&]+),i', $kw_referer, $regs)) {
if (strpos('-' . $kw_referer, $url_site) !== false) {
if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) {
$keywords = urldecode($regs[2]);
} else {
return ['host' => ''];
return array('host' => '');
}
} else {
for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++) {
if (
$found = preg_match(',' . $arr_engines[$cnt][2] . ',', $host)
if ($found = preg_match(',' . $arr_engines[$cnt][2] . ',', $host)
or $found = preg_match(',' . $arr_engines[$cnt][2] . ',', $path)
) {
$kw_referer_host = $arr_engines[$cnt][0];
if (strpos($arr_engines[$cnt][1], '=') !== false) {
// Fonctionnement simple: la variable existe dans l'array
$v = str_replace('=', '', $arr_engines[$cnt][1]);
$keywords = $Tquery[$v] ?? '';
$keywords = isset($Tquery[$v]) ? $Tquery[$v] : "";
// Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
if (!strlen($keywords) > 0) {
if (preg_match(',' . $arr_engines[$cnt][1] . '([^\&]*),', $query, $vals)) {
if (preg_match("," . $arr_engines[$cnt][1] . "([^\&]*),", $query, $vals)) {
$keywords = urldecode($vals[2]);
}
}
} else {
$keywords = '';
$keywords = "";
}
if (
($kw_referer_host == 'Google')
|| ($kw_referer_host == 'AOL' && strpos($query, 'enc=iso') === false)
|| ($kw_referer_host == 'MSN')