OVH Cloud OVH Cloud

Requete

7 réponses
Avatar
- = Cyriloch = -
Bonsoir,

Je récupère les données d'une table d'articles de la façon suivante :

$RequeteSelection = "SELECT ArticleReference, ArticleDesignation,
PrixVente, TypeTVA FROM Articles";
$ResultatSelection = mysql_query($RequeteSelection) or die ('Requête
impossible (Requête Articles)');
$NbEnr = mysql_num_rows($ResultatSelection);
while ($_DONNEES = mysql_fetch_array($ResultatSelection))
{
array_push($ArticleReference, $_DONNEES['ArticleReference']);
array_push($ArticleDesignation, $_DONNEES['ArticleDesignation']);
array_push($PrixVente, $_DONNEES['PrixVente']);
array_push($TypeTVA, $_DONNEES['TypeTVA']);
}

Or lorsqu'on dépasse 2000 articles, cela devient assez lourd... J'ai cru
trouvé une solution en passant par un fichier txt :

$Fichier = 'Articles.txt';
$records = unserialize(implode('',file($Fichier)));
foreach ($records as $value)
{
array_push($ArticleReference, $value['ArticleReference']);
array_push($ArticleDesignation, $value['ArticleDesignation']);
array_push($PrixVente, $value['PrixVente']);
array_push($TypeTVA, $value['TypeTVA']);
}

Mais le résultat est très décevant : c'est à peine plus rapide...

Vers quelle piste pourriez-vous m'orienter afin d'améliorer les
performances ?

Merci de vos conseils,

Cyriloch

7 réponses

Avatar
bruno at modulix
- = Cyriloch = - wrote:
Bonsoir,

Je récupère les données d'une table d'articles de la façon suivante :

$RequeteSelection = "SELECT ArticleReference, ArticleDesignation,
PrixVente, TypeTVA FROM Articles";
$ResultatSelection = mysql_query($RequeteSelection) or die ('Requête
impossible (Requête Articles)');
$NbEnr = mysql_num_rows($ResultatSelection);
while ($_DONNEES = mysql_fetch_array($ResultatSelection))
{
array_push($ArticleReference, $_DONNEES['ArticleReference']);
array_push($ArticleDesignation, $_DONNEES['ArticleDesignation']);
array_push($PrixVente, $_DONNEES['PrixVente']);
array_push($TypeTVA, $_DONNEES['TypeTVA']);
}


Ya un truc qui m'échappe, là... Tu a tes données dispo dans le résultat
de la réqête, pourquoi tu veux les mettre dans un tableau ???

Or lorsqu'on dépasse 2000 articles, cela devient assez lourd... J'ai cru
trouvé une solution en passant par un fichier txt :

$Fichier = 'Articles.txt';
$records = unserialize(implode('',file($Fichier)));
foreach ($records as $value)
{
array_push($ArticleReference, $value['ArticleReference']);
array_push($ArticleDesignation, $value['ArticleDesignation']);
array_push($PrixVente, $value['PrixVente']);
array_push($TypeTVA, $value['TypeTVA']);
}

Mais le résultat est très décevant : c'est à peine plus rapide...


Lol.

Vers quelle piste pourriez-vous m'orienter afin d'améliorer les
performances ?


NB : je suppose que c'est pour afficher dans une page web...

1/ arrêter les conneries avec les tableaux dans lesquels on copie les
ligne du fichier CSV qu'on a créé à partir du résultat d'une reqête.
Fais ta requête et affiche directement le résultat, ça ira plus vite...

2/ paginer tes résultats. Je doute franchement que tu ai vraiment besoin
d'afficher 2000 articles ou plus sur une même page. Il est parfaitement
possible de récupérer les enregistrements par paquets de 100 (AMHA
largement suffisant pour une seule page).



--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
- = Cyriloch = -

Merci pour la réponse.

Ya un truc qui m'échappe, là... Tu a tes données dispo dans le résultat
de la réqête, pourquoi tu veux les mettre dans un tableau ??

1/ arrêter les conneries avec les tableaux dans lesquels on copie les
ligne du fichier CSV qu'on a créé à partir du résultat d'une reqête.
Fais ta requête et affiche directement le résultat, ça ira plus vite...


En fait, j'utilise les données de la requête pour les afficher un menu
déroulant (choix d'un article pour créer un ticket de caisse) et ce même
menu déroulant est utilisé plusieurs fois dans le formulaire (selon un
choix de l'utilisateur et 5 fois par défaut). Il m'a semblé qu'il était
plus rapide de stocker les résultat dans un tableau que de répéter la
requête x fois : me trompè-je ?

(D'autre part c'est assez pratique car je stocke la requête dans un
fichier indépendant que j'appelle par un include lorsque j'en ai besoin).


2/ paginer tes résultats. Je doute franchement que tu ai vraiment besoin
d'afficher 2000 articles ou plus sur une même page. Il est parfaitement
possible de récupérer les enregistrements par paquets de 100 (AMHA
largement suffisant pour une seule page).


Malheureusement si, car l'utilisateur doit pouvoir choisir parmi
l'ensemble des articles.

Bref, j'en viens à me demander si je ne dois pas tout reprendre dans une
autre direction...

Cordialement,

Cyriloch

Avatar
bruno at modulix
- = Cyriloch = - wrote:

Merci pour la réponse.


De rien.


Ya un truc qui m'échappe, là... Tu a tes données dispo dans le résultat
de la réqête, pourquoi tu veux les mettre dans un tableau ??

1/ arrêter les conneries avec les tableaux dans lesquels on copie les
ligne du fichier CSV qu'on a créé à partir du résultat d'une reqête.
Fais ta requête et affiche directement le résultat, ça ira plus vite...



En fait, j'utilise les données de la requête pour les afficher un menu
déroulant (choix d'un article pour créer un ticket de caisse)


Un menu déroulant de 2000 entrées ??? Ca doit être bien point de vue
ergonomie !-)

Solution -> utilise un popup affichant une liste paginée permettant la
sélection.

et ce même
menu déroulant est utilisé plusieurs fois dans le formulaire (selon un
choix de l'utilisateur et 5 fois par défaut). Il m'a semblé qu'il était
plus rapide de stocker les résultat dans un tableau que de répéter la
requête x fois : me trompè-je ?


Théoriquement (en supposant une mémoire illimitée), non. Dans la
pratique, monter un (trop) gros volume de données en mémoire est un
antipattern connu.


2/ paginer tes résultats. Je doute franchement que tu ai vraiment besoin
d'afficher 2000 articles ou plus sur une même page. Il est parfaitement
possible de récupérer les enregistrements par paquets de 100 (AMHA
largement suffisant pour une seule page).



Malheureusement si, car l'utilisateur doit pouvoir choisir parmi
l'ensemble des articles.


Affiche la liste paginée dans une fenêtre popup.

Bref, j'en viens à me demander si je ne dois pas tout reprendre dans une
autre direction...


Comme par exemple (et au hasard) affichee la liste paginée dans une
fenêtre popup ?-)

NB : Une autre solution est la gestion d'un 'panier'.... L'utilisateur
choisis d'abord le/les articles (dans une liste paginée par exemple), ce
choix étant stocké (en session, dans une table temporaire, etc, voir les
solutions habituelles pour la gestion d'un panier). Quand son choix est
terminé, il déclenche la suite des opérations...

Mes deux centimes (et demi)
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
- = Cyriloch = -
Je te trouve un peu désagréable mais je te remercie beaucoup pour ces
explications ! Je m'en vais sans tarder de ce côté chercher !
Merci encore...

Cyriloch
Avatar
cosmoKen
Je pense que Bruno essaye juste de te faire comprendre que c'est
imbuvable se sélectionner quelque chose dans une liste de 2000
éléments.

Ergonomiquement parlant, tu devrais soit te faire une popup, soit
utiliser de l'AJAX (doc :
http://www.toutjavascript.com/savoir/xmlhttprequest.php3 ), soit une
présélection de l'article (cf. propos de Bruno).

Non seulement, ce sera plus pratique (+ rapide d'utilisation), mais
aussi plus rapide d'éxécution.
Avatar
- = Cyriloch = -

Je pense que Bruno essaye juste de te faire comprendre que c'est
imbuvable se sélectionner quelque chose dans une liste de 2000
éléments.


Bien sûr et je l'avais compris comme ainsi. Mon propos sur son côté
désagréable était une forme de clin d'oeil et mes remerciements étaient
sincères !

Ergonomiquement parlant, tu devrais soit te faire une popup, soit
utiliser de l'AJAX (doc :
http://www.toutjavascript.com/savoir/xmlhttprequest.php3 ), soit une
présélection de l'article (cf. propos de Bruno).

Non seulement, ce sera plus pratique (+ rapide d'utilisation), mais
aussi plus rapide d'éxécution.


Merci et cordialement,

Cyriloch

Avatar
Bruno Desthuilliers
Je te trouve un peu désagréable


Tu m'en vois désolé. Mais si tu préfère, je peux aussi m'abstenir de
répondre à tes questions.

Merci encore...


De rien