While sur 22000 ligne très long

Messages postés
200
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
28 septembre 2014
- - Dernière réponse : BBFUNK01
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
- 20 juin 2014 à 06:28
Bonjour, je programme actuellement un site en PHP MySQL, le problème est que je récupère les données grâce à la fonction while pour faire un tableau avec les données.

Le problème est que j'ai dans les 20000 lignes à afficher dans ce tableau et que sa prend plus de 5 minutes, y aurait-il une alternative plus rapide que while ?

Merci d'avance.
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
6709
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
4
1
Merci
Bonsoir,

22000 lignes en HTML, quoique vous fassiez coté SQL, ça ralentira énormément coté navigateur!

Pour des raisons ergonomiques et efficacité, je conseille toujours de limiter l'affichage d'un tableau à la géométrie écran. Donc de fractionner les appels SQL via LIMIT.... A vous de paginer ou mettre un critère de recherche limitant la remontée des résultats via SQL....

Cordialement

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 209 internautes nous ont dit merci ce mois-ci

Commenter la réponse de mpmp93
Messages postés
26798
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2019
317
0
Merci
Bonjour,
Pour faire des boucles il n'y a pas 50 façons de faire....
Hormis le While ou le For.....

Maintenant il faut voir :
- D'où viennent les données sur lesquels tu boucles ? Une requête ?
As tu vérifier si ce n'était pas elle qui était trop longue (en la testant en direct dans ta BDD) ?

-Ne peux tu pas repenser l'affichage de tes données en n'affichant que 100 lignes par 100 par exemple ?

Commenter la réponse de jordane45
Messages postés
200
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
28 septembre 2014
0
Merci
Voila comment je fait :

 
<?php
$req1 = mysql_query('SELECT id, name, phone, cp, ville, timestamp FROM tbl_clients');
while($dn1 = mysql_fetch_array($req1)){
?>
<tr>
<td><a href="client.php?id=<?php echo $dn1['id']; ?>"><?php echo $dn1['name']; ?></a></td>
<td><?php echo $dn1['phone']; ?></td>
<td><?php echo $dn1['cp']; ?></td>
<td><?php echo $dn1['ville']; ?></td>
<td><?php echo $dn1['timestamp']; ?></td>
</tr>
<?php
}
?>


Le problème du changement d'affiche c'est que je me sert de jQuery (qui me coupe le tableau une fois charger en plusieurs onglets ) pour pouvoir faire une recherche en directe sur le tableau, si il n'y à pas d'autre option tempis je m'adapterai.
Gabilach...
Commenter la réponse de Gabilach
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Hello,

"Pour des raisons ergonomiques et efficacité, je conseille toujours de limiter l'affichage d'un tableau à la géométrie écran. Donc de fractionner les appels SQL via LIMIT.... A vous de paginer ou mettre un critère de recherche limitant la remontée des résultats via SQL.... "

Je n'aurai pas dit mieux !

Gabilach : pour le coup je te recommande de récupérer les ID de tes lignes SQL en limitant les champs de recherche dans ta requête au strict minimum, ensuite tu passes les ID récupérés dans une "moulinette" qui calculera lesquels seront à afficher sur la page courante des résultats, puis tu leur applique respectivement une requête SQL qui récupèrera toutes les informations nécessaires à l'affichage dans la page.

Par exemple si tu cibles des résultats dont le code postal est 75001 :


// tu lances ta requête sur le code postal 75001

$r = $pdo->prepare("'SELECT id, cp FROM tbl_clients WHERE cp = :cp");
$r->execute(array(":cp" => '75001'));
$Nr = $r->rowCount();

// si ta requête renvoies un résultat :

if($Nr > 0){

// tu instancies un tableau

$resultats = array();

// dans lequel tu "push" chaque ID récupéré de ta requête

while($d = $r->fetch()){ array_push($resultats, $d['id']); }

}

// Ensuite, suivant comment tu pagines tes résultats :

function Paginer($resultats){

// fonction qui va extraire les ID à afficher sur la page, à l'aide d'une fonction nommée par exemple "ExtractionID" :

$items = ExtractionID($resultats);

// Affichage des résultats via une boucle :

for($i = 0; $i < count($items); $i++){

echo $items[$i];

}

}


Voilà un petit exemple du principe, personnellement je procède ainsi sur des requêtes qui s'effectuent sur plusieurs dizaines de milliers de lignes et ça fonctionne au poil.

Au besoin, et suivant les cas, il pourra être judicieux d'effectuer des tests avec memcached pour gagner en réactivité côté serveur : ça marche plutôt bien.

A+
Commenter la réponse de BBFUNK01