Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/12/2006, à 22:58

g_barthe

optimisation de code php ?

Bonsoir,

Je voudrais votre avis sur ce code php qui me permet d'afficher 2500 enregistrements d'une table mysql

<td width=""><input type="text" name=<?php echo "code".$i; ?> size="6" value=<?php echo $code; ?> ></td>

		<td width=""><input type="text" name=<?php echo "nom".$i; ?> size="8" value=<?php echo mysql_result($liste_locaux,0,("nom")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "zone_bat".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("zone_ou_bat")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "fiche_espace".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("fiche_espace")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "cta".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("CTA")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vent_rep".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("vent_reprise")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vent_rej".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("vent_rejet")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vmc".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("VMC")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vent_ext_spec".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("vent_extrac_spec")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vent_an".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("VAN")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "surf".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("surf")); ?> ></td>

		<td width=""><input type="text" name=<?php echo "vol".$i; ?> size="3" value=<?php echo mysql_result($liste_locaux,0,("vol")); ?> ></td>

		</tr>

Et ca devient super long à afficher.

Je pense que j'ai une lourdeurdans l'ouverture et la fermeture des balise php à l'intérieur des lignes html du tableau. Mais je ne vois pas trop comment faire.

Auriez-vous une petite idée sur ce que je propose où une autre idée d'ailleurs.

Merci à vous.


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#2 Le 23/12/2006, à 03:14

Frz

Re : optimisation de code php ?

Salut !

Je suppose que la portion de code est répétée 2500 fois, c'est bien cela ?
Si oui, une simple boucle pourra t'aider :

<?php

// Connexion à ta BDD
// ...

// Requête :
$sql = "ta requete SQL-qui-va-bien";
$res = mysql_query($sql);

// Fermeture de la connexion à ta BDD
// ...

// Et le morceau qui nous intéresse :

while($enregistrement = mysql_fetch_array($res))
{
// ta portion de code ici
// attention, il faut maintenant se servir du tableau $enregistrement
// par exemple :
print "<td width=\"\"><input type=\"text\" name=\"code".$enregistrement["code"]."\" size=\"6\" value=\"".$enregistrement["code"]."\"></td>";
}

@mysql_free_result($res);

?>

Ainsi, tu n'auras à répéter qu'une fois ton code. De plus, l'utilisation de mysql_fetch_array est plus rapide et moins couteuse que celle de mysql_result.

Je te laisse regarder la doc de mysql_fetch_array pour plus d'infos wink

Ah et attention aux guillemets avec print wink Pense à les échapper !

Dernière modification par Frz (Le 23/12/2006, à 03:16)

Hors ligne

#3 Le 23/12/2006, à 11:23

g_barthe

Re : optimisation de code php ?

merci de cette explication je vais me pencher la dessus et je vous tiens au courant.


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#4 Le 24/12/2006, à 15:51

Lord Northam

Re : optimisation de code php ?

M'enfin, le problème ne vient pas de mysql_result() !
Et mysql_fetch_array() ne changera rien du tout !

Vous ne vous rendez pas compte que le PHP va générer 12x2500 balises input ? 30.000 cases de saisie uniquement pour afficher des données c'est du délire.

Déjà, on peut exploiter un peu plus MySQL : Je n'ai pas le nom de votre table alors je la nomme  "liste_locaux", à vous de changer ensuite.

$la_requete = "
SELECT CONCAT('<tr>',
			'<td>',COUNT(nom),'</td>',
			'<td><strong>',nom,'</strong></td>',
			'<td>',zone_ou_bat,'</td>',
			'<td>',fiche_espace,'</td>',
			'<td>',CTA,'</td>',
			'<td>',vent_reprise,'</td>',
			'<td>',vent_rejet,'</td>',
			'<td>',VMC,'</td>',
			'<td>',vent_extrac_spec,'</td>',
			'<td>',VAN,'</td>',
			'<td>',surf,'</td>',
			'<td>',vol,'</td>',
			'</tr>') AS ligne

FROM liste_locaux
";

La requête SQL va concatener toutes les colonnes en une seule comprenant directement le code HTML. Pour vous montrer les possibilités, j'ai mis le nom en gras avec la balise HTML strong. (On peut ajouter une 13ème colonne avec un lien pour éditer les informations de la ligne.

Après, en PHP c'est d'autant plus simple : mysql_result() ou mysql_fetch_array()

<table class='la_classe_css_de_la_table'>
<?php
$res = mysql_query($la_requete);
while($ligne = mysql_fetch_array($res)) echo $ligne['ligne'];
?>
</table>

Voilà, testez et voyez.

Hors ligne

#5 Le 26/12/2006, à 02:09

Frz

Re : optimisation de code php ?

Euh, d'un côté je ne vois pas trop ce que ça change.
S'il a besoin de générer x <input>, je ne vois pas en quoi c'est gênant pour PHP... C'est un choix, ça ne ralentit en rien le script (ou on m'aurait menti ?).

