Blätterfunktion mit 2 DIVs

Kracky

Mitglied
Hallo,

derzeit arbeite ich an einem News-system, welches auch eine Blätterfunktion beinhaltet.

Die Daten befinden sich allesamt in einer MySQL Datenbank.

Die Seite ist aber so aufgebaut, das die Daten in 2 unterschiedliche DIV's geladen werden sollen.

Pro Seite sollen jeweils 5 Inhalte angezeigt werden. Davon soll jeweils der 5. in einem anderen DIV angezeigt werden als die anderen 4.

Quasi so:
<DIV 1>
inhalt 5
</DIV 1>
<DIV 2>
Inhalt 4
Inhalt 3
Inhalt 2
Inhalt 1
</DIV 2>

Die Blätterfunktion funktioniert soweit, das Problem ist nur das ich nicht weiss wie ich jeden 5. Eintrag beginnend vom letzten rausfiltern soll.

Den letzten habe ich so rausgefiltert:
PHP:
$news_zaehlen = mysql_query("SELECT * FROM news");
$news_numrow = mysql_num_rows($news_zaehlen);

if($news_row->my_sort == $news_numrow) ...

Frage ist jetzt, wie schaffe ich es jetzt die nächsten 4 Beiträge zu überspringen und dann wieder einen zu nehmen?
Mit -4 ist nicht viel, da jedesmal wenn die Schleife einmal durchgelaufen ist, sich die Zahl wieder ändert.

Weiß vll einer von euch eine Lösung?
 
Du kannst mit LIMIT arbeiten:

http://dev.mysql.com/doc/refman/5.1/de/select.html hat gesagt.:
Die LIMIT-Klausel kann zur Beschränkung der Anzahl der von der SELECT-Anweisung zurückgegebenen Datensätze verwendet werden. LIMIT nimmt ein oder zwei numerische Argumente entgegen, die (außer bei Verwendung vorbereiteter Anweisungen) beide nichtnegative Integer-Konstanten sein müssen.

