Page 1 sur 8

Affichage anticipé

Posté : 22 mai 2016, 17:40
par Herve_be
Bonjour,
J'ai un script php qui construit un tableau sur base d'une DB MySQL, c'est assez long, ce qui fait qu'il faut attendre "un certain temps" avant de voir le moindre affichage.
Est-il possible d'anticiper l'affichage, idéalement en affichant le tableau au fur et à mesure qu'il se construit, ou au moins par morceaux ?

Re: Affichage anticipé

Posté : 23 mai 2016, 11:09
par Maitrepylos
Il est possible de paginer le requête et de ne présenter que les x première lignes de la db et ensuite d'afficher page par page.
Exemple : https://www.grafikart.fr/tutoriels/php/ ... ion-php-51

Re: Affichage anticipé

Posté : 23 mai 2016, 14:42
par Herve_be
Bonjour,
Merci mais si j'ai bien compris il faut une action de l'utilisateur pour passer de page en page.
Ma question était plutôt : comment provoquer un début d'affichage tout en continuant en arrière plan ?

Re: Affichage anticipé

Posté : 23 mai 2016, 14:49
par Maitrepylos
Si la construction du tableau dépend de l'information retourné par MySQL, alors on ne peut rien faire tant que MySQL n'as pas terminé (ce qui est normal).
Donc soit on diminue le nombres de ligne retourné par MySQL, soit on attends.

Maintenant il est peut-être possible de refactoriser votre code PHP/SQL pour voir comment on peut diminuer le goulot d'étranglement.., mais il nous fait plus di'nfos sur ce que vous faites.

Re: Affichage anticipé

Posté : 23 mai 2016, 15:02
par Herve_be
Je n'ai pas besoin d'afficher une partie du tableau mais simplement "quelque chose".
La page n'est pas seulement constituée du tableau, elle contient d'autres élément qu'on pourrait afficher, mais absolument rien ne s'affiche tant que le tableau n'est pas complet.

Ceci dit, voici la construction du tableau; il provient de 2 tables MySQL
la table RVRTlog contient ... un log : date, time, ... et un userid
la table RVRTusers contient les utilisateurs, avec comme clé le userid de la première table

Code : Tout sélectionner

$db = mysql_connect ... mysql_select_db ... $results = mysql_query('select * from RVRTlog order by Timestamp DESC'); while($result = mysql_fetch_array($results)) { $Date=substr($result['Timestamp'],4,2)."/".substr($result['Timestamp'],2,2)."/20".substr($result['Timestamp'],0,2); $Time=substr($result['Timestamp'],6,2).":".substr($result['Timestamp'],8,2).":".substr($result['Timestamp'],10,2); $Userid=trim($result['Userid']); echo "<tr><td>".$Date."</td><td>".$Time."</td><td>".$result['Version']."</td><td>".$result['Module']."</td>"; $users = mysql_query("SELECT * FROM RVRTusers where Userid like '%".$Userid."%' order by Dates desc"); $user = mysql_fetch_array($users); echo "<td>".$Userid."</td><td>".$user['Prenom']."</td><td>".$user['Nom']."</td><td>".$user['Email']."</td></tr>"; }

Re: Affichage anticipé

Posté : 23 mai 2016, 15:05
par Maitrepylos
Et donc je répète, tant que le script complet n'est pas terminé, il n'est pas possible d’afficher quelque chose.
Il faut dès lors passer par des scripts clients (Ajax ....;)

Re: Affichage anticipé

Posté : 23 mai 2016, 15:26
par Herve_be
Et peut-on "accélérer" (optimiser) le script ci-dessus ?

Re: Affichage anticipé

Posté : 23 mai 2016, 15:59
par Maitrepylos
Oui, on peut, mais à vue de nez, il y a des erreurs dnas la conception de la db et dans l'utilisation de celle-ci (convention de nommage, insertion des données etc...)

Je rappelle que les fonction "mysql" sont supprimé en PHP7 et déprécié dans les versions current.
Dans votre cas, je ferais une partie du travail par MySQL, en supposant que Timestamp correspond à un Timestamp MySQL, je le ferais ainsi (et je peux encore améliorer) :

Code : Tout sélectionner

