Traitement fractionné d'une table de BDD (avec mysqli & php)
Fermé
clend
Messages postés
21
Date d'inscription
jeudi 2 février 2017
Statut
Membre
Dernière intervention
1 avril 2020
-
Modifié le 7 févr. 2020 à 08:34
jordane45 Messages postés 38430 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 février 2025 - 7 févr. 2020 à 20:35
jordane45 Messages postés 38430 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 février 2025 - 7 févr. 2020 à 20:35
A voir également:
- Php regular expression limit reached (pcre.backtrack_limit)
- Easy php - Télécharger - Divers Web & Internet
- Expression de recherche - Guide
- Avoir du ping expression ✓ - Forum Réseau
- Retour a la ligne php ✓ - Forum PHP
- Tu es un amour expression ✓ - Forum Loisirs / Divertissements
2 réponses
yg_be
Messages postés
23476
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 février 2025
Ambassadeur
1 568
7 févr. 2020 à 09:59
7 févr. 2020 à 09:59
bonjour, il est souvent utile, dans ce genre de situation, d'ajouter des echo pour suivre ce que fait le programme: pour vérifier la valeur des variables et quelles instructions sont exécutées.
jordane45
Messages postés
38430
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 février 2025
4 735
7 févr. 2020 à 20:35
7 févr. 2020 à 20:35
Bonjour,
Exécuter des requêtes dans des boucles n'est clairement pas une bonne solution.
Ce que j'aimerai déjà déterminer c'est... sans le code php.. ta requête est-elle longue à afficher le contenu ?
Pour ça, commence par la tester DIRECTEMENT dans ta BDD (soit en ligne de commande, soit via l'interface de phpmyadmin )
Je te propose, au passage, une petite modification de ta requête
Histoire d'accélerer un peu ta requête ( un peu beaucoup souvent....) il faudrait également voir si il y a bien des INDEX sur tes tables
A minima, je pense que tu peux en ajouter sur les champs code_profession et a3 et b5 (tu trouveras de nombreux tutos sur le net sur la mise en place d'INDEX dans les tables )
Le plus long dans ton code, ensuite, étant la "manipulation" des variables en PHP;
Par exemple, pour transformer en minuscule, il existe, en mysql, la fonction LOWER
https://www.w3resource.com/mysql/string-functions/mysql-lower-function.php
Idem pour le TRIM
https://www.w3resource.com/mysql/string-functions/mysql-trim-function.php
Et pour concaténer des champs ensembles
https://www.w3schools.com/sql/func_mysql_concat.asp
Pour avoir la première lettre en majuscule tu peux également mixer les fonction UCASE et LEFT
Bref... tout le traitement fait via ta requête SQL ne sera plus à faire en php dans des boucles... et ça ne fera que réduire le temps de traitement de ton script.
Pour finir, si tu as tant de lignes que ça à afficher, mets en place un système de pagination de façon à n'afficher qu'un millier de lignes à la fois et des boutons de changements de pages pour afficher les enregistrements suivants ou précédents...
NB: en mysqli on n'utilise plus les OR DIE ....
Fais une recherche sur le net sur le "traitement des erreurs mysqli" pour trouver des exemples plus "propres".
Exécuter des requêtes dans des boucles n'est clairement pas une bonne solution.
Ce que j'aimerai déjà déterminer c'est... sans le code php.. ta requête est-elle longue à afficher le contenu ?
Pour ça, commence par la tester DIRECTEMENT dans ta BDD (soit en ligne de commande, soit via l'interface de phpmyadmin )
Je te propose, au passage, une petite modification de ta requête
SELECT nom, prenom, profession, specialite, cp_ville, num_rue, voie, nom_voie, url FROM syw7g_ameliv WHERE cp_ville != '' AND a3 = 'C' AND (url IS NOT NULL) AND ( code_profession NOT IN('86' , '50', '21', '28', '98') OR (code_profession!='60' AND b5='5') ) ORDER BY nom
Histoire d'accélerer un peu ta requête ( un peu beaucoup souvent....) il faudrait également voir si il y a bien des INDEX sur tes tables
A minima, je pense que tu peux en ajouter sur les champs code_profession et a3 et b5 (tu trouveras de nombreux tutos sur le net sur la mise en place d'INDEX dans les tables )
Le plus long dans ton code, ensuite, étant la "manipulation" des variables en PHP;
Par exemple, pour transformer en minuscule, il existe, en mysql, la fonction LOWER
https://www.w3resource.com/mysql/string-functions/mysql-lower-function.php
Idem pour le TRIM
https://www.w3resource.com/mysql/string-functions/mysql-trim-function.php
Et pour concaténer des champs ensembles
https://www.w3schools.com/sql/func_mysql_concat.asp
Pour avoir la première lettre en majuscule tu peux également mixer les fonction UCASE et LEFT
Bref... tout le traitement fait via ta requête SQL ne sera plus à faire en php dans des boucles... et ça ne fera que réduire le temps de traitement de ton script.
Pour finir, si tu as tant de lignes que ça à afficher, mets en place un système de pagination de façon à n'afficher qu'un millier de lignes à la fois et des boutons de changements de pages pour afficher les enregistrements suivants ou précédents...
NB: en mysqli on n'utilise plus les OR DIE ....
Fais une recherche sur le net sur le "traitement des erreurs mysqli" pour trouver des exemples plus "propres".
7 févr. 2020 à 10:07
Mais il se trouve -sans doute dû au dysfonctionnement de ma boucle- qu'aucun affichage n'apparaît à l'écran tant que ma table n'est pas refermée.
J'ai tout essayé : echo, printf, print_r, alert javascript. Toutes ces méthodes restent muettes !
Ceci dit, le problème se situant à l'évidence à l'intérieur de mes 2 "whiles", il y a peu de code et de variables à analyser (essentiellement les valeurs pour les paramètres "LIMIT" & "OFFSET", soit 2 valeurs). Disons 3 en tenant compte du n° d'itération.
7 févr. 2020 à 10:37
as-tu le même comportement si tu ne gardes que la structure du programme et n'interroges pas la bdd dans les boucles?
Modifié le 7 févr. 2020 à 11:15
Je connaissais bien flush(), mais ne l'utilisant plus depuis longtemps je l'avais complètement oublié.
Donc, en forçant le vidage du buffer à la fin de chaque itération, l'ensemble de ma table se vide bien et vient s'afficher dans sa globalité sélectionnée.
J'ai dû utiliser la conjugaison :
ob_flush();
flush();
Un pépin néanmoins : après ce bon déroulé, le processus se plante avec l'erreur :
--> 0 - PHP regular expression limit reached (pcre.backtrack_limit)
J'ai pourtant une valeur élevée pour ce paramètre de php : 1500 000 ! et idem pour pce.recursion_limit (en accord avec mon hébergeur).
7 févr. 2020 à 17:58