Rekenfunctie werkt alleen in 1 kolom

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een tabel waarin verschillende gegevens worden weergegeven vanuit een database. Een van die gegevens is de prijs van een product. Alleen heeft deze nog een administratieve kost en een multiplier, voordat de totaalprijs kan worden weergegeven. Daarna is het de bedoeling dat deze prijs wordt afgerond per 5 euro en altijd omhoog. Dus een uitkomst van 231,23 bijvoorbeeld, moet worden afgerond naar 235 enzovoorts.

Nou heb ik daar een mooie functie voor gemaakt en die via de 'while' in de code toegevoegd, alleen werkt deze echter alleen voor de eerste kolom en niet voor de vier andere. Hier eerst mijn code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HTML;
while ($row = mysql_fetch_assoc($result)){
    $row['prijs1'] = round ((($row['prijs1']+5) *1.85),0);
    $base_m=5;
    $row['prijs11'] = $base_m*(ceil(($row['prijs1'])/$base_m));
    echo <<<HTML
<tr>

    <td align="center" width="25%"><img src={$row['thumb_formaat']}><br>
    {$row['formaat']}<br>  {$row['eindformaat']}<br />  {$row['prijs11']}<br></td>
    <td align="left" width="0%"></td>
HTML;

    $row = mysql_fetch_assoc($result);
    if (!$row){
      echo "<td>&nbsp;</td><td>&nbsp;</td>";
    } else {
    echo <<<HTML

    <td align="center" width="25%"><img src={$row['thumb_formaat']}><br>
    {$row['formaat']}<br>  {$row['eindformaat']}<br />  {$row['prijs11']}<br></td>
    <td align="left" width="0%"></td>


Na de tweede HTML; wordt dat gedeelte nog twee keer weergegeven om de overige twee kolommen te maken. Dit heb ik hier even weggelaten.

Voor zover ik kon ontdekken krijg ik alleen een foutmelding dat prijs11 voor de kolommen 2, 3 en 4 niet bekend is en daarom niet wordt weergegeven. Ik krijg die alleen niet bekend... Ik heb geprobeerd de wile rows nogmaals in te voegen in de overige kolommen, echter dan krijg ik niet meer 4 kolommen, maar alle cellen uit de database achter elkaar. Op een andere manier dat code gedeelte (uit de while van het begin van de code) toe te voegen lukt niet want dan krijg ik de melding 'unexpected }' (of een van de andere die ik dan gebruik).

Ik hoop dat iemand mij in de juiste richting kan duwen, want ik kom er totaal niet meer uit. Alvast bedankt!

(Ik hoop dat dit voldoende uitleg was, ik heb het antwoord ook nergens op het web kunnen vinden, vandaar dat ik als laatste toevlucht jullie hulp inschakel. Sorry anders alvast)

Groetjes,
Yunie

Acties:
  • 0 Henk 'm!

  • DanielG
  • Registratie: Oktober 2005
  • Laatst online: 08-09 15:36

DanielG

i = 0x5f3759df - (i>>1); ☠₧ℳ🀪❣

-edit blijkbaar niet-

[ Voor 91% gewijzigd door DanielG op 09-05-2010 00:48 ]

http://xyproblem.info/


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Dat prijs11 niet bekend is klopt. Op regel 14 overschrijf je de oude row en haal je een nieuwe op.

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!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Ik ben totaal niet gehinderd door enige kennis van php, maar de eerste { heeft volgens mij geen overeenkomende }

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:16

Creepy

Tactical Espionage Splatterer

De code die je nu hebt staan sluit echt niet goed af. Je mist de afsluitende HTML; en de afsluitende } voor zowel je laatste if als je while. Plus wat Janoz zegt. Had je dat met wat gedebug echt niet zelf al gezien? Had je m'n post gelezen uit je vorige topic? Als je de boel fatsoenlijk laat inspringen is het een stuk makkelijker te zien of je ergens een { of } mist.

[ Voor 35% gewijzigd door Creepy op 09-05-2010 17:24 ]

"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
Bedankt voor de reacties. Dat ik op regel 14 de code overschrijf was ik al achter, maar ik krijg de code daar niet toegevoegd via de while, anders wordt dezelfde cel weer herhaald....

Overigens weet ik ook dat er in dit gedeelte geen afsluitende } staat en geen afsluitende HTML;, maar dit is niet de gehele code en daar staan deze wel. Ik krijg immers op het script op deze manier geen error. Alleen werkt de code voor het rekenen niet. Wat ik ook wel weet, omdat dit overscreven wordt wat Janoz ook al zei, alleen weet ik dus niet hoe ik die wel toegevoegd krijg...

