script42: In PHP-/MySQL-Abfrage fehlt erster Datensatz

Hallo!

Ich bin PHP-Anfänger und versuche gerade, ein paar Datenbankabfragen in eine Tabelle zu bringen. Die Datensätze werden korrekt angezeigt bis auf die Tatsache, dass in der Anzeige immer der erste Datensatz fehlt.

Meine Abfrage lautet:

$sqlselect1 = 
"SELECT * FROM tbl_Kindergaerten a
JOIN tbl_KgAkquise b
ON a.KgID = b.KgID 
WHERE (WvlMappe IS NULL) AND (MappeAn = 'Leitung') AND (MappeZugeschickt IS NULL);";
$result1 = mysqli_query($conn, $sqlselect1);
$resultCheck1 = mysqli_num_rows($result1);

Und das html dazu:

<table class="table table-bordered table-hover table-fixed">
<?php 
if($resultCheck1 < 1) {
	echo "<p>Keine Fotomappen zu versenden</p>";
} else {
?> 
	<thead>
		<tr>
			<th>Einrichtung</th>
			<th>Leitung</th>
			<th>KgStraße</th>
			<th>KgPLZ</th>
			<th>KgOrt</th>
			<th colspan="2">Aktionen</th>
		</tr>
	</thead>
	<tbody>
<?php
	while ($row1 = mysqli_fetch_assoc($result1)) {
?> 
		<tr>
			<td><?php echo $row1['Einrichtung']; ?></td>
			<td><?php echo $row1['LtgAnrede']." ".$row1['LtgNachname']; ?></td>
			<td><?php echo $row1['KgStraße']; ?></td>
			<td><?php echo $row1['KgPLZ']; ?></td>
			<td><?php echo $row1['KgOrt']; ?></td>
			<td><button class="btn btn-default btn-primary">Anschreiben anzeigen</button></td>
			<td><button class="btn btn-default btn-primary">Mappe versendet</button></td>
		</tr>
<?php
	}
echo "</tbody></table>";
}	
?>

Kann mir einer sagen, was ich verkehrt mache? Irgendwo frage ich ja wahrscheinlich den ersten Datensatz schon vorher ab, doch ich weiß nicht, wo.

Danke und Gruß, KG

