[PHP] MySQL-resultaat naar een volledige array

Pagina: 1
Acties:
  • 199 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik heb nu dit:
PHP:
1
2
3
4
5
6
7
8
echo("<ul>\n");
$i = 0;
while($rij_aandeel = mysql_fetch_assoc($aandeel)){
    echo("<li>" . $rij_aandeel['dimensie'] . " " . aandeel($rij_aandeel['aandeel']));
    $i ++;
    $i < mysql_num_rows($aandeel) ? print(", </li>") : print("</li>\n");
}
echo("</ul>\n");


Dat werkt wel, maar het ziet er niet uit. De bedoeling is dat ik een lijstje krijg als dit:

aap,
noot,
mies.

Het gaat om die punten en komma's, dus... Ik heb al wat met implode liggen prullen, maar ik kom er niet uit. Hulp? :)

Acties:
  • 0 Henk 'm!

Verwijderd

kun je in php niet splitten op non-literal characters?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

En wat heb je zelf al geprobeerd? Wat lukte daar dan verder niet mee? Zie ook Programming Beleid - De Quickstart. Je geeft nu echt te weinig informatie.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op vrijdag 15 juni 2007 @ 21:44:
En wat heb je zelf al geprobeerd? Wat lukte daar dan verder niet mee? Zie ook Programming Beleid - De Quickstart. Je geeft nu echt te weinig informatie.
Sorry, ik was te vlug.

Wanneer ik de rijen via mysql_fetch_assoc() opvraag, reageert de boel als verwacht. Ik kan dan met die while-lus alle gevonden resultaten doorlopen en bijvoorbeeld in zo'n <ul> outputten. Nu wil ik echter dat achter elk element, met uitzondering van het laatste, een puntkomma komt. Achter het laatste komt een punt.

Ik heb geprobeerd om de teruggekregen array via implode van komma's te voorzien, maar natuurlijk zit er maar 1 rij per keer in die teruggegeven array. Ik vermoed dat ik alle resultaten in een volledige array moet zetten, maar ik ken hier niet zo'n propere methode voor.

Acties:
  • 0 Henk 'm!

Verwijderd

dan begreep ik je in eerste instantie verkeerd, ik dacht dat je die komma's weg wilde hebben bij de output. het kan toch geen kunst zijn om het laatste element in je array een ander leesteken mee te geven?

Acties:
  • 0 Henk 'm!

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 19-09 02:45
Weet je wat je doet?
- Achter elke result zet je een ; ook achter de laatste.
- Dan haal je het laatste teken uit de string weg.
- Dan voeg je aan het einde van de string een punt toe.

Voorbeeld:
PHP:
1
2
3
<?php
$string = substr($string_met_puntkommas, 0, -1);
$string .= '.';


Hierbij is $string dus de lijst met resultaten (met achter elk resultaat een ; ) waarbij het laatste teken (de ; ) wordt weggehaald, en aan het einde van de string een . wordt toegevoegd.

Input: aap;noot;mies;
Output: aap;noot;mies.

Specificaties | AndriesLouw.nl


Acties:
  • 0 Henk 'm!

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

MueR

Admin Tweakers Discord

is niet lief

Verwijderd schreef op vrijdag 15 juni 2007 @ 21:38:
PHP:
1
$i < mysql_num_rows($aandeel) ? print(", </li>") : print("</li>\n");
Met deze regel geef je de oplossing al... Dat het er niet uitziet is een kwestie van styling via CSS.

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


Acties:
  • 0 Henk 'm!

Verwijderd

@andrieslouw
zoals ik de ts begrijp heeft ie sowieso moeite met het opvragen van het laatste element, dus dan snapt hij jouw oplossing ook niet.

Acties:
  • 0 Henk 'm!

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 19-09 02:45
Omdat ik me toch verveelde ;) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$string = '';
while($rij_aandeel = mysql_fetch_assoc($aandeel)){
    $string .= '<li>'.$rij_aandeel['dimensie'].' '.aandeel($rij_aandeel['aandeel']).';</li>';
}

$string = substr($string 0, -6); //Laatste 6 tekens weghalen (;</li>)
$string .= '.</li>'; //En een punt + </li> toevoegen.

echo '<ul>'.PHP_EOL;
echo $string.PHP_EOL;
echo '</ul>'.PHP_EOL;
?>


edit:

En als je echt moeilijk wilt doen, dan kun je het aantal resultaten opvragen met mysql_num_rows(), om vervolgens met een if() in de while() lus te kijken (waarbij je inderdaad de $i++ moet gebruiken) of het inderdaad het laatste element is, zo ja, '.</li>', zo nee ';</li>'.

