Erste Zeile der DB fehlt
MH
- mysqli
- php
0 dedlfix1 Rolf B0 MH
0 Fragen zum SQL
Robert B.0 MH
Moin alle zusammen, ich hab mal wieder ein Problem... Und zwar hab ich auf einer meiner Seiten eine Datenbankabfrage welche alle Namen einer bestimmten Klasse abruft. Dies funktioniert auch so weit, dass ich alle bekomme jedoch nicht die aller erste Zeile der Tabelle. Leider hab ich keine Ahnung warum die 1. Zeile fehlt. Ich hab schonmal geschaut woran das liegen kann, aber alle Fehler die ich so gefunden hab woran das liegen kann, treffen bei meinem Code (meiner Meinung nach) nicht zu. Hier mein Code:
$query = sprintf(
"SELECT *
FROM `namen`
WHERE `klasse` = '%s'",
$mysqli->real_escape_string($_GET['klasse'])
);
$abf = $mysqli->query($query);
$data = sprintf(
"SELECT `Anrede`, `Titel`, `Name`
FROM `Lehrer`
ORDER BY `Name` ASC"
);
$ldata = $mysqli->query($data);
while ($row1 = $ldata->fetch_array(MYSQLI_ASSOC)) {
$lehrer[$row1['Name']] = $row1['Anrede'] . ' ' . $row1['Titel'] . ' ' . $row1['Name'];
}
?>
<table>
<thead>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Lehrer</th>
<th>hinzufügen</th>
</tr>
</thead>
<tbody>
<?php $i = 0;
while ($row = $abf->fetch_array(MYSQLI_ASSOC)) : ?>
<tr>
<td><input name="vname[<?php echo $i; ?>]" id="name" value="<?php echo $row['vorname']; ?>" readonly></td>
<td><input name="nname[<?php echo $i; ?>]" id="nname" value="<?php echo $row['nachname']; ?>" readonly></td>
<td><input name="elehrer[<?php echo $i; ?>]" id="elehrer" value="<?php echo $row['name']; ?>"></td>
<td>
<select name="lehrer[<?php echo $i; ?>]" id="lehrer">
<option value="" selected>Bitte wählen Sie einen Lehrer...</option>
<?php foreach ($lehrer as $name => $fullname): ?>
<option value="<?php echo $name; ?>" ><?php echo $fullname; ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php $i++;
endwhile; ?>
</tbody>
</table>
Hat jemand eine Idee woran das liegt?
Vielen Dank schonmal
MH
Tach!
Hat jemand eine Idee woran das liegt?
Es ist unwahrscheinlich, dass irgendwo etwas verschluckt wird, was nicht auf deinen Code zurückzuführen ist. Debugging ist nun angesagt.
Erster Schritt: Arbeiten die Querys wie erwartet? Liefern sie die gewünschte Ergebnismenge, wenn du sie direkt in beispielsweise phpMyAdmin ausführst?
Wenn ja, dann ist der nächste Schritt, die Arbeitsweise des Programms mittels Kontrollausgaben zu analysieren. Hinter jeder Anweisung, die du notiert hast, steckt eine Absicht. Stimmt der Wunsch mit der Wirklichkeit überein?
Zudem ist die Fehlerbeschreibung nicht verständlich genug. Was bedeutet "die erste Zeile fehlt"? Fehlt sie in der Anzeige im Browser, fehlt sie im Quellcode, also der Ausgabe von PHP? Fehlt sie bereits in der Ergebnismenge der SQL-Abfrage?
dedlfix.
Hi dedlfix,
danke für deine Antwort 😀
Manchmal denkt man einfach nicht an die einfachsten Möglichkeiten den Fehler zu finden...
Ich hab die Abfrage im phpMyAdmin ausgeführt und herrausgefunden, dass selbst da die erste Zeile fehlt.
Hab dann die Klasse der ersten Zeile geleert und dann nochmal die Klasse hinzugefügt und jetzt wird die 1. Zeile wieder angezeigt. Anscheinend war da noch ein Leerzeichen oder so mit drin.
Danke nochmal
Gruß MH
Hallo MH,
ah, hab ich also richtig geahnt 😀
Beachte trotzdem meine Hinweise unten.
Rolf
Hallo MH,
ich habe mehrere Ahnungen und du hast ein paar Fehler. Hast Du eigentlich in den Browser-Entwicklertools gecheckt, ob die vermisste Zeile tatsächlich im HTML fehlt? Oder vielleicht einfach nur merkwürdig geliefert wird, so dass sie nicht zur Anzeige kommt? Prüfe das in den echten Sourcen, nicht im Elemente-Inspektor.
Hast Du die von PHP generierte Abfrage 1:1 im phpmyadmin ausgeführt? Kommt die vermisste Zeile dann? Prüfe den Wert des klasse-Feldes der vermissten Zeile ganz genau. Stehen da Leerstellen oder andere Sonderzeichen drin, die man auf Anhieb nicht sieht, die aber die Query verhageln?
Was Du auf jeden Fall tun solltest:
Ziehe die Lehrerabfrage vor die Namenabfrage. Schließe die Lehrer-Query nach Abschluss der Schleife, in der Du sie ausliest, mit $ldata->free(). Dadurch hast Du nicht mehrere Queries parallel offen; das kostet nur unnötig SQL Server Ressourcen. Ein Fehler ist das nicht, aber andersrum ist's schöner.
Gib die Namen der Spalten, die Du in der Namen-Abfrage verwendest, explizit im SQL an. SELECT *
macht man im phpmyadmin, aber nicht in Programmen.
Du musst die Ausgaben der Namen- und Lehrerdaten mit htmlspecialchars() maskieren. Möglicherweise stehen da Inhalte drin, die die Browseranzeige stören.
Rolf
Hallo Rolf,
Danke für deine Antwort. Den Fehler habe ich jetzt schon gefunden, ich werde deine Hinweise aber berücksichtigen und einbauen.
Gruß MH
Moin MH,
zwei Fragen zu deinen SQL-Statements:
$query = sprintf( "SELECT * FROM `namen` WHERE `klasse` = '%s'", $mysqli->real_escape_string($_GET['klasse']) ); $abf = $mysqli->query($query);
Hat es einen besonderen Grund, warum du hier auf prepare und bind verzichtest?
$data = sprintf( "SELECT `Anrede`, `Titel`, `Name` FROM `Lehrer` ORDER BY `Name` ASC" );
Wofür brauchst du hier sprintf?
Viele Grüße
Robert
Hi Robert,
Gruß
MH
Hallo @MH
die Verwendung von prepare und bind hat den Vorteil, dass
Viele Grüße
Robert
Tach!
- es einen Geschwindigkeitsvorteil hat, weil das Statement „vorbereitet“ wird (Unterstützung der Datenbank vorausgesetzt).
Im Falle einer einzelnen SELECT-Abfrage sehe ich den Vorteil nicht. Im Gegenteil, da gehen eher zwei Roundtrips (Prepare, Execute) statt nur einem bei einfacher Query über die Leitung zum MySQL-Server. Den Vorteil gibt es nur bei mehreren Inserts mit demselben Statement.
Zudem ist das Handling des Binding bei den nativen mysqli-Funktionen nicht besonders verwenderfreundlich ist (nur Referenz auf Variablen). Da ist PDO deutlich angenehmer zu bedienen.
dedlfix.