Bekijk Volledige Versie : [PHP] newbie:result in een array stoppen
Frank Mutsaers
10/06/05, 15:15
Hallo NG,
Het is mij niet helmaal duidelijk wat een $result van myqsl_query is.
Wat ik wil is de $result als een array benaderen.
$result = mysql_query("SELECT * FROM example");
Wat ik wel overal kan vinden is om dit te dumpen:
while($row = mysql_fetch_array( $result )) {
echo $row['naam']." en ".$row['leeftijd']."<br>";
}
tot zover snap ik het.
Maar ik heb een andere array met bijvoorbeeld een paar namen. Nu wil uit de
$result de gegevens van die namen.
het lijkt me niet handig om steeds de hele $result door te moeten lopen om
elke naam te vinden.
Zoiets als dit (ik weet niet of het werkt)
$namen = array("jan", "klaas", "betsie");
foreach($namen as $deze){
while($row = mysql_fetch_array( $result )) {
if($row['name'] == $deze){
echo $row['naam']." en ".$row['leeftijd']."<br>";
}
}
}
Is er geen speciale functie waarmee ik de $row kan krijgen met de
betreffende naam?
$namen = array("jan", "klaas", "betsie");
foreach($namen as $deze){
$row = speciale_functie($result, $deze);
echo $row['naam']." en ".$row['leeftijd']."<br>";
}
Of is de aanpak met de while-loop gewoon de manier. Ik heb het gevoel dat
zo'n while-loop traag is. In dit voorbeeld gaat het om 3 namen, maar waar
ik het voor ga gebruiken zullen dat er veel meer worden (20-100).
Alvast bedankt voor jullie opmerkingen.
Groet,
Frank
Daniel Tryba
10/06/05, 15:25
Frank Mutsaers <frankmuts@zonnet.invalid> wrote:
> $result = mysql_query("SELECT * FROM example");
[knip]
> Is er geen speciale functie waarmee ik de $row kan krijgen met de
> betreffende naam?
>
> $namen = array("jan", "klaas", "betsie");
> foreach($namen as $deze){
> $row = speciale_functie($result, $deze);
> echo $row['naam']." en ".$row['leeftijd']."<br>";
> }
>
> Of is de aanpak met de while-loop gewoon de manier. Ik heb het gevoel dat
> zo'n while-loop traag is. In dit voorbeeld gaat het om 3 namen, maar waar
> ik het voor ga gebruiken zullen dat er veel meer worden (20-100).
Daar voor is het het handigst om een zinnige SQL query om te stellen:
select naam,leeftijd from example where naam='jan' or naam='klaas'
Dan krijg je alleen de rijen waarin je geinteresseerd bent.
John Bokma
10/06/05, 16:15
Frank Mutsaers wrote:
> Of is de aanpak met de while-loop gewoon de manier. Ik heb het gevoel
> dat zo'n while-loop traag is. In dit voorbeeld gaat het om 3 namen,
> maar waar ik het voor ga gebruiken zullen dat er veel meer worden
> (20-100).
Dat is een database probleem, uiteraard maak je je select zo dat alleen de
gewenste resultaten terugkomen. En dus zal de foreach normaal geen extra
werk moeten verrichten.
Voor je verder gaat raad ik je aan om je eerst te verdiepen in MySQL en
database beheer i.h.a. Ik zie te vaak dat mensen in PHP (of andere taal)
massa's werk verrichten die gewoon in een database gedaan kan (en moet)
worden.
De leertijd die je er nu in steekt verdien je vanzelf terug.
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Frank Mutsaers
10/06/05, 23:55
Daniel Tryba wrote:
> Frank Mutsaers <frankmuts@zonnet.invalid> wrote:
>> $result = mysql_query("SELECT * FROM example");
> [knip]
>> Is er geen speciale functie waarmee ik de $row kan krijgen met de
>> betreffende naam?
>>
>> $namen = array("jan", "klaas", "betsie");
>> foreach($namen as $deze){
>> $row = speciale_functie($result, $deze);
>> echo $row['naam']." en ".$row['leeftijd']."<br>";
>> }
>>
>> Of is de aanpak met de while-loop gewoon de manier. Ik heb het gevoel dat
>> zo'n while-loop traag is. In dit voorbeeld gaat het om 3 namen, maar waar
>> ik het voor ga gebruiken zullen dat er veel meer worden (20-100).
>
> Daar voor is het het handigst om een zinnige SQL query om te stellen:
> select naam,leeftijd from example where naam='jan' or naam='klaas'
>
> Dan krijg je alleen de rijen waarin je geinteresseerd bent.
Je hebt gelijk dat ik de query kan aanpassen en zo een $result krijg waar
alleen de gewenste personen inzitten.
Maar ik wil daarna een willekeurige rij te voorschijn krijgen.
Uit de twee reacties begrijp ik ook dat ik mijn vraag niet goed heb
geformuleerd.
Ik probeer het opnieuw.
Als je een query doet krijg je een $result terug.
$result = mysql_query("SELECT * FROM example");
Nu zit in de $result de hele database, toch?
Wat ik nu wil is uit deze $result een specifieke row krijgen.
Nu dacht ik dat het handig zou zijn om een keer een query te doen op de
database en dan met de $result verder te werken.
Stel ik heb een database met 400 adressen, en ik heb een wilkeurige groep
van 20 mensen nodig, en meteen daarna een andere groep van 10 mensen.
Wat ik dus kan doen is 30 keer een query uitvoeren, maar is dat geen zonde
van de processortijd? Ik hoopte dat ik op de een of andere manier het
volgende kon:
$result = mysql_query("SELECT * FROM example");
$gewensterij = haaltevoorschijn($result, 'ID', 4);
echo $gewensterij['naam']. "is ".$gewensterij['leeftijd']." jaren oud.";
Nogmaals, misschien wil ik iets helemaal onnodigs, maar het leek mij sneller
te gaan als ik de gegevens uit $result haal dan dat ik 30 queries doe.
Of kun je $result niet op die manier benaderen? Eigenlijk is dit mijn vraag,
hoe moet je tegen zo'n $result aankijken, is het een array of iets anders.
Of moet ik gewoon 30 keer een query uitvoeren en me geen zorgen maken over
wat sneller is.
groet,
frank
Daniel Tryba
11/06/05, 01:55
Frank Mutsaers <frankmuts@zonnet.invalid> wrote:
> Nu dacht ik dat het handig zou zijn om een keer een query te doen op de
> database en dan met de $result verder te werken.
> Stel ik heb een database met 400 adressen, en ik heb een wilkeurige groep
> van 20 mensen nodig, en meteen daarna een andere groep van 10 mensen.
>
> Wat ik dus kan doen is 30 keer een query uitvoeren,
30? Het zijn er IMHO maar 2.
> $result = mysql_query("SELECT * FROM example");
> $gewensterij = haaltevoorschijn($result, 'ID', 4);
> echo $gewensterij['naam']. "is ".$gewensterij['leeftijd']." jaren oud.";
>
> Nogmaals, misschien wil ik iets helemaal onnodigs, maar het leek mij sneller
> te gaan als ik de gegevens uit $result haal dan dat ik 30 queries doe.
> Of kun je $result niet op die manier benaderen? Eigenlijk is dit mijn vraag,
> hoe moet je tegen zo'n $result aankijken, is het een array of iets anders.
Iets anders: een resource.
Wat jij wil kan op zich wel, maar met een beetje pech moet je dus 1 keer
alle resultaten doorlopen.
-array met 20 gezochte namen
-doe de query (select * from example order by random())
-vraag een row op
-controleer of de naam in het gezochte array zit
-ja: sla gegevens op in gewenst array
-nee: sla gegevens op in random array
-herhaal totdat gewenste array en random array gevult zijn
Geheugen gebruik is hierbij minimaal (zeker als je
mysql_unbuffered_query gebruikt). Zo'n functie moet je zelf schrijven,
maar gelukkig is dat triviaal :)
Maar voor wat je hierboven beschrijft kan je IMHO beter gewoon 2 queries
doen, 1 voor de 20 specifieke namen en 1 voor 10 random namen die niet
voldoen aan de 20 specifieke. Voordelen:
-een database kan sneller zoeken naar de naam (vooral als er een index
op staat)
-het bespaard een hele berg data die moet worden uitgewisseld.
Frank Mutsaers
11/06/05, 13:55
Daniel Tryba wrote:
> Frank Mutsaers <frankmuts@zonnet.invalid> wrote:
>> Nu dacht ik dat het handig zou zijn om een keer een query te doen op de
>> database en dan met de $result verder te werken.
>> Stel ik heb een database met 400 adressen, en ik heb een wilkeurige groep
>> van 20 mensen nodig, en meteen daarna een andere groep van 10 mensen.
>>
>> Wat ik dus kan doen is 30 keer een query uitvoeren,
>
> 30? Het zijn er IMHO maar 2.
Idd kun je het als 2 queries doen, maar omdat uiteindelijk 30 personen wil
hebben zou ik ook voor elke persoon een query kunnen uitvoeren.
<snip>
> Iets anders: een resource.
>
> Wat jij wil kan op zich wel, maar met een beetje pech moet je dus 1 keer
> alle resultaten doorlopen.
> -array met 20 gezochte namen
> -doe de query (select * from example order by random())
> -vraag een row op
> -controleer of de naam in het gezochte array zit
> -ja: sla gegevens op in gewenst array
> -nee: sla gegevens op in random array
> -herhaal totdat gewenste array en random array gevult zijn
hier was ik dus bang voor, dit wil ik idd niet gaan doen.
> Geheugen gebruik is hierbij minimaal (zeker als je
> mysql_unbuffered_query gebruikt). Zo'n functie moet je zelf schrijven,
> maar gelukkig is dat triviaal :)
>
> Maar voor wat je hierboven beschrijft kan je IMHO beter gewoon 2 queries
> doen, 1 voor de 20 specifieke namen en 1 voor 10 random namen die niet
> voldoen aan de 20 specifieke. Voordelen:
> -een database kan sneller zoeken naar de naam (vooral als er een index
> op staat)
> -het bespaard een hele berg data die moet worden uitgewisseld.
Het wordt langzaam allemaal duidleijk bij me :)
Vervolg vraag, ben niet zo goed met die sql-query.
Hoe kan ik dan het eenvoudigste de query maken voor die 20 personen.
Ik heb een lijst met 20 ID's. moet ik dan iets maken als:
$lijst = array(2,5,12,14,15,16....)
$result = mysql_query("SELECT * FROM example WHERE ID=".$lijst[0]." OR
ID=".lijst[1]...);
Dank alsvast voor je opmerkingen.
groet
frank