Von den beiden Argumenten gibt das erste den Versatz des ersten zurückzugebenden Datensatzes an, das zweite die maximale Anzahl zurückzugebender Datensätze. Der Versatz des ersten Datensatzes ist 0 (nicht 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
 
LIMIT benutze ich ja schon um die Anazhl der Einträge pro Seite festzulegen.

PHP:
$abfrage = "SELECT * FROM news ORDER BY my_sort DESC LIMIT $start, $limit";

Außerdem kann ich schlecht feste Angaben machen wie 5 oder 10, da sich die Anzahl der Einträge ja ständig erhöht.
Also muss irgendein automatismus her.
 
Das Problem ist, das die schleife 2 ausgaben machen soll.
Und zwar von hinten beginnend. Also vom letzten Eintrag in der Datenbank nach vorne arbeiten. (DESC)

Beim ersten mal soll jedesmal ein DIV gesetzt werden mit dem Inhalt des letzten Datenbankeintrags, dann 5 einträge weiter, dann nochmal 5 einträge weiter etc.
Wenn also 20 Einträge vorhanden sind dann soll er erst den 20. ausgeben dann den 15. dann den 10. und so weiter.

Die Zweite ausgabe soll alle anderen Beiträge ausgeben also 19,18,17,16,14,13,12,11,9 etc

Gesucht ist also eine Funktion oder eine Berechnung, die das voneinander trennt.

PHP:
while($news_row = mysql_fetch_object($ergebnis)) 
	{
	if($news_row->my_sort == $news_numrow)
		{
		echo "<div class=\"content_left_header2\">
			<div class=\"content_left_inhalt2\">";
		echo $news_row->titel;
		echo "</div>
		</div>";
		}
		else
		{
		$headerauswertung = $news_numrow - $limit;
		if($news_row->my_sort == $headerauswertung)
			{
			echo "<div class=\"content_left_header2\">
				<div class=\"content_left_inhalt2\">";
			echo $news_row->titel;
			echo "</div>
			</div>";
			}
			else
			{
			echo "<div class=\"content_left_center2\">
				<div class=\"content_left_inhalt2\">";
			echo $news_row->titel;
			echo "</div>
			</div>";
			}
		}
	}

So sieht die Schleife momentan aus, das Ergebnis ist das auf Seite 1 der 20. Eintrag + die 4 folgenden angezeigt werden, auf Seite 2 wird der 15. Eintrag + die vier folgenden angezeigt, aber ab seite 3+ funktioniert das ganze nicht mehr.
 
Ist zwar stark gekürzt, aber kannst du es nicht so lösen
PHP:
// hier den ersten Datensatz ausgeben
$news_row = mysql_fetch_object($ergebnis);
echo news_row->titel;

// und hier den Rest
while($news_row = mysql_fetch_object($ergebnis)) {
    echo $news_row->titel;
}
 
Wo ist den das Problem?

Der SQL Query ist doch schon so zimich richtig.
SQL:
SELECT * FROM news
  ORDER BY my_sort DESC
  LIMIT {$page}, {$anzahl_pro_seite}


Du übergibst die Seite über $_GET und dann.

machste mit PHP Sowas in die richtung:
PHP:
// Aktuelle Seite Abfragen
$anzahl_pro_seite = 5;
if(isset($_GET['page']) && intval($_GET['page']))
{
  $page = $_GET['page']
}
else
{
  $page = 1;
}


// Daten für Aktuelle Seite Abfragen
$abfrage = <<<SQL
SELECT * FROM news
  ORDER BY my_sort DESC 
  LIMIT {$page}, {$anzahl_pro_seite};
SQL;

$res = mysql_query($abfrage);


// Ausgabe der Aktuellen Seite
while( $row = mysql_fetch_object() )
{
    // ... Hier die Ausgabe hin ...?
}




// Erstellen der Links auf die nächste / letzte Seite
$xPage = $page + 1;
$xAbfrage = <<<SQL
SELECT * FROM news
  ORDER BY my_sort DESC 
  LIMIT {$xPage}, {$anzahl_pro_seite};
SQL;
$xRes = mysql_query( $xAbfrage );


if($page > 1)
  echo '<a href="?page=' . ($page-1) . '" target="_self">Eine Seite zur&uuml;ck</a>';
if(mysql_num_rows($xRes) > 0)
  echo '<a href="?page=' . ($page+1) . '" target="_self">Eine Seite weiter</a>';


Ich weis leider nicht was der Sinn hinter der if(){...}else{...} verschachtellei in der Schleife ist,
deshalb musste die Ausgabe selbst basteln.. Dürfte ja nicht so schwer sein. :p


Achja was meinst du mit "mit 2 DIVs"?
Das ist doch eigentlich nur die Ausgabe,
aber wie ist es gemeint?
 
Das ist wohl doch schwerer zu verstehen als ich dachte.

Okay:
Stellen wir uns einmal eine Seite in 3 Teilen vor, wir haben den Header, Content und Footer.

Im Footer haben wir jetzt die Navigation durch die Seiten

PHP:
$seitenanzahl = $news_numrow / $limit;
		for($a=0; $a < $seitenanzahl; $a++)
			{
			$b = $a + 1;
			
			echo "  <a href=\"?page=home&site=$b\">$b</a> ";
			}

Gehen wir jetzt mal theoretisch davon aus das wir pro Seite 5 Einträge haben und 4 Seiten vorhanden sind. Folglich haben wir 20 Einträge die wir aus der Datenbank abfragen wollen.

Im Content-Bereich sollen jetzt 4 Einträge pro Seite aufgelistet werden und im Header soll 1 Eintrag pro Seite aufgelistet werden.

Wir klicken also in der Navigation z.B. auf Seite 2 und im Header erscheint der 15. Eintrag in der Datenbank und im Content erscheinen die Einträge 14,13,12 und 11.

Auf Seite 3 wäre dann im Header folglicherweise Eintrag 10 und im Content 9,8,7 und 6.

Wie gesagt wir gehen die Datenbank ja rückwärts durch also mit DESC.

Jetzt ist das Problem das auf jeder Seite der Header ebenso wie der Content neu geladen werden muss.

Das heißt wir müssen in unserer while schleife eine Bedingung hinzufügen die sagt:
Erstelle für jeden 5. Eintrag beginnend von hinten ein header DIV und erstelle für die 4 folgenden Einträge ein Content DIV.
Und das auf jeder Seite.

Somit wäre gewährleistet das immer der erste Eintrag pro Seite in den Header geht und falls wir jetzt eine ungerade Zahl an Datenbankeinträgen wie z.B. 24 würde halt die 24 in den Header gehen und 23,22,21,20 in den Content und die nächste Seite würde mit dem Eintrag 19 anfangen.

Die schwierigkeit besteht also darin, eine Bedingung zu schreiben, die bei jedem 5. Schleifendurchlauf den Eintrag in den Header packt und nicht mehr in den Content.

Oder man braucht 2 Bedingungen. In der ersten sagt man lese nur jeden 5. Eintrag aus der Tabelle aus. Und in der 2. sagt man lese alle Beiträge außer jeden 5. aus. Natürlich wieder von hinten beginnend.

Achja der Sinn hinter der if else verschachtelung exsestiert quasi nicht, da es leider nicht funktioniert :) Das ist ja die Frage die ich hier stelle. Wie kann ich die Schleife so durchlaufen lassen, das jeder 5. Eintrag im header div landet und jeder weitere Eintrag im Content DIV
 
Zuletzt bearbeitet:
das würde so gehen:
PHP:
// Ausgabe der Aktuellen Seite
$eintragCounter = 0;
while( $row = mysql_fetch_object() )
{
  if($eintragCounter == 0)
  {
    $content = <<<HTML
	<div class="content_left_header2">
	 <div class="content_left_inhalt2">
	  {$row->titel}
	 </div>
	</div>
HTML;
  }
  else
  {
    $content = <<<HTML
	<div class="content_left_center2">
	 <div class="content_left_inhalt2">
	  {$row->titel}
	 </div>
	</div>
HTML;
  }
  echo $content;
  $eintragCounter++;
}

Hoffe das ist jetzt was du dir vorgestellt hats bzw. es Hilft dir bei deinem Problem.
 
Nur um das jetzt nochmal gedanklich nachzuvollziehen.
Wir setzen eine neue Variable mit dem Wert 0.
Wenn der Wert gleich 0 ist dann soll er den Header posten, und wenn der Wert nicht 0 ist dann content.
Soweit so gut. Jetzt wird der Counter nach jedem schleifendurchlauf um 1 erhöht.

Aber er erreicht doch bei 20 durchläufen nie wieder die 0? Wie will er dann unterscheiden das er bei Eintrag 15 10 5 etc wieder den Header benutzt statt den content?

Für mich sieht das jedenfalls so aus als würde er für den 1. Eintrag den Header benutzen und für alle weiteren den Content und nicht wie beabsichtigt bei jedem 5. Eintrag den Header.

Die logische Schlussfolgerung wäre dann für mich das die IF Bedingung für jeden 5. Eintrag neu definiert werden muss?!

Ich möchte hier auch nochmal sagen das die einzelnen Seiten keine eigenständigen datein sind.
Die Blätterfunktion ist lediglich so gestaltet, das nach 5 Einträgen eine neue GET variable gesetzt wird also quasi

$_GET['seite'] = 1
die ersten 5 Einträge werden angezeigt
$_GET['seite'] = 2
die nächsten 5 Einträge werden angezeigt etc.
 
Zuletzt bearbeitet:
Zurück