[PHP] Return FetchAssoc

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een database claas aan het maken, maar het lukt me niet om de array van mysql_fetch_assoc te returnen...

Dit werkt niet... (Krijg je alleen eerste record)
PHP:
1
2
3
4
5
<?php
public static function fetchAssoc($query){
    return mysql_fetch_assoc(self::query($query));
}
?>


Probeersel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
public static function query($query){
        self::connect();
        if(@!$res = mysql_query($query)){
            self::error("Couldn't execute the query");
        }
        return $res;
    }
    
    public static function fetchAssoc($query){
        $result = array();
        while($res = mysql_fetch_assoc(self::query($query))){
            $result[] = $res;
        }
        print_r($result);       
        return $result; 
    }
?>


Helaas blijft hij nu de hele tijd loopen
PHP:
1
2
3
while($res = mysql_fetch_assoc(self::query($query))){
    $result[] = $res;
}


Is er een andere oplossing of waarom blijft hij loopen?

[ Voor 3% gewijzigd door Verwijderd op 11-06-2009 14:12 ]


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 18:59
Ik vermoed dat ie blijft lopen omdat hij iedere keer weer opnieuw self::query doet, ik zou die dus even los halen (resultaat in een var zetten en die var gebruiken bij fetch_assoc)

En als ik vragen mag, waarom maak je alles static? Dan zit je met deze klasse hard gebonden aan 1 database connectie per programma. Als je het echt object based maakt kun je ook 10 db objecten aanmaken naar 10 verschillende db's, terwijl nu hard gebonden zit aan 1 db.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Omdat maar 1db wor gebruikt...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit werkt;
MAAR:
Nu verkrijg ik array in een array...

Vb:
Array ( [0] => Array ( [id] => 1 [gemeente] => Alken ) [1] => Array ( [id] => 2 [gemeente] => As ) [2] => Array ( [id] => 3 [gemeente] => Beringen ) [3] => Array ( [id] => 4 [gemeente] => Bilzen ) [4] => Array ( [id] => 5 [gemeente] => Bochelt ) [5] => Array ( [id] => 6 [gemeente] => Borgloon ) [6] => Array ( [id] => 7 [gemeente] => Bree ) [7] => Array ( [id] => 8 [gemeente] => Diepenbeek ) [8] => Array ( [id] => 9 [gemeente] => Dilsen-Stokkem ) [9] => Array ( [id] => 10 [gemeente] => Genk )

Ik zou het liever 2D zien...

Acties:
  • 0 Henk 'm!

Verwijderd

Ja, je maakt er zelf een array van arrays van 8)7 8)7

Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

Dat komt omdat je het volgende doet :

PHP:
1
2
3
<?php
$result[] = $res;
?>


Hier staat:

Voeg $res toe aan array $result, en aangezien $res al een array is stopt hij dus een array in de $result array.

Met bijvoorbeeld foreach kun je over deze array heel loop-en om data er gemakkelijk uit te halen.

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Hint: probeer niet opnieuw het wiel uit te vinden. Daar ga je uiteindelijk tegenaan lopen.

Concreet: gebruik een bestaande database abstractie laag. AdoDB, Zend_DB of andere bekende producten zijn prima in staat om te doen wat jij wil. Het is zonde van je tijd om het zelf nog te gaan ontwikkelen :)

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
De mysql_fetch-functies returnen 1 record uit de gegeven resultset, en verplaatsen de interne pointer dan naar voren, zodat bij een volgende call het volgende record gegeven worden, tot het einde van de resultset is bereik, en false returned wordt.

Voer 1x je query uit. Onthoudt de returnvalue in een variabele, en laat de fetch-functies over die variabele loopen.
Bijvoorbeeld
PHP:
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
class Database {
    public $resultsets = array();
    
    public static function query($query){
        self::connect();
        if(@!$resultset = mysql_query($query)){
            self::error("Couldn't execute the query");
        }
        
        $index = sizeof($this->resultsets);
        $this->resultsets[$index] = $resultset;
        return $index;
    }
    
    public static function fetchAssoc($index){
        $resultset = $this->resultsets[$index];
        
        $rows = array();
        while($row = mysql_fetch_assoc($resultset)) {
            $rows[] = $row;
        }
        print_r($rows);
        return $rows;
    }
}


@mithras
Het zelf maken van dergelijke dingen is juist het leukste van dit vak. Beetje copy&pasten is niet spannend B)

[ Voor 6% gewijzigd door frickY op 11-06-2009 14:36 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
mithras schreef op donderdag 11 juni 2009 @ 14:34:
Hint: probeer niet opnieuw het wiel uit te vinden. Daar ga je uiteindelijk tegenaan lopen.

Concreet: gebruik een bestaande database abstractie laag. AdoDB, Zend_DB of andere bekende producten zijn prima in staat om te doen wat jij wil. Het is zonde van je tijd om het zelf nog te gaan ontwikkelen :)
Hier sta ik gedeeltelijk achter kan ik je zeggen, alleen als jij optimale controle over je applicatie wilt hebben en je moet dus de output dusdanig zo hebben dat je het simpel kunt exporteren is het zelf maken misschien net iets makkelijker dan wat reeds in een framework is gebakken.

