feat(dev-tools): Mise en place phpcs+phpstan #4852

Merged
JamesRezo merged 1 commits from qa-tools into master 2 years ago

7
.gitignore vendored

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

@ -18,7 +18,7 @@
* @package SPIP\Stats\Actions
**/
if (!defined("_ECRIRE_INC_VERSION")) {
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -64,14 +64,15 @@ function action_statistiques_archiver_dist($arg = null) {
minipres();
}
if (!in_array($arg, array(
if (
!in_array($arg, [
'archiver_visites_articles',
'nettoyer_visites_articles',
'nettoyer_referers_articles'
))
])
) {
include_spip('inc/minipres');
minipres("Argument non compris");
minipres('Argument non compris');
}
$func = 'statistiques_' . $arg;
@ -173,7 +174,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');
}
@ -222,7 +223,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);
@ -254,7 +255,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;
}
@ -284,7 +285,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);
@ -310,16 +311,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', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
));
$visites = sql_allfetsel('id_article, date, visites', 'spip_visites_articles', [
'date >= ' . sql_quote($date_debut),
'date <= ' . sql_quote($date_fin),
]);
if (!$visites) {
return false;
}
$liste = $updates = array();
$liste = $updates = [];
$total = 0;
// - Crée un tableau plus simple (id_article => total des visites de la période) (permettant un array_diff_key facile).
@ -349,28 +350,27 @@ 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 = array();
$inserts = [];
foreach ($liste as $id_article => $visites) {
$inserts[] = array(
$inserts[] = [
'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', array(
"date >= " . sql_quote($date_debut),
"date <= " . sql_quote($date_fin),
sql_delete('spip_visites_articles', [
'date >= ' . sql_quote($date_debut),
'date <= ' . sql_quote($date_fin),
sql_in('id_article', array_keys($liste)),
));
]);
sql_insertq_multi('spip_visites_articles', $inserts);
}

@ -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", array('referers' => 0));
sql_delete('spip_referers');
sql_delete('spip_referers_articles');
sql_update('spip_articles', ['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'));
}

@ -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", array('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', ['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'));
}

@ -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 = array(
"date" => "DATE NOT NULL",
"visites" => "int UNSIGNED DEFAULT '0' NOT NULL",
"maj" => "TIMESTAMP"
);
$spip_visites = [
'date' => 'DATE NOT NULL',
'visites' => "int UNSIGNED DEFAULT '0' NOT NULL",
'maj' => 'TIMESTAMP'
];
$spip_visites_key = array(
"PRIMARY KEY" => "date"
);
$spip_visites_key = [
'PRIMARY KEY' => 'date'
];
$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 = [
'date' => 'DATE NOT NULL',
'id_article' => 'int UNSIGNED NOT NULL',
'visites' => "int UNSIGNED DEFAULT '0' NOT NULL",
'maj' => 'TIMESTAMP'
];
$spip_visites_articles_key = array(
"PRIMARY KEY" => "date, id_article"
);
$spip_visites_articles_key = [
'PRIMARY KEY' => 'date, id_article'
];
$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 = [
'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 = array(
"PRIMARY KEY" => "referer_md5"
);
$spip_referers_key = [
'PRIMARY KEY' => 'referer_md5'
];
$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 = [
'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 = array(
"PRIMARY KEY" => "id_article, referer_md5",
"KEY referer_md5" => "referer_md5"
);
$spip_referers_articles_key = [
'PRIMARY KEY' => 'id_article, referer_md5',
'KEY referer_md5' => 'referer_md5'
];
$tables_auxiliaires['spip_visites'] = array(
$tables_auxiliaires['spip_visites'] = [
'field' => &$spip_visites,
'key' => &$spip_visites_key
);
$tables_auxiliaires['spip_visites_articles'] = array(
];
$tables_auxiliaires['spip_visites_articles'] = [
'field' => &$spip_visites_articles,
'key' => &$spip_visites_articles_key
);
$tables_auxiliaires['spip_referers'] = array(
];
$tables_auxiliaires['spip_referers'] = [
'field' => &$spip_referers,
'key' => &$spip_referers_key
);
$tables_auxiliaires['spip_referers_articles'] = array(
];
$tables_auxiliaires['spip_referers_articles'] = [
'field' => &$spip_referers_articles,
'key' => &$spip_referers_articles_key
);
];
return $tables_auxiliaires;
}

