Martin_Online: Kein Umbruch beim letzten DAtensatz

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?

  1. 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/)
    
    1. 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.

    2. 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;  
      }  
      
      
      1. 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:(
        
        1. 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>";  
          	}  
          
          
          1. 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

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
  2. 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

    --
    Alle wollen unser bestes.
    Aber das kriegen sie nicht.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. 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

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
    1. 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

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
      1. 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

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
        1. 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

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          Die ultimative Seite für Selbermacher