Het hangt van persoon tot persoon af natuurlijk :)

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
frickY schreef op donderdag 11 juni 2009 @ 14:35:
@mithras
Het zelf maken van dergelijke dingen is juist het leukste van dit vak. Beetje copy&pasten is niet spannend B)
En dat is nu precies wat een php programmeur altijd denkt ;) Sinds kort ben ik af van het DIY bij programmeren: wanneer je eenmaal ervaren genoeg bent kan je sneller resultaat bereiken door gebruik te maken van standaard componenten.
Uiteraard moet er wel eerst expertise zijn, anders werkt het natuurlijk niet

Hoewel je een extra dependency hebt (en daardoor ook bugs kan introduceren) zorgt een goede keuze van een framework er ook voor dat je daarmee een hoop mogelijk fout-bevatende code voorkomt. Jij alleen (of jouw bedrijf) kan minder goed bug hunten dan de 1000'en van een community :)
Manueltje22 schreef op donderdag 11 juni 2009 @ 14:35:
[...]

Hier sta ik gedeeltelijk achter kan ik je zeggen, alleen als jij optimale controle over je applicatie wilt hebben en je moet dus de output dusdanig zo hebben dat je het simpel kunt exporteren is het zelf maken misschien net iets makkelijker dan wat reeds in een framework is gebakken.

Het hangt van persoon tot persoon af natuurlijk :)
Tja, hoe obscuur wil je het hebben? Beide componenten (maar vast ook andere DBAL) kunnen in zoveel formaten de data uitspuwen dat ik er genoeg aan heb. Je zal natuurlijk altijd wel wat aan data verwerking moeten doen, of je nu zelf iets schrijft of een bestaande oplossing pakt ;)

Maar om toch nog een beetje on topic te blijven voor de TS: je wil associatief een array maken. Dat betekent dat je je eigen keys van de array wil bepalen, in de vorm van een bepaalde string. Wat je nu doet op regel #13 is een nieuw item naar je array pushen zonder een key te geven. Hij genereert automatisch een index als key en daarmee ben je het associatieve gedeelte kwijt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoe kan ik die key erdan instoppen? Is er een functie om die key te vinden van een record? Kan het niet meteen vinden op php.net

Mijn excuses, ik zocht het tever... key()

[EDIT2]
Toch doet hij het nog steeds niet...

PHP:
1
2
3
4
5
6
7
8
9
public static function fetchAssoc($query){
        $query = self::query($query);
        $result = array();
        while($res = mysql_fetch_assoc($query)){
            $result[key($res)] = $res;
        }
        print_r($result);       
        return $result; 
    }

Array ( [id] => Array ( [id] => 44 [gemeente] => Zutendaal ) )
(Krijg ook maar alleen laatste record)

[ Voor 68% gewijzigd door Verwijderd op 11-06-2009 15:32 ]


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 18:59
Wat mithras waarschijnlijk bedoeld is iets als $result[ $res['id'] ] = $res, wat dan "gebeurd" is dat je met $result[44] het record krijgt met id 44.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Probeer eens stap voor stap te begrijpen wat elke regel en elk commando in je code nu daadwerkelijk doet. Probeer te begrijpen waarom je het resultaat krijgt dat je krijgt. Probeer daarnaast voor jezelf ook eens duidelijk te krijgen wat voor resultaat je nu daadwerkelijk terug zou willen krijgen uit de functie. Met een beetje doelloos rondslingeren van wat statements waarvan je eigenlijk niet weet wat ze nu eindelijk doen zul je niet ver komen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Probleem is dat die naam 'id' of 'gemeente' of dergelijke altijd anders is als je verschillende query's hebt... Hoe los je dat dan op...

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 11 juni 2009 @ 15:43:
Probleem is dat die naam 'id' of 'gemeente' of dergelijke altijd anders is als je verschillende query's hebt... Hoe los je dat dan op...
Je wilt dus dat hij van een willekeurige query bepaalt wat de key zou moeten zijn?

Nou, een oplossing is om de key-column standaard ID te noemen.
In geval van gemeente als key-column rename je die in je query naar id (SELECT gemeente AS id)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar als je nu SELECT * hebt...

Acties:
  • 0 Henk 'm!

Verwijderd

... maak je er SELECT *, gemeente AS id van.

Je databaseclass kan toch niet weten welke column hij als key in de result array moet nemen bij een willekeurige query?
Wat Janoz ook zegt: Bedenk eerst wat je precies wilt, voordat je code gaat kloppen....
Pagina: 1