SQL script laat steeds 1 record te weinig zien.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Carl Zwanenburg

Carl Zwanenburg

09/04/2013 14:08:57
Quote Anchor link
LS,

middels een paar scriptjes haal ik data op uit een DBase en toon dit op een webpagina. Echter mis ik steeds het laatste record uit de opgevraagde records.
B.V. als ik 10 records in de DBase heb, dan worden er maar 9 getoond. Het blijkt steeds het laatste record te zijn.

Graag hulp waar het fout gaat.

Hieronder de belangrijkste onderdelen uit het script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$result
= mysql_query("SELECT * FROM $tbl_name WHERE Boekjaar = 2012 ORDER BY TransactieID DESC ");
$Record = mysql_fetch_array($result);

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php                
     $i
=0;
     while (($i <= 50) AND ($data = mysql_fetch_assoc($result))):
     {
$i ++;  
     {
echo '
        <tr>
            <th width="164">'
. $data['TransactieDatum'] . '</th>
            .....
            .....
        <th width="164">'
. $data['Wisselkoers'] . '</th>
        </tr>'
;
        }  }
    endwhile;
                
?>


Ik vermoed dat het in de WHILE loop moet zitten, want hij geeft de eerste records weer, totdat hij bij de laatste komt en dan stopt het proces, waarbij de laatste record dus niet getoond wordt.

Graag jullie hulp.
 
PHP hulp

PHP hulp

25/04/2024 00:03:27
 
Koen Hollander

Koen Hollander

09/04/2013 14:10:17
Quote Anchor link
Je schrijf je while verkeerd.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
while ($i <= 50 AND $data = mysql_fetch_assoc($result))
?>


Zal moeten werken
Gewijzigd op 09/04/2013 14:10:47 door Koen Hollander
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 14:21:27
Quote Anchor link
Dag Koen, bedankt voor je reactie.

Ik heb je voorstel aangepast en de extra haakjes weggehaald, maar dat maakt geen verschil. Er worden nog steeds dezelfde records getoond, met uitzondering van de laatste. Ik denk dat op de een of andere manier het laatste record niet in $result wordt opgenomen, of hij wordt wel opgenomen in $data, maar de while loop laat het niet zien. M.a.w. maakt de loop niet volledig af.
 
Jeroen Jansen

Jeroen Jansen

09/04/2013 14:26:53
Quote Anchor link
Carl,

je hoogt de teller i direct in het begin op. Je zult waarschijnlijk ook het eerste record missen. Plaats de i++ eens tussen de accolades op regel 12.
 
Erwin H

Erwin H

09/04/2013 14:27:31
Quote Anchor link
@Koen, als je niet begrijpt waar je het over hebt, zeg dan niets...

@Carl, het probleem zit hem in je eerste fetch. Het eerste record fetch je direct na het uitvoeren van je query, voor je de while loop ingaat. Het record dat je daar fetcht ben je kwijt en komt niet meer terug. Je mist dus altijd het eerste record (jij denkt dat het het laatste is omdat je omgekeerd sorteert).
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 14:33:48
Quote Anchor link
Dag Erwin,

bedankt, lijkt me zeer logisch wat je zegt. Ik ga het gelijk proberen. Weet nog niet hoe, dus als je een suggestie hebt, houd ik me aanbevolen, maar ga er mee aan de gang.
 
Erwin H

Erwin H

09/04/2013 14:39:03
Quote Anchor link
Die eerste fetch weghalen zou al een hoop helpen. Ik kan alleen niet zien wat er tussen die fetch gebeurt en de while loop, met andere woorden of je de data daar nodig hebt.
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 14:42:31
Quote Anchor link
Dag Jeroen, Ik had jouw voorstel al eerder geprobeerd, maar dat maakt nog niet veel uit omdat ik maar 10 records in de Dbase heb en de eerste 50 laat zien, dus daar komt hij niet aan. Wat wel logisch is, is wat Erwin heeft geschreven, betreffende mijn laatste record, wat eigenlijk het eerste is, omdat ik omgekeerd sorteer. Het lijkt dus de laatste record te zijn.

Ben nu druk aan het zoeken hoe de "fetch" werkt en waar ik de missing record kan vinden.
 
TJVB tvb

TJVB tvb

09/04/2013 14:47:35
Quote Anchor link
Ik heb je code iets aangepast en wat commentaar gegeven
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// beperk het aantal in je query. Dan laad je niet de volledige set in je geheugen maar alleen wat nodig is.
// Ook selecteren we alleen de kolommen die nodig zijn i.p.v. * (alles)

$result = mysql_query ( "SELECT TransactieDatum,Wisselkoers FROM " . $tbl_name . " WHERE Boekjaar = 2012 ORDER BY TransactieID DESC LIMIT 50" );
// hier stond een fetch, dan lees je al het eerste record

// nu lopen we door de while heen