Pour ce qui est de mySQL, c'est une bonne solution mais elle a le désavantage de ne pas séparer données et présentation des données. En gardant une requête indépendante de la présentation, il pourra la réutiliser sans problème wink

Ah et pour finir, mysql_fetch_array et largement plus efficace que mysql_result (cf doc PHP) smile

Hors ligne

#6 Le 28/12/2006, à 01:13

Lord Northam

Re : optimisation de code php ?

Et bien si tu ne te braque que sur le titre du post en jouant sur les mots... Tu ne l'aideras aucunement.

g_barthe a écrit :

Et ca devient super long à afficher.

Je pense que j'ai une lourdeurdans l'ouverture et la fermeture des balise php à l'intérieur des lignes html du tableau. Mais je ne vois pas trop comment faire.

Auriez-vous une petite idée sur ce que je propose où une autre idée d'ailleurs.

Certes mysql_fetch_array() est plus performante, mais relis sa question. Tu ne crois quand même pas que dans son cas le changement de fonction PHP va tout résoudre ?

Il est pourtant clair ici que le problème vient du fait qu'un navigateur n'est pas prévu pour gérer 30.000 balises input ! Une page HTML ce n'est pas un tableur, et imaginer faire un UPDATE en MySQL des 30.000 données d'un coup ce n'est plus du délire mais de la démence. lol
Il y a sûrement d'autres solutions pour ce qu'il cherche à réaliser.

Pour le SELECT, ça tombe bien, ça sert justement à présenter les données à l'utilisateur !! wink
Le SELECT ne stock aucunement les données. Et comme on est pas dans un terminal, ajouter du code HTML dans la requête n'affecte en rien les dites données, la sépatation est donc bien présente.
Une telle requête devient une vue, directement dans la base de données. Elle n'a donc aucun désavantage, puisqu'il est toujours possible de réaliser un SELECT classique quand le but est autre.

g_barthe, si les solutions proposées ne te conviennent pas, explique nous un peu plus ce que tu désire faire. On trouvera certainement une solution. smile

Hors ligne

#7 Le 28/12/2006, à 15:37

Frz

Re : optimisation de code php ?

Tu ne crois quand même pas que dans son cas le changement de fonction PHP va tout résoudre ?

Bien évidemment que non... Mais d'après ce que j'avais compris, son code n'incluait même pas de boucle. J'ai donc proposé en premier lieu la boucle while puis, en plus, le changement de fonction (un peu comme la cerise sur le gateau). Relis mon premier post tu verras smile :

Je suppose que la portion de code est répétée 2500 fois, c'est bien cela ?
Si oui, une simple boucle pourra t'aider :

Pour ce qui est d'afficher 30000 input, bien évidemment que je ne le conseille pas. Je le déconseille même vivement, rien que pour des raisons d'ergonomie ! Mais s'il en a besoin... On ne sait rien sur le but de son bouzin au final smile

Et pour le SQL, j'ai dû mal m'exprimer. Je parlais de séparer la requête du code HTML.

Bref...

Hors ligne

#8 Le 28/12/2006, à 17:25

alien7

Re : optimisation de code php ?

