SQL script laat steeds 1 record te weinig zien.
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)
1
2
3
4
5
6
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);
?>
$result = mysql_query("SELECT * FROM $tbl_name WHERE Boekjaar = 2012 ORDER BY TransactieID DESC ");
$Record = mysql_fetch_array($result);
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
?>
$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.
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.
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.
@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).
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.
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.
Ben nu druk aan het zoeken hoe de "fetch" werkt en waar ik de missing record kan vinden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>';
}
?>
// 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>';
}
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
?>
$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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
?>
// 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;
?>
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)
1
2
3
2
3
<?php
$TransactieDatum = ($TransactieDatum == null)? $Record['TransactieDatum']: $TransactieDatum;
?>
$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.
// $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.
Carl, ondanks dat je nu alles nodig hebt (echt alles?) zou ik toch de kolomnamen in de query zetten.
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.