Kein Umbruch beim letzten DAtensatz
Martin_Online
- php
0 Tom0 Der Martin0 ChrisB
Hallo,
folgende Funktion ist für meine Werbung zuständig.
function werbung($mysqli, $format = "300250", $limit = "1") {
$stmt = $mysqli->prepare("SELECT werbung_id, werbung_code, werbung_format, werbung_wo, werbung_status FROM werbung
WHERE werbung_status = '1' AND werbung_format = ". $format ." ORDER by RAND() LIMIT ". $limit ."");
$stmt->execute();
$stmt->bind_result($werbung_id, $werbung_code, $werbung_format, $werbung_wo, $werbung_status);
$stmt->store_result();
while($stmt->fetch()) {
if($stmt->num_rows() === 1) {
echo $werbung_code;
} else {
echo $werbung_code;
echo "<br><br>";
}
}
}
Diese funktioniert auch soweit bis auf eine Kleinigkeit. Wenn mehr als ein Datensatz gefunden wird, soll nach jedem Datensatz ein Umbruch eingefügt werden, dieses habe ich so umgesetzt
if($stmt->num_rows() === 1) {
echo $werbung_code;
} else {
echo $werbung_code;
echo "<br><br>";
Auch dieses funktioniert soweit. Allerdings möchte ich beim letzten Datensatz kein <br><br>
mehr haben. Dieses sieht ein User zwar nicht und wäre auch nicht weiter tragisch nur es fällt auf, dass nach unten unnötiger freier Platz ist.
Könnte ich dieses ohne größeren Aufwand lösen?
Hello,
if($stmt->num_rows() === 1) {
echo $werbung_code;
} else {
echo $werbung_code;
echo "<br><br>";
>
> Auch dieses funktioniert soweit. Allerdings möchte ich beim letzten Datensatz kein `<br><br>`{:.language-html} mehr haben. Dieses sieht ein User zwar nicht und wäre auch nicht weiter tragisch nur es fällt auf, dass nach unten unnötiger freier Platz ist.
>
> Könnte ich dieses ohne größeren Aufwand lösen?
Ich würde kein <br> einsetzten, sondern die Datensätze in <p> oder <div> einpacken mit einer eigenen Klasse. Da kannst Du dann per CSS regeln, dass das letzte Element keinen unteren Margin mehr bekommen soll.
CSS3-Selector "last-child"
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
[Die ultimative Seite für Selbermacher](http://getscript.de/)
Hallo Tom,
Ich würde kein <br> einsetzten, sondern die Datensätze in <p> oder <div> einpacken mit einer eigenen Klasse. Da kannst Du dann per CSS regeln, dass das letzte Element keinen unteren Margin mehr bekommen soll.
CSS3-Selector "last-child"
Das ist wirklich eine sehr gute Idee, ich teste das gleich mal! Danke für den Tipp.
Ich würde kein <br> einsetzten, sondern die Datensätze in <p> oder <div> einpacken mit einer eigenen Klasse. Da kannst Du dann per CSS regeln, dass das letzte Element keinen unteren Margin mehr bekommen soll.
CSS3-Selector "last-child"
Ok, hab es so umgesetzt
while($stmt->fetch()) {
if($stmt->num_rows() === 1) {
echo $werbung_code;
} else {
echo "<div class=\"werbung_test\">";
echo $werbung_code;
echo "</div>";
}
}
Und mein CSS Code so
.werbung_test {
margin-bottom:10px;
}
.werbung_test:last-child {
margin-bottom:0px;
}
Hi,
while($stmt->fetch()) {
if($stmt->num_rows() === 1) {
echo $werbung_code;
} else {
echo "<div class="werbung_test">";
echo $werbung_code;
echo "</div>";
}
}
diese Unterscheidung brauchst du nun auch nicht mehr, bzw. sie ist sogar unangebracht. Nutze nur den Code, der im else-Abschnitt steht. Lass den Werbeblock ruhig in einem div-Container stehen, auch wenn's nur einer ist. Das hat keine negativen Auswirkungen, aber einheitliches Markup für unterschiedliche Fälle macht vielleicht später Wartung oder Fehlersuche einfacher.
Ciao,
Martin
--
Man soll den Tag nicht vor dem Abend loben.
Und den Mann nicht vor dem Morgen.
(alte Volksweisheit)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hallo Martin,
diese Unterscheidung brauchst du nun auch nicht mehr, bzw. sie ist sogar unangebracht. Nutze nur den Code, der im else-Abschnitt steht. Lass den Werbeblock ruhig in einem div-Container stehen, auch wenn's nur einer ist. Das hat keine negativen Auswirkungen, aber einheitliches Markup für unterschiedliche Fälle macht vielleicht später Wartung oder Fehlersuche einfacher.
Danke, ich hab es nun wie folgt geändert
while($stmt->fetch()) {
echo "<div class=\"werbung_test\">";
echo $werbung_code;
echo "</div>";
}
Hallo
Danke, ich hab es nun wie folgt geändert
while($stmt->fetch()) {
echo "<div class="werbung_test">";
echo $werbung_code;
echo "</div>";
}
Und weil wir ja gerne mit dem gern' übersehenen nerven …
Beachte bitte den [Kontextwechsel](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel/erkennen_und_behandeln#HTML) (hier von Text in DB nach HTML). Der Inhalt von $werbung\_code wird in die Funktion [htmlspecialchars](http://www.php.net/htmlspecialchars) gekapselt.
Das maskieren der Anführungszeichen hingegen kannst du dir sparen, wenn du als Begrenzer der Zeichenkette die einfachen Anführungszeichen benutzt. Der auf den ersten Blick einzige Nachteil ist, dass innerhalb der Zeichenkettenbegrenzer keine Variablen oder Steuerzeichen interpretiert werden.
~~~php
echo '<div class="werbung_test">'; // geht und ist besser lesbar
echo '<div class="werbung_test">$werbung_code</div>'; // geht nicht
echo "<div class=\"werbung_test\">$werbung_code</div>"; // geht
echo '<div class="werbung_test">\n'; // geht nicht
echo "<div class=\"werbung_test\">\n"; // geht
echo "<div class='werbung_test'>\n"; // geht im Übrigen auch
Und weil ich grad' dabei bin, bei diesem kurzen Abschnitt kannst du, der Übersicht halber, auch alles in einer Zeile abfrühstücken (<gedankenschweif style="mode: homer;">Hmm, … Frühstück.</gedankenschweif>
).
echo '<div class="werbung_test">' . htmlspecialchars($werbung_code) . '</div>';
Tschö, Auge
Hi,
ob du kannst, weiß ich nicht. ;-)
Zumindest könnte es sehr einfach sein: Gib die einzelnen Strings, die die Werbeblöcke darstellen, nicht sofort aus, sondern sammle sie zuerst in einem Array. Benutze zum Schluss implode(), um die einzelnen Teile mit '<br>' als Leim zusammenzupappen. Ich hoffe doch, dass du nur ein '<br>' nimmst - denn zwei aufeinanderfolgende Zeilenumbrüche ergeben semantisch wenig Sinn. Für Abstände greift man lieber zu CSS.
Ciao,
Martin
Hi,
Allerdings möchte ich beim letzten Datensatz kein
<br><br>
mehr haben.
Könnte ich dieses ohne größeren Aufwand lösen?
Ja, in dem du die Logik umdrehst: Der *erste* Datensatz ist, im Gegensatz zum „letzten“, trivial einfach einer Sonderbehandlung zu unterziehen (z.B. durch den Schleifenzähler, oder ein simples Flag bei Schleifen ohne Zähler) – von ihm weiß man immer, der „wie vielte“ er ist, bzw. „wann er kommt“.
Also *vor* jedem Datensatz den Umbruch ausgeben, außer vor dem ersten.
MfG ChrisB
Hello,
Allerdings möchte ich beim letzten Datensatz kein
<br><br>
mehr haben.Könnte ich dieses ohne größeren Aufwand lösen?
Ja, in dem du die Logik umdrehst: Der *erste* Datensatz ist, im Gegensatz zum „letzten“, trivial einfach einer Sonderbehandlung zu unterziehen (z.B. durch den Schleifenzähler, oder ein simples Flag bei Schleifen ohne Zähler) – von ihm weiß man immer, der „wie vielte“ er ist, bzw. „wann er kommt“.
Also *vor* jedem Datensatz den Umbruch ausgeben, außer vor dem ersten.
Da muss man trotzdem fragen, ob es der erste ist...
Und beim Letzten nimmt man einfach das Prädictor-Konstrukt, das auch beim Gruppenwechsel Anwendung findet. Man guckt also erst, ob noch was kommt, bevor man die Ausgabe vornimmt.
Taktzyklen (eine Bedingung) kann man hier nicht einsparen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Und beim Letzten nimmt man einfach das Prädictor-Konstrukt, das auch beim Gruppenwechsel Anwendung findet. Man guckt also erst, ob noch was kommt, bevor man die Ausgabe vornimmt.
Die Frage war,
Könnte ich dieses ohne größeren Aufwand lösen?
Taktzyklen (eine Bedingung) kann man hier nicht einsparen.
Auch das war nicht Kern der Frage.
MfG ChrisB
Hello,
Hi,
Und beim Letzten nimmt man einfach das Prädictor-Konstrukt, das auch beim Gruppenwechsel Anwendung findet. Man guckt also erst, ob noch was kommt, bevor man die Ausgabe vornimmt.
Die Frage war,
Könnte ich dieses ohne größeren Aufwand lösen?
Taktzyklen (eine Bedingung) kann man hier nicht einsparen.
Auch das war nicht Kern der Frage.
und wo War der Mehrwert deines Postings?
Das habe ich dann auch nicht verstanden.
Ob ich nun vorne schneide, oder hinten, ist doch egal.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg