Optimisation lecture base de donnée

Fermé
Neimad94 - 14 juil. 2014 à 13:18
cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 - 15 juil. 2014 à 13:04
Bonjour,

Je souhaiterais optimiser, si cela est possible, une requête qui est censée récupérer l'adresse d'une image et l'afficher. La base de donnée contient 490 000 lignes et je dois afficher toutes les images de ma base de donnée. Ci-dessous le code utilisé.

for ($i=1 ; $i<701; $i++)
				{
				for($j=1; $j<701; $j++)
					{
					$req="SELECT urlimage FROM grille2 where numligne=$i and numcolonne=$j";
					$donne= $bdd->query ($req);
					while ($data = $donne->fetch())
						{
						$url=$data['urlimage'];
						print '<img src="'.$url.'" alt="texte alternatif" />';
						
						}
					
					}
				}
			$donne->closeCursor();


Merci d'avance pour votre aide





3 réponses

cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 12
Modifié par cyril1982 le 14/07/2014 à 21:11
Bonjour,

La première chose à faire est de ne faire qu'une seule requête au lieu de 490000 !!!!

$req="SELECT urlimage FROM grille2 ";
$donne= $bdd->query ($req);
while ($data = $donne->fetch())
 {
    $url=$data['urlimage'];
    print '<img src="'.$url.'" alt="texte alternatif" />';      
 }
$donne->closeCursor();
0
Hummmmm......Désolé, j'ai mal exposé mon problème. En fait dans ma table j'ai un champ actif (0 ou 1) et 2 champs url image (url 1 si actif 0 et url 2 si actif 1).
L'image s'affiche donc en fonction du champ actif et dans tous les cas je veux afficher TOUTES les images.

Exemple :

Ligne Colonne Actif URLimage
1 1 0 1
1 2 0 1
1 3 1 2
1 4 0 1
1 5 1 2

Sachant que le champs actif changera au fil du temps donc obliger de rebalayer la table à chaque fois...
0
cyril1982 Messages postés 110 Date d'inscription vendredi 7 mars 2014 Statut Membre Dernière intervention 19 septembre 2018 12
15 juil. 2014 à 13:04
Bonjour,

Si tu es obligé de re-parcourir ta table à chaque fois, ma solution est correcte, une seule requête qui charge tout.

Par contre, tu peux l'améliorer en ne chargeant que les lignes qui ont évolué, par exemple en ajoutant une colonne 'updated' qui indiquera s'il y a eut une mise à jour depuis le dernier chargement.
Tu couples ce fonctionnel avec un cache 'fichier' qui contient le dernier état de toutes tes lignes :

$images = array();
//Chargement du cache
if (file_exists(...))
{
 $images = unserialize(file_get_contents(...));
}

//On ne charge que les lignes qui ont évolué
$req="SELECT numligne, numcolonne, urlimage FROM grille2 where updated = 1 ";
$donne= $bdd->query ($req);
while ($data = $donne->fetch())
 {
    $images [$data['numligne'][$data['numcolonne'] = $data;
    print '<img src="'.$url.'" alt="texte alternatif" />';      
 }
$donne->closeCursor();

foreach ($images as $ligne => $imagesByCol)
{
 foreach ($imagesByCol as $colonne => $data)
 {
   print '<img src="'.$data['urlimage'].'" alt="texte alternatif" />';      
  }
}

//Remise à zéro du flag de dernière mise à jour
$req="update grille2 set updated = 0 where updated = 1 ";
$donne= $bdd->query ($req);

//Sauvegarde le cache
file_puts_content(..., serialize($images));


A voir si php aime les tableaux avec 490 000 éléments ...

Mais comment vas-tu afficher 490000 éléments sur une page web, elle va faire combien de Mo oO !???
0