$results = mysqli_query("select trim(Userid) as 'Userid',DATE_FORMAT(Timestamp , '%d/%m/%Y') as 'date_jour', DATE_FORMAT(Timestamp , '%T') as 'heure_jour',Version,Module from RVRTlog order by Timestamp DESC"); while ($result = mysqli_fetch_array($results)) { $Date = $result['date_jour']; $Time = $result['date_heure']; $Userid = $result['Userid']; echo "<tr><td>" . $Date . "</td><td>" . $Time . "</td><td>" . $result['Version'] . "</td><td>" . $result['Module'] . "</td>"; $users = mysqli_query("SELECT Prenom,Nom,Email FROM RVRTusers where Userid like '%" . $Userid . "%' order by Dates desc"); $user = mysqli_fetch_array($users); echo "<td>" . $Userid . "</td><td>" . $user['Prenom'] . "</td><td>" . $user['Nom'] . "</td><td>" . $user['Email'] . "</td></tr>"; }
Maintenant, on peut voir comment optimaliser la deuxième partie.

Re: Affichage anticipé

Posté : 23 mai 2016, 16:13
par Herve_be
Timestamp est simplement une zone yymmddhhmmss

Re: Affichage anticipé

Posté : 23 mai 2016, 16:35
par Maitrepylos
Donc mon exemple fonctionne ?

Re: Affichage anticipé

Posté : 23 mai 2016, 16:56
par Herve_be
Non
Warning: mysqli_query() expects at least 2 parameters, 1 given in ... on line 23
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in ... on line 24

23 : $results = mysqli_query("select trim(Userid) as 'Userid',DATE_FORMAT(Timestamp , '%d/%m/%Y') as 'date_jour', DATE_FORMAT(Timestamp , '%T') as 'heure_jour',Version,Module from RVRTlog order by Timestamp DESC");

Re: Affichage anticipé

Posté : 23 mai 2016, 18:14
par Maitrepylos
Oui, enfin, le message est clair, il manque la connexion en paramètre.

Code : Tout sélectionner

$results = mysqli_query($db,"select trim(Userid) as 'Userid',DATE_FORMAT(Timestamp , '%d/%m/%Y') as 'date_jour', DATE_FORMAT(Timestamp , '%T') as 'heure_jour',Version,Module from RVRTlog order by Timestamp DESC"); while ($result = mysqli_fetch_array($results)) { $Date = $result['date_jour']; $Time = $result['date_heure']; $Userid = $result['Userid']; echo "<tr><td>" . $Date . "</td><td>" . $Time . "</td><td>" . $result['Version'] . "</td><td>" . $result['Module'] . "</td>"; $users = mysqli_query($db,"SELECT Prenom,Nom,Email FROM RVRTusers where Userid like '%" . $Userid . "%' order by Dates desc"); $user = mysqli_fetch_array($users); echo "<td>" . $Userid . "</td><td>" . $user['Prenom'] . "</td><td>" . $user['Nom'] . "</td><td>" . $user['Email'] . "</td></tr>"; }

Re: Affichage anticipé

Posté : 23 mai 2016, 18:18
par Ryle
Bonjour,

Comme indiqué dans le message d'erreur, la fonction mysqli_query() lorsqu'elle est appelée en mode procédural (et pas objet) requiert 2 paramètres :
- le lien de la connexion retourné par mysqli_connect()
- la requête SQL à exécuter

En mode objet, seule la requête doit être spécifiée en argument.

L'autre erreur sera résolue de fait, puisque mysqli_query() retournera bien un objet mysqli_result

Edit : mince, grillé :)

Re: Affichage anticipé

Posté : 23 mai 2016, 19:20
par tof73
en n'affichant pas tout dans un seul tableau, mais en mettant plusieurs tableaux les uns à la suite des autres, il est possible que l'affichage commence quand le premier tableau est entièrement envoyé au navigateur, donc avant la génération de toutes les lignes.
il faut donc ajouter plusieurs </table><table>

Re: Affichage anticipé

Posté : 23 mai 2016, 20:05
par Ryle
Tu peux également regarder les librairies javascript de type "infinite scroll" et combiner ça avec de la pagination :)

L'idée est de charger uniquement les 50/100 premières lignes de ton tableau, qui s'afficheront rapidement à l'écran. Puis, lorsque l'utilisateur utilise le scroll pour accéder aux dernières lignes chargées, tu fais un appel ajax pour charger la centaine de lignes suivantes et ainsi de suite :)

Il y a bien une action de l'utilisateur, mais celle-ci est naturelle et ne nécessite pas de cliquer sur un lien, une page ou autre.

C'est un peu complexe à mettre en oeuvre, il faut du php, du javascript et de l'ajax, mais ça se fait. C'est ce que fait google quand tu recherches des images et ça fonctionne très bien ;)