While sur 22000 ligne très long

Gabilach Messages postés 200 Date d'inscription mercredi 2 mars 2011 Statut Membre Dernière intervention 28 septembre 2014 - 17 juin 2014 à 21:50
BBFUNK01 Messages postés 1310 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.

4 réponses

mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 4
17 juin 2014 à 22:49
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
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
17 juin 2014 à 22:04
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 ?

0
Gabilach Messages postés 200 Date d'inscription mercredi 2 mars 2011 Statut Membre Dernière intervention 28 septembre 2014
Modifié par Gabilach le 17/06/2014 à 22:21
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...
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
20 juin 2014 à 06:28
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+
0
Rejoignez-nous