[RESOLU] Affichage anticipé

Eléphant du PHP | 256 Messages

22 mai 2016, 17:40

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 ?

Mammouth du PHP | 1029 Messages

23 mai 2016, 11:09

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
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

23 mai 2016, 14:42

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 ?

Mammouth du PHP | 1029 Messages

23 mai 2016, 14:49

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.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

23 mai 2016, 15:02

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>"; }
Modifié en dernier par Herve_be le 23 mai 2016, 15:08, modifié 1 fois.

Mammouth du PHP | 1029 Messages

23 mai 2016, 15:05

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 ....;)
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

23 mai 2016, 15:26

Et peut-on "accélérer" (optimiser) le script ci-dessus ?

Mammouth du PHP | 1029 Messages

23 mai 2016, 15:59

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.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

23 mai 2016, 16:13

Timestamp est simplement une zone yymmddhhmmss

Mammouth du PHP | 1029 Messages

23 mai 2016, 16:35

Donc mon exemple fonctionne ?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

23 mai 2016, 16:56

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");

Mammouth du PHP | 1029 Messages

23 mai 2016, 18:14

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>"; }
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mai 2016, 18:18

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é :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 688 Messages

23 mai 2016, 19:20

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>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mai 2016, 20:05

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 ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...