[PHP/MySQL] Query results in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo ik zit met het volgende vraagstuk:

Ik wil een kolom van de resultaten van een query in een session array plaatsen en dan wel een aantal specifieke rijen, bijv rij 1 t/m 3.

Ik heb bijvoorbeeld de volgende query:

PHP:
1
2
3
4
5
mysql_select_db($database_db, $db);
$query_leden = "SELECT id, naam FROM leden ORDER BY id ASC";
$leden = mysql_query($query_leden, $db) or die(mysql_error());
$row_leden = mysql_fetch_assoc($leden);
$totalRows_leden = mysql_num_rows($leden);


En ik wil bijvoorbeeld de kolom naam van de eerste 3 rijen in $_Session[] of een andere array zetten.

Ik zat zelf te denken aan een for loop:

PHP:
1
2
3
for ($i=0; $i<3; $i++)  {
$_Session[$i] = $row_leden['naam'];
}

Alleen dan plaatst tie wel iedere keer de 1e rij in de array.

Dus mijn vraag:
Hoe doe ik dit makkelijk of ben ik nu helemaal verkeerd aan het denken?

Alvast bedankt!

[ Voor 16% gewijzigd door Verwijderd op 07-03-2007 16:37 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$row_leden = array();  //even alleen als voorbeeld
$i = 0;
$max_row = 3;
if(count($row_leden)<=$max_row){
   while($i<$max_row){
      $_SESSION["bla"][] = current($row_leden["naam");
      next($row_leden);
      $i++;
   }
}else{
   echo "Lengte van array te kort!";
}
Ik zou dus een schaduwvariabele mee laten lopen met je loopje, en daarin elke keer de volgende entry in je array te pakken.

[ Voor 212% gewijzigd door mithras op 07-03-2007 17:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, iig bedankt voor je bijdrage.

Ik probeer even in mijn eigen woorden uit te leggen wat je code doet zodat ik het zelf ook helemaal snap. verbeter me waar nodig.

Je declareert $row_leden als array
Daarna ga je met een while loop $_SESSION["bla"][] vullen met de huidige waarde van $row_leden
en daarna ga je naar de volgende current?

Vraagjes:
Moet $row_leden niet $row_leden['naam'] zijn?
Moet je voor next($current) niet next($row_gebruiken)?
En wat bedoel je met de 2e set [] bij $_SESSION["bla"][]?

[ Voor 6% gewijzigd door Verwijderd op 07-03-2007 16:51 ]


Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Ik zou het op deze manier proberen, omdat je namelijk met mysql_fetch_assoc maar één row uit de database haalt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql_select_db($database_db, $db);
$query_leden = "SELECT id, naam FROM leden ORDER BY id ASC";
$leden = mysql_query($query_leden, $db) or die(mysql_error());
$totalRows_leden = mysql_num_rows($leden);

$i = 1;
while ($row = mysql_fetch_assoc($leden)) {
    
    if ($i <=3)
    {
        $_Session[$i] = $row['naam'];
        $i++;
    }
    else break;
}

[ Voor 15% gewijzigd door RAJH op 07-03-2007 16:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je reactie.

Ik heb deze 2 mogelijkheden doorgenomen en ben met het volgende gekomen:

PHP:
1
2
3
4
5
6
7
8
9
10
$i = 0;
while ($row_leden = mysql_fetch_assoc($leden)) {
    
    if ($i <3)
    {
        $_SESSION["leden"][] = $row_leden['naam'];
        $i++;
    }
    else break;
}


Het gekke hieraan is alleen dat tie wel mooi een array van grootte 3 in $_SESSION zet, maar begint bij de 2e rij van $leden. Hij pakt dus rij 2,3,4 en zet die in de array.

Kan iemand dit verklaren?

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Staat er nergens een mysql_fetch_assoc($leden) vóór dit stukje code?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Och ja natuurlijk, je hebt gelijk. Opgelost!

Een vraagje van mijn kant af nog, Hoe zet je em weer op de eerste rij? met current($row_leden) wijs je de huidige rij aan, next($row_leden) de volgende rij.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 07 maart 2007 @ 17:54:
Och ja natuurlijk, je hebt gelijk. Opgelost!

Een vraagje van mijn kant af nog, Hoe zet je em weer op de eerste rij? met current($row_leden) wijs je de huidige rij aan, next($row_leden) de volgende rij.
Kijk in de manual bij 1 van die functies, en zoek naar "See also". Zo lastig is dat niet te vinden.

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

PHP:
1
reset($row_leden);

Gokje :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja je hebt gelijk reset.php

Acties:
  • 0 Henk 'm!

Verwijderd

Lees anders ff de functies van MySql door. Daarin staat een fuinctie om je resultset te resetten.....

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Als we dan toch tips geven / aan het zeuren zijn over code: :+
RAJH schreef op woensdag 07 maart 2007 @ 16:52:
PHP:
1
2
3
4
5
6
7
8
9
10
$i = 1;
while ($row = mysql_fetch_assoc($leden)) {
    
    if ($i <=3)
    {
        $_Session[$i] = $row['naam'];
        $i++;
    }
    else break;
}
Zou je nog een stuk kunnen versimpelen naar:
PHP:
1
2
while(++$i <= 3 && $row = mysql_fetch_assoc($leden))
  $_Session[$i] = $row['naam'];

Maar thats just my 0.02 cents ;)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

[offtopic]

[ Voor 98% gewijzigd door Verwijderd op 08-03-2007 16:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar moet je daarvoor niet eerst de grootte van de array Session bepaald hebben?

Edit:

Jij doet het door de query te limiteren, een andere oplossing voor hetzelfde probleem

[ Voor 39% gewijzigd door Verwijderd op 08-03-2007 13:00 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Verwijderd schreef op donderdag 08 maart 2007 @ 10:50:
Wat weer verkort kan worden naar:
[code]
:+
En dat kan je weer verkorten naar
PHP:
1
2
3
4
5
mysql_select_db($database_db, $db); 
$leden = mysql_query("SELECT id, naam FROM leden ORDER BY id ASC LIMIT 3", $db) or die(mysql_error()); 

while ($row = mysql_fetch_assoc($leden))
        $_Session[sizeof($_Session)] = $row['naam'];

>:)

Overigens beperk je nu wel z'n resultset, stel je voor dat'ie later -wel- de overige records nodig heeft.. Zit je maar mooi met je limit! :P

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

FragFrog schreef op donderdag 08 maart 2007 @ 13:02:
Overigens beperk je nu wel z'n resultset, stel je voor dat'ie later -wel- de overige records nodig heeft.. Zit je maar mooi met je limit! :P
Dat leek me ook inderdaad het geval gezien de oorspronkelijke vraag :)

Acties:
  • 0 Henk 'm!

Verwijderd

[offtopic]

[ Voor 98% gewijzigd door Verwijderd op 08-03-2007 16:36 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Verwijderd schreef op donderdag 08 maart 2007 @ 13:28:
Ik bekijk het meer in de trant van: Is het geen verspilling alles op te vragen als je er maar drie gaat gebruiken? Dan kun je beter op een later moment een nieuwe resultset aanvragen, dat kost tegenwoordig allemaal niet meer zoveel CPU en HDD kracht.
Hangt volledig van de situatie af natuurlijk :) Als ik normaal maar een beperkt aantal resultaten nodig heb wat bijna altijd zo is geef ik ook altijd een limiet mee. Aan de andere kant gebruik ik zelf wel altijd m'n eigen databaseclass die ervoor zorgt dat ik simpel de resultaten van een eerdere query kan hergebruiken, en dan is het weer juist verspilling van resources om meerdere keren om dezelfde gegevens te vragen. Stel dat hij 20 resultaten weergeeft op een overzichtspagina en 3 ervan later weer wil weergeven in een header ofzo en ze daarom opslaat in de sessie (is de enige reden die ik me zo kan bedenken) help je'm er niet mee de limiet op 3 te zetten, of zonder iteratiecontrole de hele resultset in de sessie te gooien - klinkt natuurlijk erg gemakkelijk nu, maar had er zelf ook over gedacht een limiet in die query te gooien maar er om deze reden vanaf gezien. Zou niet de eerste keer zijn dat een beginner dankzij goed bedoelt advies zich een stuk verder in de nesten werkt.

Nochtans ben ik het wel met je eens dat het good practice is om aan te wennen altijd een limiet op te geven in je query natuurlijk :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gelukkig heb ik zelf door wat er aan de hand is en wat de code doet en waarom, dus ik kan je alleen maar bedanken voor je bijdrage, want zo zie ik alleen maar meer mogelijkheden die ik later misschien wel weer kan gebruiken.

[ Voor 26% gewijzigd door Verwijderd op 08-03-2007 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

[offtopic]

[ Voor 98% gewijzigd door Verwijderd op 08-03-2007 16:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 08 maart 2007 @ 14:56:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

    $testarray = array();

    $testarray[count($testarray)] = "12";
    $testarray[count($testarray)] = "6";
    $testarray[count($testarray)] = "45";
    $testarray[count($testarray)] = "24";
    
    $som = 0;

    foreach ($testarray as $item){
        $som += $item;      
    }
    
    $totaal = $som / count($testarray);
    
    echo $totaal;
    
?>
Mooi voorbeeldje van een WTF?!
Waarom noem je iets een totaal als het niet een totaal is maar een gemiddelde?
Waarom gebruik je niet $testarray[] = "24";?
Waarom gebruik je niet array_push ( $testarray, "24" );?
Waarom gebruik je niet array_sum ( $testarray );

Kortom, genoeg code waar je niks aan hebt.

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

En het is weer typisch php dat je "12" bij 0 op kunt tellen ;)

Acties:
  • 0 Henk 'm!

Verwijderd

[offtopic]

[ Voor 98% gewijzigd door Verwijderd op 08-03-2007 16:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat een onzin.

De "commands" (laten we het even statements noemen). Zijn uitermate eenvoudig. De functies zijn eveneens eenvoudig, ze zijn er immers voor bedoeld om dit soort omsclachtige code te kunnen vermijden. Wat leer je iemand die je jouw code voorschotelt precies? Veel code schrijven?
Pagina: 1