[PHP] while lus

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hej

Ik ben even de draad kwijt.

Ik heb vereenvoudigd gezien een functie in een class :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class mijnfunctie {
        function test()
    {
            $qSQL = 'SELECT *  FROM orders'; // = 30.000 records
            $result = mysql_query($qSQL);
            
            while ($row = mysql_fetch_object($result)) 
            {
                $a = $row->een_veld
            }
            
            return $a;  
    }
}


In het bestand waar ik de class in gebruik heb ik een functie waarin ik die class aanroep :
code:
1
2
3
4
5
while ($xml = $mijnfunctie->test())
    {
        echo "XML: " . $xml;
                //hier wil ik dus om de 100 records iets doen met de data
    }


Wat ik eigenlijk wil, is om de 100 records het resultaat uit de class terugsturen, en weer verder gaan tot dat de hele query is doorlopen.

Wie kan mij in de juiste richting schoppen ? Of doe ik het echt helemaal fout.?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk eens naar de modulus operator ;)
Ok, ik begrijp 't klaarblijkelijk verkeerd :P

[ Voor 20% gewijzigd door RobIII op 22-06-2010 17:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • base_
  • Registratie: April 2003
  • Laatst online: 16:44
code:
1
2
3
4
5
while ($row = mysql_fetch_object($result)) 
{
   $a = $row->een_veld
}
return $a;


geeft toch alleen de laatste row??

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
base_ schreef op dinsdag 22 juni 2010 @ 16:15:
code:
1
2
3
4
5
while ($row = mysql_fetch_object($result)) 
{
   $a = $row->een_veld
}
return $a;


geeft toch alleen de laatste row??
Ik bedoelde .= heb het even snel getypt

Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
Wat je volgens mij nodig hebt is een "yield" operator, die helaas niet in PHP zit (zie http://stackoverflow.com/...to-pythons-yield-operator). Daar staan echter wel wat alternatieven op zodat je na 100 regels een functie kan aanroepen om dingen te doen met je data, om vervolgens weer terug te gaan naar de test() functie

hallo


Acties:
  • 0 Henk 'm!

Verwijderd

Als je wilt dat er eens in de zoveel records een resultaat wordt teruggestuurd moet je natuurlijk NIET opnieuw de query uitvoeren.

Je oplossing kan werken, maar is niet het meest elegant, sowieso, waarom zou je iedere 100 records een resultaat terug willen hebben, i.p.v. alle results tegelijk?

@truegrit: hij kan natuurlijk protothreads portan van c naar php :D

alternatief kan je een tweede parameter meegeven met als default 0, en die in je query opnemen als RANGE of LIMIT element, erg fraai is het niet, want je query wordt records/100 keer uitgevoerd i.p.v. 1 keer.

Nog een suggestie: alles in 1 keer teruggeven en dan met een while of foreach lus i.c.m. array_slice() per 100 arrayelementen je xml dinges uitvoeren.

[ Voor 43% gewijzigd door Verwijderd op 22-06-2010 16:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is toch niet helemaal wat ik bedoel.

Ik heb het namelijk als eens gezien bij een class voor het uitlezen van een csv bestand, waar je het aantal regels mee kon geven waarna de class het tussentijdse resultaat zou terug sturen (i.v.m. memory & grote array's)

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op dinsdag 22 juni 2010 @ 16:10:
In het bestand waar ik de class in gebruik heb ik een functie waarin ik die class aanroep :
code:
1
2
3
4
5
while ($xml = $mijnfunctie->test())
    {
        echo "XML: " . $xml;
                //hier wil ik dus om de 100 records iets doen met de data
    }


Wat ik eigenlijk wil, is om de 100 records het resultaat uit de class terugsturen, en weer verder gaan tot dat de hele query is doorlopen.
Ik zou dan toch gewoon even kijken naar LIMIT.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 22 juni 2010 @ 16:24:
Als je wilt dat er eens in de zoveel records een resultaat wordt teruggestuurd moet je natuurlijk NIET opnieuw de query uitvoeren.

Je oplossing kan werken, maar is niet het meest elegant, sowieso, waarom zou je iedere 100 records een resultaat terug willen hebben, i.p.v. alle results tegelijk?

@truegrit: hij kan natuurlijk protothreads portan van c naar php :D

alternatief kan je een tweede parameter meegeven met als default 0, en die in je query opnemen als RANGE of LIMIT element, erg fraai is het niet, want je query wordt records/100 keer uitgevoerd i.p.v. 1 keer.
omdat er meer dan 40.000 records uit komen, en elk record moet in een xml bestand geschoten worden, zo loop ik nogal snel tegen geheugen limieten aan.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Dus je wil eigenlijk een groot aantal records ophalen en elke 100 regels de resultaten weergeven, in plaats van te wachten tot alle gegevens binnen zijn en dan in 1x uitspugen?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 22 juni 2010 @ 16:26:
Dat is toch niet helemaal wat ik bedoel.

Ik heb het namelijk als eens gezien bij een class voor het uitlezen van een csv bestand, waar je het aantal regels mee kon geven waarna de class het tussentijdse resultaat zou terug sturen (i.v.m. memory & grote array's)
Als dat je probleem is, waarom dan in een losse functie? Je result zal sowieso flink groot zijn, een kopie daarvan maken in $a is dan niet zo'n punt meer. Als je wilt dat result kleiner blijft zal je toch met LIMIT moeten werken, of een andere SQL interface gebruiken...

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class mijnfunctie {
        function test()
    {
            $qSQL = 'SELECT *  FROM orders'; // = 30.000 records
            $result = mysql_query($qSQL);
            
            while ($row = mysql_fetch_object($result)) 
            {
                $a = $row->een_veld
                    // iets met $xml = $a;
        echo "XML: " . $xml;
                //hier wil ik dus om de 100 records iets doen met de data

            }
            
            
    }
}


Snelle hack op jouw code. Als dit niet goed genoeg is moet je het via je SQL interface afhandelen, kan je mysql_query() wel overboord gooien

[ Voor 14% gewijzigd door Verwijderd op 22-06-2010 16:32 ]


Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 17-09 09:59
[php]
$rows = array();
while ($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
$columns = array_chunk($rows, 1000);
foreach ($columns as $column) {
// do something
}
[/php]

niet getest


Nevermind, je zoekt gewoon outputbuffering.

[ Voor 25% gewijzigd door phex op 22-06-2010 16:37 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Waarom zou je 30.000 records in je geheugen nemen terwijl je daar slechts een zeer kleine selectie van nodig hebt? :)

[ Voor 25% gewijzigd door CodeCaster op 22-06-2010 16:36 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Twan V
  • Registratie: Oktober 2001
  • Laatst online: 16-09 15:39

Twan V

...en er stralend uitzien

PHP:
1
2
3
4
5
6
7
8
9
10
$counter = 0;
while($row = mysql_fetch_assoc($result)){
//   $xml = $row['field'];
     echo "\t<data>" . $row['field'] . "</data>\n";

     $counter++;

     if( $counter % 100 == 0 )
          flush();
}


zoiets?

[ Voor 17% gewijzigd door Twan V op 22-06-2010 16:42 ]

Blaat het niet dan schaadt het niet...
Reflex Discoshow - Het beste wat je bruiloft kan overkomen


Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 17-09 09:59
Hij heeft ze allemaal nodig, alleen hij wou "iets" doen per 1000 records. Alleen dat iets blijkt dus output buffering te zijn. (werkt overigens niet goed onder windows of met gzip etc)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CodeCaster schreef op dinsdag 22 juni 2010 @ 16:36:
[...]

Waarom zou je 30.000 records in je geheugen nemen terwijl je daar slechts een zeer kleine selectie van nodig hebt? :)
Omdat ik ze wel allemaal nodig heb. Dat is het probleem juist :)
phex schreef op dinsdag 22 juni 2010 @ 16:39:
Hij heeft ze allemaal nodig, alleen hij wou "iets" doen per 1000 records. Alleen dat iets blijkt dus output buffering te zijn. (werkt overigens niet goed onder windows of met gzip etc)
Dat iets is eigenlijk het versturen naar een Soap service, maar voor het gemak heb ik dat even weggelaten hier

Maar als ik het goed begrijp is het niet mogelijk om een functie in een class aan te roepen die een query doorloopt en om de 100 records het resultaat even terugstuurt ?

[ Voor 48% gewijzigd door MueR op 22-06-2010 17:03 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Zou je voortaan gewoon je reacties in een bericht kunnen zetten? Daar is de Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif knop uitermate geschikt voor.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • mtsr
  • Registratie: December 2008
  • Laatst online: 25-07 11:13
Nouja, je kunt misschien een callback gebruiken, dat betekent dat je om de 100 records een functie aanroept die je in als argument hebt meegegeven. Ik denk alleen niet dat dit de juiste oplossing is voor je probleem.

Ik zou nog eens goed nadenken hoe je dit wilt aanpakken, het is namelijk helemaal niet logisch dat 1 aanroep van jouw service 400 keer iets teruggeeft. Het lijkt dan zinniger als iemand bij het aanroepen van jouw service inderdaad een RANGE kan aangeven.

[ Voor 6% gewijzigd door mtsr op 22-06-2010 17:04 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op dinsdag 22 juni 2010 @ 16:40:
[...]


Omdat ik ze wel allemaal nodig heb. Dat is het probleem juist :)
Je zegt toch dat je tegen geheugenlimieten aanloopt...

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...

Pagina: 1