Wednesday, September 21, 2022
[06:05:27]
*
CrazyCat[AFK]
is now known as CrazyCat
[06:08:58]
*
PassiveIncomeGirl
joined #informatique
[06:10:00]
*
PassiveIncomeGirl
quit (Killed by CrazyCat (No))
[06:10:31]
*
PassiveIncomeGirl
joined #informatique
[06:10:53]
*
PassiveIncomeGirl
quit (Banned (Z-Lined): Suspicious bot)
[06:57:15]
%
Amand
j'ai toujours pas pu résoudre mon problème de temps de chargement :/
[06:58:02]
@
CrazyCat
Commence par exécuter la requête dans phpmyadmin pour voir combien de temps elle met
[06:58:29]
@
CrazyCat
Si ça trouve, le souci est juste que ta page générée est lourde
[07:00:32]
%
Amand
c'est la requête, j'ai tapé la requête, c'est encore entrain de chercher
[07:00:46]
%
Amand
Affichage des lignes 0 - 99 (total de 100, traitement en 53.7362 seconde(s).)
[07:01:46]
@
CrazyCat
Essaye en virant ton DISTINCT id (count(*))
[07:04:06]
@
CrazyCat
Pis l'option "Explain" est pas mal pour voir un peu ce qui prend du temps
[07:04:49]
%
Amand
Affichage des lignes 0 - 99 (total de 100, traitement en 52.2630 seconde(s).)
[07:05:56]
%
Amand
je regarde ou se situe le explain
[07:06:38]
@
CrazyCat
En dessous de la requête, tu dois avoir un bouton "Expliquer"
[07:07:11]
@
CrazyCat
Un lien "Expliquer SQL"
[07:07:32]
@
CrazyCat
Sinon, tu ajoutes juste "EXPLAIN" au début de ta requête
[07:13:23]
@
CrazyCat
(tu devrais soit renommer le champ time soit le protéger avec des ``)
[07:16:10]
%
Amand
ah oui
[07:16:13]
%
Amand
SELECT COUNT(DISTINCT id) AS nbc, MAX(`time`) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco, `time` FROM logsusers GROUP BY nick, username, ip ORDER BY lasttime DESC LIMIT 100
[07:16:55]
@
CrazyCat
Tu peux tenter ta requête sans le order by pour voir ce que ça donne ?
[07:18:12]
%
Amand
Affichage des lignes 0 - 99 (total de 100, traitement en 0.0080 seconde(s).)
[07:18:15]
%
Amand
nettement mieux
[07:18:33]
@
CrazyCat
Ok, ça me semble logique
[07:18:52]
@
CrazyCat
Donc, j'ai une idée qui peut t'arranger
[07:19:29]
@
CrazyCat
Tu crées une vue à partir de cette dernière requête (sans le order donc, de toutes manières mysql te le refusera)
[07:19:55]
@
CrazyCat
(et sans le limit, idem)
[07:20:18]
@
CrazyCat
Et tu fais dans ton php la requête sur la vue en ajoutant ton order et ton limit
[07:23:56]
%
Amand
je regarde ça
[07:25:43]
%
Amand
si j'ai bien compris le truc
[07:25:54]
%
Amand
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY
[07:25:54]
%
Amand
DEFINER VIEW stats_connex AS SELECT COUNT(DISTINCT id) AS nbc, MAX(`time`) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco, `time` FROM logsusers GROUP BY nick, username, ip
[07:26:08]
%
Amand
devrait crée la vue
[07:26:10]
%
Amand
je test
[07:29:12]
%
Amand
la vue est crée
[07:29:19]
%
Amand
par contre la requête :
[07:29:31]
@
CrazyCat
Question con en passant: pourquoi tu récupères le champ time alors que tu as lasttime
[07:29:37]
%
Amand
SELECT COUNT(DISTINCT id) AS nbc, MAX(`time`) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco, `time` FROM stats_connex GROUP BY nick, username, ip ORDER BY lasttime DESC LIMIT 100
[07:29:42]
@
CrazyCat
Et qu'en toute logique c'est les mêmes
[07:29:50]
%
Amand
me retourne une erreur :
[07:30:05]
%
Amand
HP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'field list'
[07:30:33]
%
Amand
pour time euhhh je sais plus pk j'avais laissé les deux
[07:30:45]
%
Amand
je reprends le code donc y'a quelques détail qui m'échappe
[07:31:05]
@
CrazyCat
Ben oui, ta vue fait 90% du boulot, ta reqête change: SELECT * FROM stats_connex ORDER BY lasttime LIMIT 100
[07:31:20]
%
Amand
ah ok !
[07:31:23]
@
CrazyCat
(remplace le * par les champs de la vue)
[07:31:24]
%
Amand
ok je vois
[07:34:57]
%
Amand
SELECT lasttime, codepays, nick, username, ip, host, realname, webirc, sslco, `time` FROM stats_connex ORDER BY lasttime LIMIT 100
[07:35:14]
%
Amand
ça n'a pas l'air de passer
[07:35:47]
@
CrazyCat
Tente dans phpmyadmin
[07:36:11]
@
CrazyCat
(et encore une fois, pourquoi tu intègre time dans tes requêtes ?)
[07:36:27]
%
Amand
je vais le retiré
[07:39:00]
%
Amand
j'ai le même souci
[07:39:07]
%
Amand
du temps de latence
[07:39:15]
%
Amand
chargement*
[07:40:18]
@
CrazyCat
Tu peux faire un expliquer SQL stp ?
[07:42:12]
@
CrazyCat
Hum, c'est bizarre que ta vue ait autant de lignes que ta table principale
[07:43:18]
@
CrazyCat
Tu peux me montrer un peu de contenu de ta vue stp ?
[07:46:24]
@
CrazyCat
Ok, donc déjà je te conseille de refaire ta vue en virant time et en ajoutant id (qui peut être utile)
[07:46:49]
@
CrazyCat
id c'est juste un auto incrément ?
[07:47:24]
%
Amand
time est utile quand j'insère une première connexion dans la base de donnée, vu que je retire les doublons, le lasttime sert à mettre le dernier timestamp
[07:47:29]
%
Amand
oui id est un auto incr
[07:47:46]
%
Amand
enfin je regroupe les doublons plutôt
[07:48:20]
@
CrazyCat
oki, donc id ne sert à rien dans la vue (j'ai cru 2 minutes que c'était l'id utilisateur)
[07:48:45]
%
Amand
time est important si je le retire, quand il y a qu'une seule connexion, il me met 1/1/1970
[07:48:47]
%
Amand
dans la date
[07:48:48]
@
CrazyCat
Mais time dans ta vue ne sert à rien
[07:49:52]
@
CrazyCat
dans ta vue, il te donne juste une des connexions de ce qui a été groupé
[07:50:35]
@
CrazyCat
(même si ça n'a aucun rapport avec ton souci de perfs)
[07:50:53]
%
Amand
ok je le retire de la vue
[07:50:58]
%
Amand
parce quand dans mon php
[07:51:06]
%
Amand
SELECT nbc, lasttime, codepays, nick, username, ip, host, realname, webirc, sslco, time FROM stats_connex ORDER BY lasttime LIMIT 100
[07:51:19]
%
Amand
ça corrige le problème du 1/1/1970
[07:52:57]
@
CrazyCat
Dans title="<?=date("G:i:s",strtotime($Logs['lasttime'])); ?>"><?=date("j/n/Y",strtotime($Logs['time'])); ?> ?
[07:53:07]
@
CrazyCat
utilise lasttime plutôt que time
[07:53:55]
%
Amand
hm déjà j'ai fait une bêtise, j'ai crée la vue dans le root alors que je suis sous amandweb
[07:54:54]
%
Amand
j'ai mis au début :
[07:54:55]
%
Amand
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY
[07:55:15]
@
CrazyCat
C'est pas génant ça
[07:56:58]
%
Amand
par contre j'arrive pas à retrouver ma vue dans phpmyadmin pour modif la requête
[07:57:02]
%
Amand
je fouille un peu
[07:58:07]
@
CrazyCat
Normalement dans la colonne de gauche (rafraichit la page) tu dois avoir dans ta bases une arbo
[07:58:15]
@
CrazyCat
et dedans tu as tables et vues
[07:58:53]
%
Amand
c bon j'ai trouvé
[08:02:03]
%
Amand
je vais recrée ma vue au propre
[08:02:12]
%
Amand
CREATE ALGORITHM=UNDEFINED DEFINER=`amandweb`@`localhost` SQL SECURITY
[08:02:12]
%
Amand
DEFINER VIEW stats_connex AS SELECT COUNT(DISTINCT id) AS nbc, MAX(`time`) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco FROM logsusers GROUP BY nick, username, ip
[08:05:48]
%
Amand
il a pas l'air d'apprecié :
[08:05:49]
%
Amand
SELECT nbc, lasttime, codepays, nick, username, ip, host, realname, webirc, sslco FROM stats_connex ORDER BY lasttime LIMIT 100
[08:06:16]
%
Amand
j'ai eu une connexion time out
[08:06:21]
%
Amand
la requête doit être trop grosse
[08:06:30]
%
Amand
en ressource
[08:06:42]
@
CrazyCat
Ben non, c'est la même que tout à l'heure
[08:06:57]
%
Amand
oui là elle est passé
[08:07:05]
%
Amand
Affichage des lignes 0 - 99 (total de 100, traitement en 56.3495 seconde(s).) [lasttime: 2022-06-19 20:40:13... - 2022-06-19 20:45:08...]
[08:07:21]
@
CrazyCat
Mouais mouais mouais
[08:07:42]
@
CrazyCat
Ton champ time, c'est un timestamp ?
[08:08:18]
%
Amand
non datetime
[08:10:31]
@
CrazyCat
Pourquoi il y a le ON UPDATE ?
[08:11:15]
%
Amand
pour mettre l'heure actuelle lors de l'insertion
[08:11:38]
%
Amand
j'avas vu ça dans un tuto
[08:12:32]
@
CrazyCat
Ben tu as déjà la valeur par défaut
[08:13:03]
@
CrazyCat
Cet extra sert à mettre à jour la valeur si tu fais une action sur l'enregistrement
[08:13:37]
@
CrazyCat
C'est utilisé par exempe pour un champ de type "date de dernière modification"
[08:14:03]
@
CrazyCat
Mais *jamais* pour du log qui ne doit surtout pas être modifié
[08:15:08]
%
Amand
ok donc je met UNSIGNED
[08:15:19]
%
Amand
je sais plus c'était quelle valeur par défaut
[08:15:21]
@
CrazyCat
Non, tu ne mets rien
[08:15:34]
@
CrazyCat
Par défaut ce champ est vide
[08:15:41]
%
Amand
c'est fait
[08:25:02]
%
Amand
je reviens dans quelques minutes
[08:46:22]
@
CrazyCat
Bon, j'ai l'explication pour le ralentissement, mais pas la solution
[08:47:02]
@
CrazyCat
Quand tu fais un order by, MySQL est obligé de lire tous les enregistrements, donc forcément au bout d'un moment ça coince
[09:39:21]
@
CrazyCat
Après, il y a un autre truc, tu as peut-être mis trop d'index
[09:39:39]
@
CrazyCat
Plus tu mets des index plus mysql à des données à lire
[09:41:20]
%
Amand
hm je devrais retirer quel index?
[09:47:51]
@
CrazyCat
Tout dépend de ce à quoi te sert ta table en plus de cette requête
[09:49:41]
%
Amand
elle sert juste à lire les données de la base
[09:49:49]
%
Amand
dans ma page search pareil
[09:50:21]
@
CrazyCat
Dans ta page search, tu peux chercher sur quoi ?
[09:52:31]
%
Amand
$words[$index] = "ip LIKE '{$word}' OR nick LIKE '{$word}' OR username LIKE '{$word}' OR host LIKE '{$word}' OR realname LIKE '{$word}'";
[09:53:17]
%
Amand
ip , nick , username , host , realname
[09:55:56]
@
CrazyCat
tu dois pouvoir virer celui sur realname et sur host
[09:56:24]
@
CrazyCat
Et il faudrait que tu essayes dans phpmyadmin:
[09:56:52]
@
CrazyCat
select d.* from (SELECT COUNT(DISTINCT id) AS nbc, MAX(`time`) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco FROM logsusers GROUP BY nick, username, ip) as d order by d.lasttime
[09:57:24]
@
CrazyCat
Un index sur time par contre
[09:59:05]
@
CrazyCat
D'après mes tests, la dernière requête que je t'ai donnée n'optimise rien :D
[09:59:34]
%
Amand
ça charge toujours x)
[10:01:32]
%
Amand
Affichage des lignes 0 - -1 (total de 0, traitement en 52.1294 seconde(s).) [lasttime: 2022-06-19 20:40:13... - 2022-06-19 20:41:15...]
[10:02:27]
@
CrazyCat
Oui, je ne vois pas quelle solution utiliser
[10:06:51]
%
Amand
quand on défini pas de order by dans une requête
[10:07:14]
%
Amand
y'a un tri par défault ?
[10:07:59]
@
CrazyCat
Normalement, par l'id auto incrément, mais dans le cas d'un group by, je ne sais pas
[10:15:38]
%
Amand
j'ai une problématique sur une requête
[10:15:42]
%
Amand
SELECT COUNT(*) AS nbMessages FROM logsusers WHERE {$wordSql}
[10:16:21]
%
Amand
SELECT COUNT(*) AS nbMessages FROM logsusers
[10:16:28]
%
Amand
va me retourner: 3108765
[10:16:56]
%
Amand
hm non
[10:17:14]
%
Amand
bon je vais chercher un peu de mon côté je re
[10:17:32]
@
CrazyCat
Pour l'instant je ne vois pas ton souci :)
[10:21:20]
%
Amand
j'ai pas envie de te prendre trop la tête, c'est un peu casse tête
[10:21:39]
%
Amand
j'ai deux requêtes, la deuxieme qui fait un DISTINCT
[10:22:00]
%
Amand
et la premiere non, c'est à dire : SELECT COUNT(*) AS nbMessages FROM logsusers WHERE {$wordSql}
[10:22:30]
%
Amand
ça va fausser la pagination
[10:22:46]
%
Amand
( c'est ma partie search )
[10:22:59]
@
CrazyCat
La première te sort le nombre total de messages
[10:23:29]
@
CrazyCat
La seconde n'a rien à voir avec la 1ère
[10:25:16]
%
Amand
c'est un peu délicat à expliquer, je vais faire ça étape par étape :
[10:25:35]
@
CrazyCat
La première, tu veux t'en servir juste pour la pagination ?
[10:25:56]
%
Amand
donc quand je fais un : SELECT * FROM `logsusers` WHERE nick LIKE "test01" il me retourne bien total de 383
[10:27:04]
%
Amand
/ Permet de définir le nombre de messages par page
[10:27:04]
%
Amand
$maxParPage = 100;
[10:27:22]
%
Amand
j'ai limité à 100 réponse par page donc on est bon, par contre, j'ai seulement 5 résultats
[10:27:54]
@
CrazyCat
Ben oui, vu que sur la 2ème tu as du groupage
[10:29:20]
%
Amand
l'inconvénient quand tu fais un script et tu reviens dessus un mois ou deux après
[10:29:27]
%
Amand
tu ne sais plus pk tu as fait ci ou ca
[10:30:17]
@
CrazyCat
Tu as une requête qui compte toute les lignes, et une qui te sort un résumé.
[10:30:42]
@
CrazyCat
Je pense que la somme des nbc de la 2ème requête fait 333
[10:32:57]
@
CrazyCat
Le premier truc que tu devrais faire, c'est écrire noir sur blanc (et sans penser au code) à ce que tu veux faire sur ta page
[10:36:04]
%
Amand
ah mais non enfaite c'est bon pour le résultat
[10:37:09]
%
Amand
c'est la pagination qui est pas bonne, il me met 4 pages alors qu'il devrait en mettre qu'une
[10:39:59]
%
Amand
/ On récupère le nombre de messages
[10:39:59]
%
Amand
$reqCount = $bdd->prepare("SELECT COUNT(*) AS nbMessages FROM logsusers WHERE {$wordSql}");
[10:40:20]
%
Amand
je dois modif la requête pour qu'il prenne pas en compte les doublons
[10:40:36]
%
Amand
et m'afficher 5
[10:40:43]
%
Amand
du coup ma deuxieme requête est bonne
[10:40:55]
@
CrazyCat
Attends, j'essaye de te faire ça plus propre
[10:41:13]
%
Amand
je te te montre la page en globalité
[10:43:27]
%
Amand
dsl pour l'indent
[10:45:45]
@
CrazyCat
Tu as 2 fois la même requête dans ta page ?
[10:46:03]
@
CrazyCat
Ligne 11 et ligne 49
[10:47:22]
%
Amand
oui c'est un doublon, je comptais le retirer
[10:47:46]
%
Amand
tu l'as vu direct, je m'en suis rendu compte que ce matin que j'avais fait un doublon
[10:48:08]
@
CrazyCat
Jette un oeil à ce que j'ai fait de ta page :)
[10:52:06]
%
Amand
parfait ! là c'est impec
[10:52:26]
%
Amand
le seul problème, c'est le temps de chargement
[10:52:46]
%
Amand
il met pratiquement une minute c'est énorme
[10:53:36]
%
Amand
merci CrazyCat
[10:54:15]
@
CrazyCat
Ah ben ça, vu le nombre de lignes, le order fatigue bien
[10:54:41]
@
CrazyCat
Après, as-tu besoin de garder autant de lignes ?
[10:55:20]
%
Amand
j'ai une petite erreur
[10:55:35]
%
Amand
sur une recherche avec plusieurs pages
[10:55:38]
%
Amand
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
[10:56:53]
@
CrazyCat
C'est ta table: tes champs n'ont pas le même interclassement
[10:57:24]
@
CrazyCat
tu as du mix utf8 et utf8mb4
[10:58:46]
%
Amand
pourtant ils ont le même interclassement
[11:01:46]
%
Amand
apparemment c'est ma ligne 19
[11:01:54]
@
CrazyCat
Et ta table elle-même ?
[11:01:57]
%
Amand
# Nombre de client enregistré dans la bdd
[11:01:57]
%
Amand
$reqCount = $bdd->prepare("SELECT COUNT(*) AS nbMessages FROM logsusers WHERE {$wordSql}");
[11:01:58]
%
Amand
$nbMessages = intval($reqCount->fetch()['nbMessages']);
[11:01:58]
%
Amand
$reqCount->execute();
[11:02:04]
%
Amand
au niveau du execute()
[11:02:15]
%
Amand
ma requete qui fait doublon
[11:02:22]
@
CrazyCat
Ah mais faut la virer
[11:04:25]
%
Amand
maintenant il me dit ligne 68 qui correspond à :
[11:04:44]
%
Amand
# Requête qui permet de mettre en mémoire le nombre total de lignes concernées
[11:04:44]
%
Amand
$reqLogs = $bdd->prepare("SELECT SQL_CALC_FOUND_ROWS COUNT(DISTINCT id) AS nbc, MAX(time) AS lasttime, codepays, nick, username, ip, host, realname, webirc, sslco FROM logsusers WHERE {$wordSql} GROUP BY nick, username, ip ORDER BY lasttime DESC LIMIT :start, :offset");
[11:04:44]
%
Amand
$reqLogs->bindValue(':offset', $maxParPage, PDO::PARAM_INT);
[11:04:44]
%
Amand
$reqLogs->bindValue(':start', $start, PDO::PARAM_INT);
[11:04:44]
%
Amand
$reqLogs->execute();
[11:04:49]
%
Amand
à l'execute de cette requête
[11:04:55]
@
CrazyCat
Regarde l'interclassement de ta table
[11:06:03]
%
Amand
Interclassement utf8mb4_general_ci
[11:06:58]
@
CrazyCat
Dans le doute, va dans les opérations de la table, et dans les options, tu coches "Changer le classement de toutes les colonnes" et tu exécutes
[11:12:24]
@
CrazyCat
Et un autre truc: c'est peut-être le contenu de ta recherche qui pose problème
[11:12:51]
@
CrazyCat
Quand tu définis ta connexion à la base, ajoute ;charset=utf8mb4 après le nom de la base
[11:13:14]
@
CrazyCat
Ca forcera PDO à utiliser le bon jeu de caractères
[11:16:14]
%
Amand
yes c'est effectivement le contenu de ma recherche, il a pas l'air d'apprecié le %
[11:16:39]
%
Amand
je vais tenter, ta motif
[11:18:01]
@
CrazyCat
le % qui est dans le like ?
[11:18:17]
@
CrazyCat
Ton php est bien en utf8 ?
[11:20:26]
%
Amand
oui ça a l'air bon maintenant je continue mes tests
[11:27:06]
%
Amand
j'ai plus d'erreur mais quand je vais sur la page 2 le tableau est vide
[11:29:32]
@
CrazyCat
Tu as combien de résultats ?
[11:30:41]
@
CrazyCat
Et tes liens sont bons dans la pagination ?
[11:32:00]
%
Amand
normalement oui
[11:32:05]
%
Amand
je te dis le résultat now
[11:34:19]
%
Amand
premiere page : 471375 , deuxieme page 0
[11:36:04]
@
CrazyCat
Et tu as bien le paramètre de recherche dans l'url ?
[11:37:34]
%
Amand
?search=%abo.wanadoo.fr&page=2
[11:40:55]
@
CrazyCat
Mais avec page=1 ça marche ?
[11:41:18]
@
CrazyCat
Ou bien ça ne marche que quand il n'y a pas page= ?
[11:46:51]
%
Amand
je test
[11:48:23]
%
Amand
oui même page=1 ne fonctionne pas
[11:48:34]
%
Amand
il me retourne 0 et un tableau vide
[11:52:14]
@
CrazyCat
fait un echo de de $page et de $word
[11:56:43]
@
CrazyCat
Tu peux m'appeler bb mais je risque de pas répondre :D
[14:12:57]
*
ozswar
joined #informatique
[14:17:37]
*
Amand
quit (Quit: Connection closed for inactivity)
[14:30:37]
*
ozswar
quit (Ping timeout: 180 seconds)
[14:58:14]
*
ozswar
joined #informatique
[15:01:31]
*
ozswar
quit (Ping timeout: 180 seconds)
[15:21:20]
*
ozswar
joined #informatique
[17:27:21]
*
Amand
joined #informatique
[17:27:21]
*
[Guru]
set mode +h Amand
[17:27:46]
*
ozswar
left #informatique