Ik heb wat gedebugged, maar dit gedeelte staat daar niet in weergegeven (behalve dat de prijs11 niet bekend is,maar ook dat wist ik al). De rest heb ik wel volledig afgesloten, alleen even niet weergegeven in de code hierboven. Daarom zie ik ook geen error....

Kan iemand mij alsjeblieft zeggen hoe ik dat reken gedeelte kan toepassen op de andere kolommen?

Acties:
  • 0 Henk 'm!

Verwijderd

Wat krijg je voor uitvoer als je regel 14 weglaat? Hoe ziet de rest van je code eruit? Vragen waarom een while loop het niet goed doet, en dan maar de halve while loop laten zien schiet niet echt op natuurlijk..

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Probeer eerst voor je zelf uberhaupt eens te begrijpen wat er hier gebeurt. Je zegt wel dat je een while lus gebruikt, maar vervolgens ga je binnen je while lus weer allemaal repeterende taken doen. Ik weet niet precies hoe je je resultaten uit de query krijgt, maar ik vermoed dat je compleet verkeerd bezig bent door voor elke kolom (dus niet rij) in je gegenereerde html tabel een nieuw record op te halen.

Probeer eerst in je hoofd eens een stappenplan te maken met wat je nu eigenlijk wilt doen (dus echt stapje voor stapje). Schrijf dit eventueel op en probeer daarna daar passende code bij te maken. Maar een beetje heen en weer knippen en plakken van code die je niet helemaal begrijpt gaat je probleem niet oplossen.

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!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
We hebben het liefst dat je je code in code=taal tags zet. Dus in jouw geval code=php. Dan krijg je namelijk iets wat veel leesbaarder is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HTML;
while ($row = mysql_fetch_assoc($result)){
    $row['prijs1'] = round ((($row['prijs1']+5) *1.85),0);
    $base_m=5;
    $row['prijs11'] = $base_m*(ceil(($row['prijs1'])/$base_m));
    echo <<<HTML
<tr>

    <td align="center" width="25%"><img src={$row['thumb_formaat']}><br>
    {$row['formaat']}<br>  {$row['eindformaat']}<br />  {$row['prijs11']}<br></td>
    <td align="left" width="0%"></td>
HTML;

    $row = mysql_fetch_assoc($result);
    if (!$row){
      echo "<td>&nbsp;</td><td>&nbsp;</td>";
    } else {
    echo <<<HTML

    <td align="center" width="25%"><img src={$row['thumb_formaat']}><br>
    {$row['formaat']}<br>  {$row['eindformaat']}<br />  {$row['prijs11']}<br></td>
    <td align="left" width="0%"></td>


Een paar opmerkingen over de code:

- Waar is de afsluitende </tr> tag?
- Waar is het einde van de while-loop?
- De HTML; en echo <<<HTML; achtige toestanden maken het IMO niet overzichtelijker, door dat soort dingen kan je gauw in de war raken met haakjes etc.
- Ga de volgende keer eens heerlijk debuggen, kijk wat er in je array zit met print_r() bijvoorbeeld, dit soort dingen kunnen meestal met simpele debugs opgelost worden ;)
- Het is meestal niet zo tactisch om <br>-tags in tabelcellen te stoppen. Gebruik voor nieuwe regels in een tabel een nieuwe rij met <tr>. Een standaard opbouw van een tabel is als volgt:

HTML:
1
2
3
4
5
6
7
8
9
10
11
<table>
   <tr>
      <td>Rij 1, Cel 1</td><td>Rij 1, Cel 2</td><td>Rij 1, Cel 3</td>
   </tr>
   <tr>
      <td>Rij 2, Cel 1</td><td>Rij 2, Cel 2</td><td>Rij 2, Cel 3</td>
   </tr>
   <tr>
      <td>Rij 3, Cel 1</td><td>Rij 3, Cel 2</td><td>Rij 3, Cel 3</td>
   </tr>
</table>


Wat het volgende tabelletje oplevert:

Rij 1, Cel 1Rij 1, Cel 2Rij 1, Cel 3
Rij 2, Cel 1Rij 2, Cel 2Rij 2, Cel 3
Rij 3, Cel 1Rij 3, Cel 2Rij 3, Cel 3


Volgens mij heb je niet helemaal door hoe het werkt om met een mysql resultaat te werken, mysql_fetch_assoc levert, zoals de naam al zegt, een associatieve array op. Stop je iets als $row = mysql_fetch_assoc($result) dus in een while-loop dan betekent dat in nederlands:

"Haal een rij op uit de resultaten van de query, sla die rij op in een associatieve array en doe dit totdat het einde van de resultset is bereikt"

Wil je vervolgens iets met elke waarde uit de array doen, dan ligt het voor de hand om een foreach loop er bij te pakken waarmee je de array langsgaat, bijvoorbeeld zo:

PHP:
1
2
3
4
5
6
7
8
while ($result = mysql_fetch_assoc($result)) {
   foreach($row as $key => $value) {
      //Doe je ding hier, bijvoorbeeld afronden van getallen
      //$key = naam van de key van de array
      //$value = waarde van die key in de array
   }
   //HTML output hier
}


Volgens mij kun je nou wel weer even verder ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb hier even de volledige code neergezet (zodat ik deze niet compleet hier hoef te plaatsen:
Volledige Code

Als ik de "$row = mysql_fetch_assoc($result);" weghaal bij de andere kolommen dan werkt het script prima, maar dan worden de gegevens uit de eerste kolom herhaalt in de tweede kolom. Daarmee heb ik dus dubbele gegevens.

Dit totaal is dus de reden waarom ik die kolommen 4 keer heb laten herhalen; ik kreeg steeds dubbele gegevens. De foreach loop ken ik nog niet, ik zal eens gaan googelen om te kijken of ik die kan gebruiken.

Sorry dat ik de code niet in php tags heb gezet. Misschien dat jullie de code via die link ook wel helemaal niet kunnen lezen, maar ik wilde niet mijn volledige code hier plaatsen, omdat deze zo lang is.... Vandaar dat ik eerst een stukje heb geplaatst, al wetende dat er dus dingen zouden missen.

Acties:
  • 0 Henk 'm!

Verwijderd

Aan het begin van je while loop bereken je de waarde van prijs1 en prijs11. Daarna (als je 'mysql_fetch_assoc' weglaat bij de andere kolommen) druk je de waarde van prijs11 vier keer af. Niet helemaal verrassend dat je dan vier keer dezelfde waarde krijgt, toch?

Wat verwacht je als uitvoer? Hoe zou je, met pen en papier, dat resultaat verkrijgen uitgaande van je invoer (de gegevens in de database)?

Acties:
  • 0 Henk 'm!

  • Serenity
  • Registratie: Oktober 2005
  • Laatst online: 14-01-2023
Denk dat het handiger is dat je de voorbeelden uit de handleiding eerst eens bekijkt en toepast:

http://php.net/manual/en/function.mysql-fetch-assoc.php

Neem die voorbeelden even over in een simple scriptje en gebruik je eigen query. Ga na welke informatie je precies ophaalt en wat deze functie doet. Hier heb je uiteindelijk veel meer aan dan op trial and error-basis links en rechts wat weg te halen of toe te voegen en te hopen dat het dan wel werkt.
Pagina: 1