Eerste rij uit een SELECT word niet weergegeven
Ik ben bezig een systeempje te maken waarin je je eigen SELECT-query kunt laten draaien.
Nu heb ik een werkend systeem, alleen wordt hierbij steeds de eerste rij niet weergegeven. Iemand enig idee wat ik verkeerd doe?
(Dit is de versie zonder foutafhandeling etc, alleen relevante code en een voorbeeld-query)
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$query = mysql_query("SELECT liednr, bun, titel FROM bundel WHERE bun = 'eig' ORDER BY liednr ASC");
$aFields = array();
$row = mysql_fetch_assoc($query);
$koppen = array_keys($row);
$aantal = mysql_num_rows($query);
echo 'Er zijn '.$aantal.' rijen gevonden';
// Haal de kolomtitels op
echo '<table border=1 bordercolor=black>
<tr><td>#</td>';
foreach($koppen as $kop){
echo '<td>'.$kop.'</td>';
// Zet de kolomtitels in een array voor later gebruik
array_push($aFields, $kop);
}
echo '</tr>';
// Rij-counter
$i=1;
// Geef de gegevens weer
while($bRow=mysql_fetch_array($query)){
echo '<tr>';
echo '<td>'.$i.'</td>';
foreach($aFields as $sField) {
$bRow[$sField] = htmlentities($bRow[$sField]);
// Kort de gegevens in als deze langer dan 50 karakters is
if(strlen($bRow[$sField]) > 50){
$bRow[$sField] = substr ($bRow[$sField],0,50).'...';
}
echo '<td>'.$bRow[$sField].'</td>';
}
echo '</tr>';
$i++;
}
echo '</table>';
?>
$query = mysql_query("SELECT liednr, bun, titel FROM bundel WHERE bun = 'eig' ORDER BY liednr ASC");
$aFields = array();
$row = mysql_fetch_assoc($query);
$koppen = array_keys($row);
$aantal = mysql_num_rows($query);
echo 'Er zijn '.$aantal.' rijen gevonden';
// Haal de kolomtitels op
echo '<table border=1 bordercolor=black>
<tr><td>#</td>';
foreach($koppen as $kop){
echo '<td>'.$kop.'</td>';
// Zet de kolomtitels in een array voor later gebruik
array_push($aFields, $kop);
}
echo '</tr>';
// Rij-counter
$i=1;
// Geef de gegevens weer
while($bRow=mysql_fetch_array($query)){
echo '<tr>';
echo '<td>'.$i.'</td>';
foreach($aFields as $sField) {
$bRow[$sField] = htmlentities($bRow[$sField]);
// Kort de gegevens in als deze langer dan 50 karakters is
if(strlen($bRow[$sField]) > 50){
$bRow[$sField] = substr ($bRow[$sField],0,50).'...';
}
echo '<td>'.$bRow[$sField].'</td>';
}
echo '</tr>';
$i++;
}
echo '</table>';
?>
In dit voorbeeld zou ik 40 rijen moeten krijgen. Er komt ook keurig: "Er zijn 40 rijen gevonden" te staan, dus de mysql_num_rows werkt wel goed. Er komen echter maar 39 rijen in de tabel te staan
Gewijzigd op 19/10/2013 11:33:23 door Tobias Tobias
Ergo conclusio: er is geen probleem. ;-)
Toevoeging op 19/10/2013 12:02:16:
Het zou natuurlijk kunnen dat die eerste rij wel relevante data bevat, en dat je die eigenlijk misbruikt om de veldnamen te achterhalen. In dat geval zou mijn vervolgvraag zijn: waarom? Je weet immers de veldnamen al, want die noem je expliciet in je query.
Het probleem is natuurlijk gewoon de eerste fetch op regel 4. Die fetcht de eerste rij en die rij ben je dus vervolgens kwijt in de while loop.
Dat lijkt inderdaad het probleem. Als ik op regel 22 de query opnieuw uitvoer, krijg ik wel de 40 rijen te zien. Bedankt!
Maar dat is natuurlijk NIET de oplossing. Gewoon de array weer resetten.
Je kan $row ook gewoon in een echo zetten vóór de while().
Willem vp op 19/10/2013 11:57:33:
In dat geval zou mijn vervolgvraag zijn: waarom? Je weet immers de veldnamen al, want die noem je expliciet in je query.
In het voorbeeld staat de query al, maar het idee van het systeem is dat je je eigen query invoert en deze uitgevoerd wordt. Je weet dus van tevoren de veldnamen niet.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query = "geen idee wat, maar 't begint met SELECT";
$kolommen= str_replace("SELECT ", "", $query);
list($kolommen, $zooi) = explode("FROM", $kolommen);
$kolommen = explode(", ", $kolommen);
print_r($kolommen);
?>
$query = "geen idee wat, maar 't begint met SELECT";
$kolommen= str_replace("SELECT ", "", $query);
list($kolommen, $zooi) = explode("FROM", $kolommen);
$kolommen = explode(", ", $kolommen);
print_r($kolommen);
?>
Code (php)
1
2
2
SELECT COUNT(*) AS num, IF(name = '', '[no name]', name) AS name, COALESCE(views, 0) AS views
FROM blablabla
FROM blablabla
Een teller laten lopen met je while loop en checken of je met het eerste record bezig lijkt me veeeel makkelijker en dan gaat het in elk geval wel goed.
Tobias Tobias op 19/10/2013 12:48:52:
@Eddy: En hoe doet ik dat?
Aha, met mysql_data_seek($query, 0)
Aha, met mysql_data_seek($query, 0)
Juist, is het aller makkelijkste
Toevoeging op 19/10/2013 14:08:18:
Op wat Erwin zegt na ;-)
Maar dat is natuurlijk NIET de oplossing. Gewoon de array weer resetten.
Waarom is dat NIET de oplossing? Twee keer fetchen als je het maar 1 keer nodig hebt kost meer resources dan een enkele counter (wat ook nog een bit mag zijn als je alleen wil weten of het de eerste rij is of niet).