while ( $data = mysql_fetch_assoc ( $result ) ) {
    echo '
        <tr>
            <th width="164">'
. $data ['TransactieDatum'] . '</th>
            .....
            .....
        <th width="164">'
. $data ['Wisselkoers'] . '</th>
        </tr>'
;
}

?>
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 14:48:28
Quote Anchor link
Dag Erwin,

gebruikt de data inderdaad ook nog voor een ander stukje script.

Hieronder het hele script, zoals ik het nu heb. Het is een beetje ingekort en wat zaken als host en logingnaam, etcl weggehaald om het leesbaar te houden.

Ik hoor graag van je.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$host
=
$LoginNaam =
$Password =
$tbl_name = ".......";
    
$con = mysql_connect($host, $LoginNaam, $Password);
if (!$con)
  {

  die(mysql_error("can't connect"));
  }

mysql_select_db($db_name, $con) or die(mysql_error("can't find database"));

$result = mysql_query("SELECT * FROM $tbl_name WHERE Boekjaar = 2012 ORDER BY TransactieID DESC ");
$Record = mysql_fetch_array($result);

$TransactieDatum = $Record['TransactieDatum'];
...
...



mysql_close($con);    

?>

</p>
<table width="2674" height="50" class="hovertable" >
<tr>
<th width="124">TransactieDatum</th>
...
...

</tr>
<tr>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php                
    
     // Hieronder een while loop om de laatste 50 regels uit de volledige Dbase van de tabel te laten zien.
     $i=0;
     while ($i <= 50 AND $data = mysql_fetch_array($result)):
    // while ($data = mysql_fetch_assoc($result)):
     {  
     {
echo '
        <tr>
            <th width="164">'
. $data['TransactieDatum'] . '</th>
           ...
           ...
        </tr>'
;
        }
$i ++;  }
    endwhile;
                
?>
 
Erwin H

Erwin H

09/04/2013 14:57:33
Quote Anchor link
Begin met wat tjvb heeft gepost, daar kan je in principe al je records al mee tonen (en is wat efficienter vanwege de LIMIT in de query).

Enige wat je dan nog moet doen is die regel $TransactieDatum = $Record['TransactieDatum']; vervangen. Daarvoor heb je blijkbaar alleen het eerste record nodig. Vraag blijft alleen, waar gebruik je dit verder? Echo je dit? Gebruik je het voor een berekening? Als je het namelijk echt voor de while loop nodig hebt dan heb je nog wat meer aanpassingen nodig. Zoniet, dan kan je het vervangen met bijvoorbeeld dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$TransactieDatum
= ($TransactieDatum == null)? $Record['TransactieDatum']: $TransactieDatum;
?>

zet dit binnen je while loop. Bij het uitlezen van het eerste record zal $TransactieDatum de waarde krijgen van de transactiedatum van dat eerste record. Daarna zal het niet meer worden aangepast. Na je while loop kan je dit dan verder gebruiken zoals je eerder al deed.
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 15:09:00
Quote Anchor link
TJVB, Met jouw commentaar het ik de eerste fetch verwijderd.

// $Record = mysql_fetch_array($result);

Hiermee is mijn eerste probleem verholpen. Bedankt hiervoor. Ik begrijp nu ook wat meer hoe de fetch werkt t.o.v.

$result = mysql_query("SELECT * FROM $tbl_name WHERE Boekjaar = 2012 ORDER BY TransactieID DESC ");

Dus ook daar ben ik weer wijzer van geworden.

Onderstaande regel heb ik aangepast, omdat ik wel alles uit de database nodig heb, maar met de LIMIT ben ik erg blij. Dat helpt zeker.

$result = mysql_query ( "SELECT * FROM " . $tbl_name . " WHERE Boekjaar = 2012 ORDER BY TransactieID DESC LIMIT 50" );

Het werkt en ik kan verder.




Toevoeging op 09/04/2013 15:10:31:

Erwin,

Ook jij bedankt voor je antwoorden. Ik heb ook jouw suggestie doorgevoerd en kan de While loop nu beter gebruiken.

Ook de andere informatie gebruik ik nu verder op de pagina, maar beter gestructureerd.

Ik ga verder, maar zal zeker nog in de toekomst wat vragen hebben.

Nogmaals bedankt.
 
TJVB tvb

TJVB tvb

09/04/2013 15:15:32
Quote Anchor link
Carl, ondanks dat je nu alles nodig hebt (echt alles?) zou ik toch de kolomnamen in de query zetten.
 
Carl Zwanenburg

Carl Zwanenburg

09/04/2013 15:23:08
Quote Anchor link
TJVB,

Ik begrijp wat je bedoeld. Ik ben nu nog aan het experimenteren en heb al een paar andere query's lopen, die ik echt alleen met de gewenste kolomnaam uitvoer. Het scheelt altijd veel dataverkeer en ik beperk ook de risico's door alleen het nodige op te halen. Hoe minder data, hoe lager de kans dat het kan worden opgepakt door anderen, of dat het in de website een "eigen" leven gaat leiden.

Je opmerking zal ik dan ook ter harte nemen.

Bedankt.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.