Leere Datenfelder aus einer MySQL-Abfrage nicht anzeigen

godfather_al

Mitglied
Hallo zusammen,

möchte gerne mit PHP und MySQL aus einer DB nur die Felder (jeweils Überschrift und Inhalt) untereinander anzeigen lassen, die auch belegt sind. Derzeit ist es leider so, dass auch leere Felder "angezeigt" werden, und sich dadurch der Content, der darunter kommt, nach unten verschiebt, und es entsteht ein sehr unschöner Leerraum, das möchte ich vermeiden.

Habe in einem ähnlichen Fall mit einer IF - Abfrage eine Lösung gebastelt (s. zweiter Codeblock), das erscheint mir hier aber zu aufwändig und zu langsam, kann mir jemand einen Tip geben wir man so etwas "elegant und performant" lösen kann?

Vielen Dank für Eure Hilfe.


Hier der Code:

PHP:
    $sql = "SELECT * FROM portal_pages WHERE pageid = \"{$_GET["id"]}\"";
    $res = mysql_query($sql) or die (mysql_error());
    while ($row = mysql_fetch_assoc($res)) echo "
    <h1>
    {$row["content1headline"]}
    </h1>    
    <p>
    {$row["content1content"]}
    </p>
    <h2>
    {$row["content2headline"]}
    </h2>    
    <p>
    {$row["content2content"]}
    </p>
    <h2>
    {$row["content3headline"]}
    </h2>    
    <p>
    {$row["content3content"]}
    </p>
    <h2>
    {$row["content4headline"]}
    </h2>    
    <p>
    {$row["content4content"]}
    </p>
    <h2>
    {$row["content5headline"]}
    </h2>    
    <p>
    {$row["content5content"]}
    </p>
    <h2>
    {$row["content6headline"]}
    </h2>    
    <p>
    {$row["content6content"]}
    </p>
    <h2>
    {$row["content7headline"]}
    </h2>    
    <p>
    {$row["content7content"]}
    </p>
    <h2>
    {$row["content8headline"]}
    </h2>    
    <p>
    {$row["content8content"]}
    </p>
    <h2>
    {$row["content9headline"]}
    </h2>    
    <p>
    {$row["content9content"]}
    </p>
    <h2>
    {$row["content10headline"]}
    </h2>    
    <p>
    {$row["content10content"]}
    </p>
    
    ";



Habe in einem anderen Fall zwar eine Lösung gefunden, die ist mir aber wie erwähnt an der o. g. Stelle zu aufwendig und zu langsam, hier nur die "andere" Lösung mal als Hintergrundinfo:


PHP:
<?php
    session_start();

    include 'config.inc.php';
    $sql = "SELECT margin1headline FROM portal_pages WHERE pageid = \"{$_GET["id"]}\" AND LENGTH(margin1headline) > 0";
    $res = mysql_query($sql) or die (mysql_error());
    if (mysql_num_rows($res) != 0) {
    echo "<div id='margincontainer'><div id='margin1head'>";
    while ($row = mysql_fetch_assoc($res)) echo "
    <p>{$row["margin1headline"]}</p></div>";
    mysql_free_result($res);    
    }
    ?> 
  
    <?php
    include 'config.inc.php';
    $sql = "SELECT margin1content FROM portal_pages WHERE pageid = \"{$_GET["id"]}\" AND LENGTH(margin1content) > 0";
    $res = mysql_query($sql) or die (mysql_error());
    if (mysql_num_rows($res) != 0) {
    echo "<div id='margin1box'>";
    while ($row = mysql_fetch_assoc($res)) echo "
    <p>{$row["margin1content"]}</p></div>";
    mysql_free_result($res);    
    }
    
    $sql = "SELECT margin2headline FROM portal_pages WHERE pageid = \"{$_GET["id"]}\" AND LENGTH(margin2headline) > 0";
    $res = mysql_query($sql) or die (mysql_error());
    if (mysql_num_rows($res) != 0) {
    echo "<div id='margin2head'>";
    while ($row = mysql_fetch_assoc($res)) echo "
    <p>{$row["margin2headline"]}</p></div>";
    mysql_free_result($res);    
    }
    ?> 
  
    <?php
    include 'config.inc.php';
    $sql = "SELECT margin2content FROM portal_pages WHERE pageid = \"{$_GET["id"]}\" AND LENGTH(margin2content) > 0";
    $res = mysql_query($sql) or die (mysql_error());
    if (mysql_num_rows($res) != 0) {
    echo "<div id='margin2box'>";
    while ($row = mysql_fetch_assoc($res)) echo "
    <p>{$row["margin2content"]}</p></div>";
    mysql_free_result($res);    
    }
    echo "</div>";
?>
 
Ein if muss schon her. Aber du musst nicht alle 10 einzeln ausprogrammieren
PHP:
while ($row = mysql_fetch_assoc($res)) 
    echo "<h1>{$row['content1headline']}</h1>";
    echo "<p>{$row['content1content']}</p>";
	for($i=2; $i <=10; $i++){
		$content = $row["content{$i}content"];
		if(isset($content)){
	    	echo "<h2>{$row["content{$i}headline"]}</h2>";
	    	echo "<p>{$content}</p>";
		}	
	}
}
 
Hi Yaslaw,

vielen Dank für die schnelle und wieder mal sehr hilfreiche Antwort. Habe am Ende der ersten Zeite noch ein "{" eingefügt und nun geht es schon fast wie gedacht, habe die ersten 2 Contentfelder und das 10. Contentfeld belegt, aber er fügt mir dazwischen in den Quelltext noch ein

"</p><h2></h2><p></p><h2></h2><p>"

ein, also zweimal die Überschrift leer und einmal den Content leer, statt wie vorher 7 Mal die beiden leeren Abschnitte.

Habe geprüft ob die Felder in der DB auch wirklich leer sind, aber sie sind es, woran könnte es liegen dass hier in den Quelltext trotzdem die leeren Tags eingefügt werden?

Viele Grüße
Alex
 
Zurück