akzeptierte Antworten

  1. Tach!

    Die Datensätze werden korrekt angezeigt bis auf die Tatsache, dass in der Anzeige immer der erste Datensatz fehlt.

    Eine Strategie beim Debuggen ist, irrelevanten Code auszukommentieren. Dabei kann sich auch herausstellen, dass dann der Fehler verschwindet und der Code vielleicht doch relevant war, zumindest für das Problem. Aber so kann man eben auch die Problemzone eingrenzen und identifizieren.

    Das ist auch eine gute Strategie beim Entwickeln. Erstmal die Kern-Aufgabe erledigen und zur Prüfung auf Richtigkeit lediglich Kontrollausgaben einbauen. Dann erst die Optik für die Ausgabe dranzimmern.

    Und das html dazu:

    ist auf alle Fälle größtenteils nicht relevant und kann auch aus der Problembeschreibung rausgekürzt werden. Beispielsweise enthält der thead-Bereich nur feststehenden Text. Vom tbody-Teil braucht es nur das while und eine Kontrollausgabe mit print_r($row1) genügt ebenfalls.

    Kann mir einer sagen, was ich verkehrt mache? Irgendwo frage ich ja wahrscheinlich den ersten Datensatz schon vorher ab, doch ich weiß nicht, wo.

    Das kann ich nicht erkennen. Ich sehe da keinen datensatzkonsumierenden Funktionsaufruf. Bist du sicher, dass der erste Datensatz überhaupt in der Ergebnismenge ist?

      	<td><?php echo $row1['Einrichtung']; ?></td>
    

    Ich sehe nur, dass in dieser Art Zeilen die Behandlung für den HTML-Kontext fehlt, also ein htmlspecialchars().

    dedlfix.

    1. "Datensatzkonsumierender Funktionsaufruf" heißt das also... 😉 Schon mal gut zu wissen! Und okay, ich werde versuchen, mich bei der Angabe des Codes mehr auf das Wesentliche zu konzentrieren, danke für den Hinweis! Um Deine Frage zu beantworten: Ja, ich bin mir sicher, dass ein Datensatz fehlt, da ich ihn bei der Abfrage in der MySQL-Workbench angezeigt bekomme und ich zur Sicherheit mit dem gleichen Schema auch noch andere Abfragen gemacht habe - immer das Gleiche: Der erste Datensatz fehlt, alle anderen werden vollständig korrekt in der Tabelle angezeigt. Wahrscheinlich ist sogar der komplette Teil des Codes ab dem html-Teil irrelevant, denn interessanterweise ergibt schon ein Echo des $resultCheck1 einen Datensatz zuwenig. (Im Fall der oben angegebenen Abfrage wird mir die Zahl 5 statt der 6 angezeigt.) Woran könnte es noch liegen?

      1. Tach!

        "Datensatzkonsumierender Funktionsaufruf" heißt das also... 😉 Schon mal gut zu wissen!

        Das ist kein Fachbegriff, sondern nur eine Beschreibung, was eine solche Funktion macht. Beispielsweise bewegen die Fetch-Funktionen beim Aufruf den Zeiger in der Ergebnismenge um eins weiter, damit sieht der Datensatz aus wie entfernt/konsumiert, beim nächsten Fetch-Aufruf. Aber man kann diesen Ergebnismengenzeiger mit mysqli_data_seek() auch wieder zurückstellen. Das würde ich aber in deinem Fall nicht tun, sondern erstmal die Ursache finden. Und das wird wohl auch nicht erfolgreich sein, wenn bereits die Zählung einen Datensatz zu wenig ergibt.

        Um Deine Frage zu beantworten: Ja, ich bin mir sicher, dass ein Datensatz fehlt, da ich ihn bei der Abfrage in der MySQL-Workbench angezeigt bekomme und ich zur Sicherheit mit dem gleichen Schema auch noch andere Abfragen gemacht habe - immer das Gleiche: Der erste Datensatz fehlt, alle anderen werden vollständig korrekt in der Tabelle angezeigt.

        Sehr gut, dass du das so überprüft hast. Das ist immer eine gute Idee, die Query erstmal in so einem Managementsystem laufen zu lassen.

        Wahrscheinlich ist sogar der komplette Teil des Codes ab dem html-Teil irrelevant, denn interessanterweise ergibt schon ein Echo des $resultCheck1 einen Datensatz zuwenig. (Im Fall der oben angegebenen Abfrage wird mir die Zahl 5 statt der 6 angezeigt.) Woran könnte es noch liegen?

        Vielleicht greifst du auf eine andere Datenbank zu, die einen Datensatz weniger enthält.

        Wenn du nicht weiterkommst, erstell mal eine neue PHP-Datei und führt das Beispiel von mysqli_fetch_assoc() aus, angepasst an deine Gegebenheiten. Statt der printf()-Zeile im while-Teil kannst du der Einfachheit halber print_r($row); nehmen.

        dedlfix.

        1. Sehr gut erklärt, vielen Dank! Vor allem auch super, dass ich jetzt weiß, wie man es ev. wieder zurückstellen kann. Ich habe mich das schon gefragt, da es bestimmt ab und zu mal vorkommt, dass man es braucht. Also, das Problem zeigt sich inzwischen gleichzeitig klarer und unklarer. Heißt: Heute zeigt er mir alle 6 Datensätze an, ohne dass ich im Code irgendetwas verändert hätte! Ich hatte das Gleiche auch schon mit einer anderen Tabelle, dass die Ausgabe inkonsistent war. Auf der Seite selbst wird vorher nicht viel gemacht, aber es werden die Bootstrap-Dateien reingeladen. Kann das sein, dass das Javascript irgendwie stört oder ist das ausgeschlossen?

          1. Tach!

            Kann das sein, dass das Javascript irgendwie stört oder ist das ausgeschlossen?

            Die Daten werden mittels einer Request-Antwort zum Browser übertragen. Du kannst in den Entwicklertools allen Netzwerkverkehr sehen und untersuchen. Da kannst du feststellen, ob die Daten vollständig oder unvollständig übertragen werden. Wenn Javascript die Ursache für das Verschwinden ist, dann solltest du zumindest die Daten in der Übertragung sehen.

            dedlfix.

            1. Dann werde ich mich mal damit beschäftigen. Vielen Dank soweit!

            2. Moin!

              Die Daten werden mittels einer Request-Antwort zum Browser übertragen. Du kannst in den Entwicklertools allen Netzwerkverkehr sehen und untersuchen. Da kannst du feststellen, ob die Daten vollständig oder unvollständig übertragen werden

              … oder ob die Browserausgabe eventuell dem veralteten Browsercache entstammt.

              Dann sollte etwas wie:

              header('Pragma: no-cache');
              header('Expires: 0');
              

              abhelfen

              1. Danke für den Hinweis! Muss mich damit beschäftigen. Diese Dinge sagen mir alle noch nichts. Aber bald! 😀