Pourquoi tout afficher ? Pourquoi ne pas aficher par une liste de 50 par page, aire une pagination (je sais pas si c'est l terme exacte) (à la google), avec des liens suivant et precedents.


Il n'y a pas que l'informatique dans la vie
https://www.whybook.org

Hors ligne

#9 Le 28/12/2006, à 19:25

g_barthe

Re : optimisation de code php ?

Merci à tous pour votre aide.

Je préfère tout afficher c'est un point de vue personnel.

Alors je me suis servi de ceci :

Code:

$la_requete = "
SELECT CONCAT('<tr>',
            '<td>',COUNT(nom),'</td>',
            '<td><strong>',nom,'</strong></td>',
            '<td>',zone_ou_bat,'</td>',
            '<td>',fiche_espace,'</td>',
            '<td>',CTA,'</td>',
            '<td>',vent_reprise,'</td>',
            '<td>',vent_rejet,'</td>',
            '<td>',VMC,'</td>',
            '<td>',vent_extrac_spec,'</td>',
            '<td>',VAN,'</td>',
            '<td>',surf,'</td>',
            '<td>',vol,'</td>',
            '</tr>') AS ligne

FROM liste_locaux
";

merci pour ce bout de code que j'ai adapté en incluant directement les input. Alors je veux des input pour permettre de modifier les valeurs afficher (initialement stokées en bdd). C'est la seule solution qui permet de modifier rapidement une valeur.

Seulement, je dois passer par le code précédent mais inclu dans une boucle comme cela :

$i=0;
		while ($i<$nb_locaux)
		{
			$code = mysql_result($liste_local,$i,("code"));
			$la_requete = "
			SELECT CONCAT('<tr>',
				'<td><strong><input type=''text'' name='' ',code,' '' value='' ',code,' '' size=''11''></strong></td>',
            	'<td><input type=''text'' name='' ',nom,' '' value='' ',nom,' '' size=''12''></td>',
            	'<td><input type=''text'' name='' ',zone_ou_bat,' '' value='' ',zone_ou_bat,' '' size=''3''></td>',
            	'<td>',fiche_espace,'</td>',
            	'<td>',CTA,'</td>',
            	'<td>',VAN,'</td>',
            	'<td>',vent_reprise,'</td>',
            	'<td>',vent_rejet,'</td>',
            	'<td>',VMC,'</td>',
            	'<td>',vent_extrac_spec,'</td>',
            	'<td>',surf,'</td>',
            	'<td>',vol,'</td>',
            	'</tr>') AS ligne
			FROM bd_saisies
			WHERE code = '$code'
			";
			$res = mysql_query($la_requete);
			while($ligne = mysql_fetch_array($res)) echo $ligne['ligne'];
			$i=$i+1;
		}

et ayant pris soin de compter le nombre d'enregistrement de la table et stocké en $nb_locaux. Je dois faire cette boucle pour avoir tous les enregistrements de la table sinon la requete SELECT CONCAT ne prend que le premier hmm:/ et je retombe sur un temps un peu long certe moins long tout de meme mais de l'ordre de 10-15 seconde tout de meme. Est-ce normal pour ce genre d'opérations pas forcément prévu dans php ?

La génération des input meme dans la requete sont-elle encore la source de cette legere lenteur ? ou ma condition WHERE ? Ou de la boucle while pour parcourir la table.

Merci à tous ceux qui me porte un coup de main sur cette application lourde.

Bonne soirée

PS : je me demande si l'affichage de mes 2500 lignes à 13 colonnes n'atteint pas les limites des navigateurs web (pour moi FF2.0). Car le code parait optimisé et le temps reste long donc je pense que cela vient du navigateur qui n'est pas fait pour ça.

Dernière modification par g_barthe (Le 28/12/2006, à 19:45)


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#10 Le 29/12/2006, à 08:14

boul25

Re : optimisation de code php ?

salut 2500 ligne affiché d' un coup c'est enorme,

Essaie d' afficher le resultat de ta page par 20 ligne et crée un menu 1 |2 | 3| etc...


Le libre c'est l' avenir des pays pauvres....

Hors ligne

#11 Le 29/12/2006, à 09:55

stopher

Re : optimisation de code php ?

Pour ce faire , voici un très bon tutoriel , c'est sur ce site que j'ai commencé à apprendre le php .. à les souvenirs tongue .. en j'en apprend encore tt les jours ... et ça ne risque pas de s'arrêter ..

Hors ligne

#12 Le 30/12/2006, à 15:58

lunique

Re : optimisation de code php ?

Pour savoir si la lenteur vient du navigateur ou du script en lui meme, tu peux faire un wget sur l'adresse de ta page et voir s'il lui faut aussi longtemps pour le telecharger que pour FF l'afficher.

Hors ligne

#13 Le 01/01/2007, à 19:19

Lord Northam

Re : optimisation de code php ?

g_barthe a écrit :

Alors je veux des input pour permettre de modifier les valeurs afficher (initialement stokées en bdd). C'est la seule solution qui permet de modifier rapidement une valeur.

Ce que tu veux faire, c'est un peu comme le gars qui voudrait que TOUT ses programmes soient lancés en permanance sur sa machine pour une question de facilité, et viendrait dire ensuite que son PC rame et voudrait optimiser son noyau. Tes recherches te conduisent dans la mauvaise direction.

La création de 30.000 champs input ce n'est absolument pas raisonable, une page HTML n'est pas un tableur même si ça peut paraître pratique et ergonomique à première vue. Il faut réaliser une utilisation beaucoup plus parcimonieuse (Tu en es qu'a afficher les données, les sauvegarder sera pire)

J'ai un jour réalisé un système similaire, le but serait de rajouter une 14ème colonne avec un lien HTML (jouant sur l'identifiant de la ligne, l'id MySQL), qui rafraîchissant la page, "transforme" la ligne selectionnée en formulaire (et le lien de la 14ème colonne en bouton de sauvegarde) C'est assez souple à l'utilisation.

Plus simple, le même lien ouvrirait une petite fenêtre popup (où frame prototype) avec les champs de la ligne précise en formulaire. Je suis certain qu'afficher les 2500 lignes dans un tableau SANS input, en XHTML avec CSS est bien plus rapide. Néanmoins, l'utilisation de "pages" exactement comme ce forum est bien plus performante pour l'utilisateur.

Tu peux utiliser un système de filtre, comme la requête SQL ne renvoit qu'une seule colonne - c'est la encore l'un de ses avantages - tu peux facilement dans le WHERE ajouter le contenu d'un champ de recherche (une case input en haut de page), limitant les lignes retournées à celles recherchées.

L'affichage de 30.000 input ça fait mal, en Linux Quadracore passerait peut-être encore... Mais si tu as des utilisateurs en Windows, avec IE, Avast qui scanne, sur un vieux PIII ou PIV...
Je ne suis même pas certain que IE 5.5 supporte un tel carnage. big_smile

Hors ligne