@ -0,0 +1,7 @@
{
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"spip/coding-standards": "^1.2",
"phpstan/phpstan": "^0.12.98"
}
}

@ -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,6 +29,5 @@ function exec_base_delete_referers_dist() {
} else {
redirige_url_ecrire('stats_referers', '');
}
}
}

@ -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,6 +29,5 @@ function exec_base_delete_stats_dist() {
} else {
redirige_url_ecrire('stats_visites', '');
}
}
}

@ -10,27 +10,26 @@
* 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 = array();
$valeurs = [];
$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 = array();
$erreurs = [];
// les checkbox
foreach (array('activer_statistiques', 'activer_referers', 'activer_captures_referers') as $champ) {
foreach (['activer_statistiques', 'activer_referers', 'activer_captures_referers'] as $champ) {
if (_request($champ) != 'oui') {
set_request($champ, 'non');
}
@ -43,5 +42,5 @@ function formulaires_configurer_compteur_traiter_dist() {
include_spip('inc/config');
appliquer_modifs_config();
return array('message_ok' => _T('config_info_enregistree'));
return ['message_ok' => _T('config_info_enregistree')];
}

@ -18,7 +18,7 @@
* @package SPIP\Statistiques\Genie
**/
if (!defined("_ECRIRE_INC_VERSION")) {
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -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 array($a, $b);
return [$a, $b];
}
/**
@ -76,12 +76,12 @@ function genie_popularites_dist($t) {
list($a, $b) = genie_popularite_constantes($duree);
// du passe, faisons table (SQL) rase
sql_update('spip_articles', array('maj' => 'maj', 'popularite' => "popularite * $a"), 'popularite>1');
sql_update('spip_articles', ['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,14 +90,13 @@ 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
@ -111,5 +110,4 @@ function genie_popularites_dist($t) {
// et c'est fini pour cette fois-ci
return 1;
}

@ -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 = array();
$content = [];
if (lire_fichier($fichier, $content)) {
$content = @unserialize($content);
}
@ -71,7 +71,8 @@ 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])) {
@ -105,10 +106,10 @@ function calculer_visites($t) {
include_spip('base/abstract_sql');
// Initialisations
$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
$visites = []; # visites du site
$visites_a = []; # tableau des visites des articles
$referers = []; # referers du site
$referers_a = []; # tableau des referers des articles
// charger un certain nombre de fichiers de visites,
// et faire les calculs correspondants
@ -123,10 +124,15 @@ 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;
@ -147,38 +153,46 @@ 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',
array('date' => $date, 'visites' => $visites[$date]));
sql_insertq(
'spip_visites',
['date' => $date, 'visites' => $visites[$date]]
);
} else {
sql_update('spip_visites', array('visites' => "visites+" . intval($visites[$date])), "date='$date'");
sql_update('spip_visites', ['visites' => 'visites+' . intval($visites[$date])], "date='$date'");
}
// 2. les visites des articles
// 2. les visites des articles
if ($visites_a[$date]) {
$ar = array(); # tableau num -> liste des articles ayant num visites
$ar = []; # 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',
array(
sql_insertq(
'spip_visites_articles',
[
'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',
array('visites' => "visites+$n"),
"date='$date' AND $tous");
sql_update(
'spip_visites_articles',
['visites' => "visites+$n"],
"date='$date' AND $tous"
);
$ref = $noref = array();
$ref = $noref = [];
foreach ($liste as $id) {
if (isset($referers_a[$id])) {
$ref[] = $id;
@ -189,33 +203,37 @@ 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 (count($noref)) {
sql_update('spip_articles',
array(
sql_update(
'spip_articles',
[
'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 (count($ref)) {
sql_update('spip_articles',
array(
'visites' => "visites+" . ($n + 1),
'popularite' => "popularite+" . number_format(round($n * $b, 2), 2, '.', ''),
sql_update(
'spip_articles',
[
'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 = array();
$ar = [];
$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table('referers');
$n = preg_match('/(\d+)/', $desc['field']['referer'], $r);
@ -224,15 +242,17 @@ 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',
array(
sql_insertq(
'spip_referers',
[
'visites' => $num,
'visites_jour' => $num,
'visites_veille' => 0,
'date' => $date,
'referer' => $referer,
'referer_md5' => $referer_md5
));
]
);
} else {
$ar[$num][] = $referer_md5;
}
@ -242,28 +262,33 @@ 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', array('visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"),
sql_in('referer_md5', join(', ', $liste)));
sql_update(
'spip_referers',
['visites' => "visites+$num", 'visites_jour' => "visites_jour+$num"],
sql_in('referer_md5', join(', ', $liste))
);
}
}
// 4. Les referers d'articles
if ($referers_a[$date]) {
$ar = array();
$insert = array();
$ar = [];
$insert = [];
// 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',
array(
sql_insertq(
'spip_referers_articles',
[
'visites' => $num,
'id_article' => $id_article,
'referer' => $referer,
'referer_md5' => $referer_md5
));
]
);
} else {
$ar[$num][] = $prim;
}
@ -271,7 +296,7 @@ function calculer_visites($t) {
}
// ajouter les visites
foreach ($ar as $num => $liste) {
sql_update('spip_referers_articles', array('visites' => "visites+$num"), join(" OR ", $liste));
sql_update('spip_referers_articles', ['visites' => "visites+$num"], join(' OR ', $liste));
## Ajouter un JOIN sur le statut de l'article ?
}
}
@ -281,7 +306,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;
}
@ -296,9 +321,9 @@ function visites_nettoyer_flood() {
if (!defined('_IP_FLOOD_TTL')) {
define('_IP_FLOOD_TTL', 24 * 3600);
} // 24H par defaut
$options = array(
$options = [
'mtime' => $_SERVER['REQUEST_TIME'] - _IP_FLOOD_TTL,
);
];
purger_repertoire($dir, $options);
}
}
@ -307,17 +332,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 ;
}

@ -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;
}
@ -24,7 +24,7 @@ if (!defined("_ECRIRE_INC_VERSION")) {
* @return array
*/
function stats_load_engines() {
$arr_engines = array();
$arr_engines = [];
lire_fichier(find_in_path('engines-list.txt'), $moteurs);
foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) {
$ligne = trim($ligne);
@ -35,7 +35,7 @@ function stats_load_engines() {
if (preg_match(',=$,', $ligne, $regs)) {
$query = $ligne;
} else {
$arr_engines[] = array($moteur, $query, $ligne);
$arr_engines[] = [$moteur, $query, $ligne];
}
}
}
@ -64,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 = isset($url['query']) ? $url['query'] : "";
$host = isset($url['host']) ? strtolower($url['host']) : "";
$path = isset($url['path']) ? $url['path'] : "";
$scheme = isset($url['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 = '';
}
@ -84,37 +84,38 @@ function stats_show_keywords($kw_referer) {
if (!empty($url_site)) {
if (strpos('-' . $kw_referer, $url_site) !== false) {
if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) {
if (preg_match(',(s|search|r|recherche)=([^&]+),i', $kw_referer, $regs)) {
$keywords = urldecode($regs[2]);
} else {
return array('host' => '');
return ['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 = isset($Tquery[$v]) ? $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")
if (
($kw_referer_host == 'Google')
|| ($kw_referer_host == 'AOL' && strpos($query, 'enc=iso') === false)
|| ($kw_referer_host == 'MSN')
) {
include_spip('inc/charsets');
if (!isset($ie) or !$cset = $ie) {
@ -122,20 +123,20 @@ function stats_show_keywords($kw_referer) {
}
$keywords = importer_charset($keywords, $cset);
}
$buffer["hostname"] = $kw_referer_host;
$buffer['hostname'] = $kw_referer_host;
}
}
}
}
$buffer["host"] = $host;
$buffer["scheme"] = $scheme;
if (!isset($buffer["hostname"]) or !$buffer["hostname"]) {
$buffer["hostname"] = $host;
$buffer['host'] = $host;
$buffer['scheme'] = $scheme;
if (!isset($buffer['hostname']) or !$buffer['hostname']) {
$buffer['hostname'] = $host;
}
$buffer["path"] = substr($path, 1, strlen($path));
$buffer["query"] = $query;
$buffer['path'] = substr($path, 1, strlen($path));
$buffer['query'] = $query;
if ($keywords != '') {
if (strlen($keywords) > 150) {
@ -143,17 +144,16 @@ function stats_show_keywords($kw_referer) {
// supprimer l'eventuelle entite finale mal coupee
$keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
}
$buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
$buffer['keywords'] = trim(entites_html(urldecode(stripslashes($keywords))));
}
return $buffer;
}
/**
* Recherche des objets pointés par un referer
*
*
* @param string $referermd5
* @param string $serveur
* @param array|string $objets
@ -162,59 +162,61 @@ function stats_show_keywords($kw_referer) {
function referes(string $referermd5, $objets = null, string $serveur = ''): string {
include_spip('base/objets'); // au cas où
$trouver_table = charger_fonction('trouver_table','base');
$trouver_table = charger_fonction('trouver_table', 'base');
// plugin stats objets ?
$stats_objets = $trouver_table('spip_visites_objets');
// si aucun type d'objet n'est donné en paramètre,
// on va chercher tous les types d'objets référencés dans les tables des referers
if (!$objets){
if (!$objets) {
$objets = [];
if ($stats_objets) {
if ($objets = sql_fetsel('DISTINCT objet', 'spip_referers_objets')){
if ($objets = sql_fetsel('DISTINCT objet', 'spip_referers_objets')) {
$objets = array_values($objets);
}
}
}
if (sql_countsel('spip_visites_articles')) {
$objets[] = 'article';
}
}
// sinon on s'assure d'avoir un array
elseif (is_string($objets)){
$objets = array($objets);
elseif (is_string($objets)) {
$objets = [$objets];
}
$retours = array();
$res_objets = array();
foreach($objets as $objet){
$retours = [];
$res_objets = [];
foreach ($objets as $objet) {
$table_objet_sql = table_objet_sql($objet); // spip_articles
$id_table_objet = id_table_objet($objet); // id_article
$desc = $trouver_table($table_objet_sql);
$champ_titre = isset($desc['titre']) ? $desc['titre'] : 'titre'; // titre, nom...
if ($objet == 'article'){
if ($objet == 'article') {
$table_referers = 'spip_referers_articles';
} else {
$table_referers = 'spip_referers_objets';
}
$on = ($objet == 'article' ?
"J1.id_article = J2.id_article" :
'(J1.objet='.sql_quote($objet)." AND J1.id_objet = J2.$id_table_objet)");
if ($res = sql_allfetsel(
'J1.id_article = J2.id_article' :
'(J1.objet=' . sql_quote($objet) . " AND J1.id_objet = J2.$id_table_objet)");
if (
$res = sql_allfetsel(
"J2.$id_table_objet, J2.$champ_titre",
"$table_referers AS J1 LEFT JOIN $table_objet_sql AS J2 ON $on",
"(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ", INTERVAL 2 DAY))",
"(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ', INTERVAL 2 DAY))',
'',
"titre",
'titre',
'',
'',
$serveur
)) {
)
) {
$res_objets[$objet] = $res;
}
}
foreach($res_objets as $objet => $res){
foreach ($res_objets as $objet => $res) {
$id_table_objet = id_table_objet($objet);
foreach ($res as $k => $ligne) {
$titre = typo($ligne['titre']);

@ -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;
}
@ -23,13 +23,21 @@ if (!defined("_ECRIRE_INC_VERSION")) {
* @return array
*/
function classement_populaires($type, $serveur = '') {
static $classement = array();
static $classement = [];
if (isset($classement[$type])) {
return $classement[$type];
}
$_id = id_table_objet($type, $serveur);
$classement[$type] = sql_allfetsel($_id, table_objet_sql($type, $serveur),
"statut='publie' AND popularite > 0", "", "popularite DESC", '', '', $serveur);
$classement[$type] = sql_allfetsel(
$_id,
table_objet_sql($type, $serveur),
"statut='publie' AND popularite > 0",
'',
'popularite DESC',
'',
'',
$serveur
);
$classement[$type] = array_column($classement[$type], $_id);
return $classement[$type];

@ -10,7 +10,6 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -25,11 +24,11 @@ include_spip('inc/referenceurs');
function inc_stats_referers_to_array_dist($limit, ?string $jour = null, ?string $objet = null, ?int $id_objet = null, $options = []) {
$visites = 'visites';
$table = "spip_referers";
$where = array();
$table = 'spip_referers';
$where = [];
$serveur = '';
if (in_array($jour, array('jour', 'veille'))) {
if (in_array($jour, ['jour', 'veille'])) {
$visites .= "_$jour";
$where[] = "$visites>0";
}
@ -40,41 +39,39 @@ function inc_stats_referers_to_array_dist($limit, ?string $jour = null, ?string
// on regarde dans spip_referers_objets ou spip_referers_articles.
if ($objet) {
switch ($objet) {
// articles
case 'article':
$table = "spip_referers_articles";
$table = 'spip_referers_articles';
if (intval($id_objet)) {
$where[] = "id_article = " . intval($id_objet);
$where[] = 'id_article = ' . intval($id_objet);
}
break;
// tous les autres objets
default:
$table = "spip_referers_objets";
$where[] = 'objet='.sql_quote($objet);
$table = 'spip_referers_objets';
$where[] = 'objet=' . sql_quote($objet);
if (intval($id_objet)) {
$where[] = "id_objet = " . intval($id_objet);
$where[] = 'id_objet = ' . intval($id_objet);
}
}
}
$where = implode(" AND ", $where);
$limit = $limit ? "0," . intval($limit) : '';
$where = implode(' AND ', $where);
$limit = $limit ? '0,' . intval($limit) : '';
$result = sql_select("referer_md5, referer, $visites AS vis", $table, $where, '', "maj DESC", $limit, '', $serveur);
$result = sql_select("referer_md5, referer, $visites AS vis", $table, $where, '', 'maj DESC', $limit, '', $serveur);
$referers = array();
$trivisites = array(); // pour le tri
$referers = [];
$trivisites = []; // pour le tri
while ($row = sql_fetch($result, $serveur)) {
$referer = interdire_scripts($row['referer']);
$buff = stats_show_keywords($referer, $referer);
if ($buff["host"]) {
$refhost = $buff["hostname"];
if ($buff['host']) {
$refhost = $buff['hostname'];
$visites = $row['vis'];
$host = $buff["scheme"] . "://" . $buff["host"];
$host = $buff['scheme'] . '://' . $buff['host'];
$referers[$refhost]['referer_md5'] = $row['referer_md5'];
@ -92,7 +89,7 @@ function inc_stats_referers_to_array_dist($limit, ?string $jour = null, ?string
$referers[$refhost]['visites_racine'] = 0;
}
if (!isset($referers[$refhost]['referers'])) {
$referers[$refhost]['referers'] = array();
$referers[$refhost]['referers'] = [];
}
$referers[$refhost]['hosts'][$host]++;
@ -100,23 +97,24 @@ function inc_stats_referers_to_array_dist($limit, ?string $jour = null, ?string
$referers[$refhost]['visites'] += $visites;
$trivisites[$refhost] = $referers[$refhost]['visites'];
$tmp = "";
$set = array(
$tmp = '';
$set = [
'referer' => $referer,
'visites' => $visites,
'referes' => $id_objet ? '' : referes($row['referer_md5'], $objet)
);
if (isset($buff["keywords"])
and $c = $buff["keywords"]
];
if (
isset($buff['keywords'])
and $c = $buff['keywords']
) {
if (!isset($referers[$refhost]['keywords'][$c])) {
$referers[$refhost]['keywords'][$c] = true;
$set['keywords'] = $c;
}
} else {
$tmp = $buff["path"];
if ($buff["query"]) {
$tmp .= "?" . $buff['query'];
$tmp = $buff['path'];
if ($buff['query']) {
$tmp .= '?' . $buff['query'];
}
if (strlen($tmp)) {
$set['path'] = "/$tmp";

@ -10,7 +10,6 @@
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -80,9 +79,9 @@ function inc_stats_visites_to_array_dist($unite, ?int $duree = null, ?string $ob
}
$serveur = '';
$table = "spip_visites";
$table = 'spip_visites';
$where = [];
$order = "date";
$order = 'date';
$currentDate = (new \DateTime())->format($format);
$startDate = null;
@ -97,15 +96,15 @@ function inc_stats_visites_to_array_dist($unite, ?int $duree = null, ?string $ob
if ($objet and $id_objet) {
if ($objet === 'article') {
$table = "spip_visites_articles";
$where[] = "id_article=" . intval($id_objet);
$table = 'spip_visites_articles';
$where[] = 'id_article=' . intval($id_objet);
} else {
// plugin stats objets ?
$trouver_table = charger_fonction('trouver_table', 'base');
if ($trouver_table('spip_visites_objets')) {
$table = "spip_visites_objets";
$where[] = "objet=" . table_objet($objet);
$where[] = "id_objet=" . intval($id_objet);
$table = 'spip_visites_objets';
$where[] = 'objet=' . table_objet($objet);
$where[] = 'id_objet=' . intval($id_objet);
} else {
throw new \Exception('Table spip_visites_objets not found. You need a plugin for stats outside articles.');
}
@ -113,9 +112,9 @@ function inc_stats_visites_to_array_dist($unite, ?int $duree = null, ?string $ob
}
$where = implode(" AND ", $where);
$where = implode(' AND ', $where);
$firstDateStat = sql_getfetsel("date", $table, $where, "", "date", "0,1");
$firstDateStat = sql_getfetsel('date', $table, $where, '', 'date', '0,1');
if ($firstDateStat) {
$firstDate = (new \DateTime($firstDateStat))->format($format);
} else {
@ -123,16 +122,17 @@ function inc_stats_visites_to_array_dist($unite, ?int $duree = null, ?string $ob
}
$data = sql_allfetsel(
"DATE_FORMAT($order, '$format_sql') AS formatted_date, SUM(visites) AS visites",
$table, $where,
"formatted_date",
"formatted_date",
"",
"",
"DATE_FORMAT($order, '$format_sql') AS formatted_date, SUM(visites) AS visites",
$table,
$where,
'formatted_date',
'formatted_date',
'',
'',
$serveur
);
$data = array_map(function($d) {
$data = array_map(function ($d) {
$d['date'] = $d['formatted_date'];
unset($d['formatted_date']);
return $d;

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<ruleset>
<file>.</file>
<exclude-pattern>vendor/*</exclude-pattern>
<exclude-pattern>lang/*</exclude-pattern>
<exclude-pattern>lib/*</exclude-pattern>
<rule ref="SPIP41"/>
<config name="ignore_warnings_on_exit" value="1"/>
<arg name="cache" value=".php_cs.cache"/>
<arg name="report-full" value=".php_cs.txt"/>
<arg name="report-summary"/>
<arg value="s"/>
</ruleset>

@ -0,0 +1,677 @@
parameters:
ignoreErrors:
-
message: "#^Function autoriser not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function charger_fonction not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function include_spip not found\\.$#"
count: 2
path: action/statistiques_archiver.php
-
message: "#^Function minipres not found\\.$#"
count: 2
path: action/statistiques_archiver.php
-
message: "#^Function spip_log not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_allfetsel not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_delete not found\\.$#"
count: 3
path: action/statistiques_archiver.php
-
message: "#^Function sql_getfetsel not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_in not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_insertq_multi not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_optimize not found\\.$#"
count: 1
path: action/statistiques_archiver.php
-
message: "#^Function sql_quote not found\\.$#"
count: 4
path: action/statistiques_archiver.php
-
message: "#^Function _request not found\\.$#"
count: 1
path: base/delete_referers.php
-
message: "#^Function base_delete_referers_dist\\(\\) should return string but return statement is missing\\.$#"
count: 1
path: base/delete_referers.php
-
message: "#^Function spip_log not found\\.$#"
count: 1
path: base/delete_referers.php
-
message: "#^Function sql_delete not found\\.$#"
count: 2
path: base/delete_referers.php
-
message: "#^Function sql_update not found\\.$#"
count: 1
path: base/delete_referers.php
-
message: "#^Function _request not found\\.$#"
count: 1
path: base/delete_stats.php
-
message: "#^Function base_delete_stats_dist\\(\\) should return string but return statement is missing\\.$#"
count: 1
path: base/delete_stats.php
-
message: "#^Function pipeline not found\\.$#"
count: 1
path: base/delete_stats.php
-
message: "#^Function spip_log not found\\.$#"
count: 1
path: base/delete_stats.php
-
message: "#^Function sql_delete not found\\.$#"
count: 4
path: base/delete_stats.php
-
message: "#^Function sql_update not found\\.$#"
count: 1
path: base/delete_stats.php
-
message: "#^Function _T not found\\.$#"
count: 1
path: exec/base_delete_referers.php
-
message: "#^Function autoriser not found\\.$#"
count: 1
path: exec/base_delete_referers.php
-
message: "#^Function charger_fonction not found\\.$#"
count: 1
path: exec/base_delete_referers.php
-
message: "#^Function include_spip not found\\.$#"
count: 3
path: exec/base_delete_referers.php
-
message: "#^Function minipres not found\\.$#"
count: 1
path: exec/base_delete_referers.php
-
message: "#^Function redirige_url_ecrire not found\\.$#"
count: 1
path: exec/base_delete_referers.php
-
message: "#^Function _T not found\\.$#"
count: 1
path: exec/base_delete_stats.php
-
message: "#^Function autoriser not found\\.$#"
count: 1
path: exec/base_delete_stats.php
-
message: "#^Function charger_fonction not found\\.$#"
count: 1
path: exec/base_delete_stats.php
-
message: "#^Function include_spip not found\\.$#"
count: 3
path: exec/base_delete_stats.php
-
message: "#^Function minipres not found\\.$#"
count: 1
path: exec/base_delete_stats.php
-
message: "#^Function redirige_url_ecrire not found\\.$#"
count: 1
path: exec/base_delete_stats.php
-
message: "#^Function _T not found\\.$#"
count: 1
path: formulaires/configurer_compteur.php
-
message: "#^Function _request not found\\.$#"
count: 1
path: formulaires/configurer_compteur.php
-
message: "#^Function appliquer_modifs_config not found\\.$#"
count: 1
path: formulaires/configurer_compteur.php
-
message: "#^Function include_spip not found\\.$#"
count: 1
path: formulaires/configurer_compteur.php
-
message: "#^Function set_request not found\\.$#"
count: 1
path: formulaires/configurer_compteur.php
-
message: "#^Function ecrire_meta not found\\.$#"
count: 4
path: genie/popularites.php
-
message: "#^Function spip_log not found\\.$#"
count: 1
path: genie/popularites.php
-
message: "#^Function spip_query not found\\.$#"
count: 1
path: genie/popularites.php
-
message: "#^Function sql_alter not found\\.$#"
count: 1
path: genie/popularites.php
-
message: "#^Function sql_fetsel not found\\.$#"
count: 1
path: genie/popularites.php
-
message: "#^Function sql_update not found\\.$#"
count: 1
path: genie/popularites.php
-
message: "#^Function include_spip not found\\.$#"
count: 2
path: genie/visites.php
-
message: "#^Function lire_fichier not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function preg_files not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function purger_repertoire not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function sous_repertoire not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function spip_log not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function spip_unlink not found\\.$#"
count: 1
path: genie/visites.php
-
message: "#^Function charger_fonction not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function entites_html not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function find_in_path not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function generer_url_entite not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function id_table_objet not found\\.$#"
count: 2
path: inc/referenceurs.php
-
message: "#^Function importer_charset not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function include_spip not found\\.$#"
count: 2
path: inc/referenceurs.php
-
message: "#^Function lire_fichier not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function spip_substr not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function sql_allfetsel not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function sql_countsel not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function sql_fetsel not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function sql_quote not found\\.$#"
count: 2
path: inc/referenceurs.php
-
message: "#^Function table_objet_sql not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Function typo not found\\.$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Undefined variable\\: \\$ie$#"
count: 1
path: inc/referenceurs.php
-
message: "#^Undefined variable\\: \\$moteurs$#"
count: 2
path: inc/referenceurs.php
-
message: "#^Function id_table_objet not found\\.$#"
count: 1
path: inc/statistiques.php
-
message: "#^Function sql_allfetsel not found\\.$#"