While sur 22000 ligne très long

Signaler
Messages postés
200
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
28 septembre 2014
-
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
-
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.

4 réponses

Messages postés
6648
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
4
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
Messages postés
29162
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 août 2020
335
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 ?

Messages postés
200
Date d'inscription
mercredi 2 mars 2011
Statut
Membre
Dernière intervention
28 septembre 2014

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...
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
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+