[ Voor 25% gewijzigd door AndriesLouw op 15-06-2007 22:06 ]

Specificaties | AndriesLouw.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 15 juni 2007 @ 21:59:
@andrieslouw
zoals ik de ts begrijp heeft ie sowieso moeite met het opvragen van het laatste element, dus dan snapt hij jouw oplossing ook niet.
Die oplossing van AndriesLouw snap ik wel, maar hoe zie jij dat oproepen van dat laatste element dan precies?

Voor MueR: ik had het eerder op rommelige code, niet op een rommelige presentatie :)

Acties:
  • 0 Henk 'm!

Verwijderd

je query geeft toch een hoeveelheid resultaten, die in php direct als variabele beschikbaar is? als er 20 resultaten zijn geef je 1-19 een puntkomma en nummer 20 een punt.

@andrieslouw
En als je echt moeilijk wilt doen, dan kun je het aantal resultaten opvragen met mysql_num_rows(), om vervolgens met een if() in de while() lus te kijken (waarbij je inderdaad de $i++ moet gebruiken) of het inderdaad het laatste element is, zo ja, '.</li>', zo nee ';</li>'.

dat heet niet moeilijk maar elegant.

[ Voor 50% gewijzigd door Verwijderd op 15-06-2007 22:08 ]


Acties:
  • 0 Henk 'm!

  • AndriesLouw
  • Registratie: December 2005
  • Laatst online: 19-09 02:45
@.at:
offtopic:
Dat bedoelde ik inderdaad, ikzelf vind het onoverzichtelijk, je moet alle resultaten tellen/ophalen met mysql_num_rows, in de while() lus een increment zetten, vergelijken of het resultaat de laatste is, en dan nog eens een . i.p.v. een ; toevoegen. Iets eraf halen, en iets toevoegen gaat makkelijker ;)

Specificaties | AndriesLouw.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 15 juni 2007 @ 22:07:
dat heet niet moeilijk maar elegant.
Alhoewel jouw manier goed zal werken, zou ik 'm verre van elegant willen noemen.
Je kiepert dan nl. je data access layer (gegevens uit de DB halen), je business logic layer (moet er een ';' of een '.' achter?) en je presentation layer (html tags) in 1 routine, en dat heeft niks met elegant te maken.

Die 3 onderdelen heten niet voor niets 'layer', dat zijn lagen die je zoveel mogelijk gescheiden dient te houden. Voor een klein 1-mans hobby projectje maakt 't niet zoveel uit, maar stel je 's voor dat je het design (presentation layer) uitbesteedt aan een ontwerper. Die ontwerper heeft helemaal niks met je business logic of de achterliggende database te maken, en moet je daar ook niet mee vermoeien.

Acties:
  • 0 Henk 'm!

Verwijderd

andrieslouw schreef:
En als je echt moeilijk wilt doen, dan kun je het aantal resultaten opvragen met mysql_num_rows(), om vervolgens met een if() in de while() lus te kijken (waarbij je inderdaad de $i++ moet gebruiken) of het inderdaad het laatste element is, zo ja, '.</li>', zo nee ';</li>'.
en
Dat bedoelde ik inderdaad, ikzelf vind het onoverzichtelijk, je moet alle resultaten tellen/ophalen met mysql_num_rows, in de while() lus een increment zetten, vergelijken of het resultaat de laatste is, en dan nog eens een . i.p.v. een ; toevoegen. Iets eraf halen, en iets toevoegen gaat makkelijker
je stelt het mi moeilijker voor dan het is:

$laatste = end($dinges);
$laatste[count($dinges)-1]

twee hele simpele manieren om het laatste element uit je array te halen, zonder counters te gebruiken.

afterlife schreef:
Die 3 onderdelen heten niet voor niets 'layer', dat zijn lagen die je zoveel mogelijk gescheiden dient te houden. Voor een klein 1-mans hobby projectje maakt 't niet zoveel uit, maar stel je 's voor dat je het design (presentation layer) uitbesteedt aan een ontwerper. Die ontwerper heeft helemaal niks met je business logic of de achterliggende database te maken, en moet je daar ook niet mee vermoeien.
ik begrijp je kritiek niet helemaal. of beter gezegd: ik snap hem wel, maar dan snap ik niet waarom dat niet zou gelden voor het codevoorbeeld van de ts en/of voor de oplossing van andrieslouw.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Daarvoor geldt het inderdaad ook, maar die pretenderen niet dat hun oplossing elegant is ;).

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

hm. als je hier geen smiley schrijft weet geen hond dat het niet helemaal serieus bedoeld is. ik zal in het vervolg een bordje omhoog houden.
Pagina: 1