Hoe kan dit korter en sneller?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nick Dijkstra

Nick Dijkstra

07/11/2012 17:19:11
Quote Anchor link
Hoe kan ik dit sneller maken?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
    public function getReservedVoorraad($id,$filiaal){
        $qArtikelen = $this->_db->query("SELECT * FROM artikelen WHERE id='".$this->_db->escape($id)."'");
        $sArtikel = $this->_db->fetchAssoc($qArtikelen);
        
        $qUitrol = $this->_db->query("SELECT * FROM uitrol WHERE filiaal='".$this->_db->escape($filiaal)."' AND verwijderd!='1' AND ok!='1'");
        $nProducten = 0;
        while($sUitrol = $this->_db->fetchAssoc($qUitrol)){
            $qProducten = $this->_db->query("SELECT * FROM uitrol_producten WHERE uitrol='".$this->_db->escape($sUitrol['id'])."' AND artikel='".$this->_db->escape($id)."' AND verwijderd!='1'");
            $nProducten += $this->_db->numRows($qProducten);
        }

        
        $qMonteurs = $this->_db->query("SELECT * FROM monteurs_prod WHERE artikel='".$this->_db->escape($id)."' AND filiaal='".$this->_db->escape($filiaal)."' AND ok!='1'");
        while($monteurs = $this->_db->fetchAssoc($qMonteurs)){
            $nProducten += $monteurs['aantal'];
        }

        
        if($filiaal == 'ESL'){
            $nProducten = $nProducten + $sArtikel['extra_ESB'] + $sArtikel['extra_ESR'];
        }

        
        return $nProducten;
    }

?>
 
PHP hulp

PHP hulp

24/11/2024 11:24:14
 
Nick Dijkstra

Nick Dijkstra

08/11/2012 19:28:00
Quote Anchor link
*BUMP*
 
Roy -

Roy -

08/11/2012 19:32:48
Quote Anchor link
Met een join query maar daar ben ik zelf ook niet zo ster in :)
http://www.phphulp.nl/php/tutorial/overig/sql-joins-uitgebreid/479/
 
Nick Dijkstra

Nick Dijkstra

08/11/2012 19:36:23
Quote Anchor link
Uhu, ik dus ook niet :P

Misschien iemand anders?
 
Wouter J

Wouter J

08/11/2012 19:41:31
Quote Anchor link
Kun je misschien het wat duidelijker maken? Hoe zien je tabelen er bijv. uit en wat wil je hebben aan de hand van wat. Ik ben ook geen SQL ster, maar dan zou ik nog een gok kunnen wagen (om vervolgens overladen te worden met nuttige tips van Ger of Erwin :-)
 
Jeroen VD

Jeroen VD

08/11/2012 19:42:28
Quote Anchor link
database normaliseren. ik zie zo snel twee tabellen met producten. even doorgaan en je komt al snel uit op eenvoudige queries
 
Nick Dijkstra

Nick Dijkstra

08/11/2012 19:49:57
Quote Anchor link
Ik heb een tabel 'artikelen', hierin staan alle artikel omschrijvingen met alle standaard instellingen (Klant, minimale voorraad etc.). Ook heb ik een tabel met uitrol producten. Hierin staan alle producten die in een uitrol (Pakket met meerdere artikelen) zit. En nog een tabel met producten die gereserveerd staan voor een monteur, die hij op een bepaalde dag moet meenemen voor een opdracht.

Ik wil nu graag weten hoeveel artikelen er gereserveerd staan (dus in een uitrol of voor een monteur).

Op deze manier werkt hij wel, alleen erg traag.
Ik hoop dat het zo wat duidelijker is.
 
John D

John D

08/11/2012 21:21:53
Quote Anchor link
Met een goed datamodel hoef je geen data te processen in php. Er wordt doorgaans veel te veel data in php loopjes geprocessed als gevolg van te weinig kennis van datamodellering waaronder normaliseren en te weinig kennis van de mogelijkheden van SQL Queries. Begin dus met je datamodel goed op te stellen. Klanten, Artikelen, Monteurs zijn entiteiten en dus meestal ook tabellen. Producten zal een synonym zijn voor artikelen. Een tabel met producten die gereserveerd zijn is meestal een koppeltabel. Hierin kan ook de uitrol opgenomen worden. De koppeltabel bevat meestal alleen id's. Opdracht is ook een entiteit dus ook een tabel. Heb je een datamodel in de derde normaalvorm en je bouwt de juiste queries waaronder efficiente joins dan zal het vrijwel nooit traag worden en blijft alles makkelijk uitbreidbaar en flexibel. Kortom, stop met php krassen en neem eens de tijd voor datamodellering en ga de mogelijkheden van SQL ontdekken. Om met je vraag "hoe kan dit sneller" te eindigen: Dit kan sneller met efficiente joins. Verder is het ook aan te bevelen om indexen te leggen op basis van veelgebruikte attributen in je WHERE clausules.
Gewijzigd op 08/11/2012 21:28:20 door John D
 
Nick Dijkstra

Nick Dijkstra

09/11/2012 19:42:48
Quote Anchor link
Mmm, ik weet dat m'n database niet genormaliseerd is. Maar kan het nu helaas niet meer zo makkelijk aanpassen.

Iemand nog een idee hoe ik dit sneller kan maken?
 
Bo Ter Ham

Bo Ter Ham

09/11/2012 19:51:58
Quote Anchor link
Misschien door de * te vervangen door kolommen?
 
Ward van der Put
Moderator

Ward van der Put

09/11/2012 19:58:12
Quote Anchor link
Normaliseren is inderdaad echt de beste oplossing, maar als tussenoplossing kun je SELECT COUNT(*) gebruiken in plaats van SELECT * omdat je functie eigenlijk alleen telt.
 
Nick Dijkstra

Nick Dijkstra

09/11/2012 20:04:03
Quote Anchor link
Bo Ter Ham op 09/11/2012 19:51:58:
Misschien door de * te vervangen door kolommen?


Scheelt niet veel helaas. Toch bedankt.

Ward van der Put op 09/11/2012 19:58:12:
Normaliseren is inderdaad echt de beste oplossing.


Kan ik nu nog de database normaliseren terwijl het systeem vol in gebruik is?
 
Eddy E

Eddy E

09/11/2012 20:22:04
Quote Anchor link
Ja, even een nieuwe database aanmaken en alles overkopieren.
En dan van harte lust aanpassen.

Wil je alles met SQL blijven doen: geen nieuwe database, wel allemaal nieuwe tabellen (desnoods met een prefix).
En dan met wat queries (in phpMyAdmin oid) kopieren.
De oude meuk weggooien (of weg-prefixen) en de nieuwe zooi goed noemen.
En dat terwijl je de aangepaste PHP ook op de FTP gooit.

Dat kan in een uurtje, mist je alles goed voorbereid. Wel even een uurtje 'niet beschikbaar', maar dat is nachtwerk.


Toevoeging op 10/11/2012 09:17:50:

Probeer dit anders eens...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php

    public function getReservedVoorraad($id, $filiaal)
    {

        // selecteer het aantal producten die fout zijn (niet-verwijderd en niet-ok)
        $sql = "    SELECT COUNT(id) AS aantal
                    FROM uitrol_producten AS up
                    LEFT JOIN uitrol AS u
                        ON u.id = up.uitrol
                    WHERE filiaal = '"
.$this -> _db -> escape($filiaal)."'
                    AND u.verwijderd != 1
                    AND u.ok != 1
                    AND up.verwijderd != 1
                    AND up.ok != 1
                    "
;
        // voer query uit
        $producten = $this -> _db -> query($sql);
        $producten = $this->_db_fetchAssoc($producten);
        $producten = $producten['aantal'];

        if($filiaal == 'ESL')
        {

            $sql = "    SELECT extra_ESB, extra_ESR
                        FROM artikelen
                        WHERE id = "
. $this -> _db -> escape($id) . "
                        "
;
            $artikelen = $this -> _db -> query($sql);
            $artikelen = $this -> _db -> fetchAssoc($artikelen);

            $producten = $producten + $artikelen['extra_ESB'] + $artikelen['extra_ESR'];
        }


        return $producten;
    }

?>


Je returned je monteurs niet, dus dat kan je net zo goed weghalen.
Probeert correct in te springen (deze code heb ik handmatig gedaan, maar even een formatter erover doet soms wonderen.
Selecteer alleen wat je nodig hebt: het aantal doe je dus met COUNT().
Bij integers (als $id) gebruik je GEEN enkele haakjes in je query.

Het zou kunnen dat hij wat raar doet met die 4 AND ok != 1, maar zonder jouw tabellen-structuur is het voor mij ook wat gissen.
Gewijzigd op 10/11/2012 09:18:21 door Eddy E
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.