PHP Blätterfunktion

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi,

Bin dabei eine Blätterfunktion zu schreiben und hab da noch einen Fehler den ich ein wenig verwirrend finde...
Hab mir 3 Fälle überlegt und dafür If-Anweisungen programmiert
//Fall 1)
//1|2|3|4|5|6

//Fall 2)
//1|2|3|...|5|6|7

//Fall 3)
//1|2|3|...|5|6|7|...|9|10|11

(Bemerkung: Die Berechnung der Zahlenwerte stimmen noch nicht ganz mit den 3 Fällen überein)

Fall eins ist jetzt fertig
aber bei Fall 2 klappt die ausgabe der letzten 3 Einträge nicht ordnungsgemäß
irgendwie hab ich da als ausgabe ...|5.3|6.3|7.3
Ich weiß echt nicht warum der einen Link auf einmal mit einem Punkt verbindet obwohl ich diesen nirgens definiert habe

Schaut euch einfach mal den Code selbst an:
PHP:
//###############################################################################################################
				//###########################################SeitenBetechnung####################################################
				//#################################Seiten unten anzeigen lassen unterm Gästebuch#################################
				//###############################################################################################################
				$result = mysql_query("SELECT COUNT(ID) AS Anzahl FROM gaestebuch WHERE Aktiv = '1'"); 
				$menge_res = mysql_fetch_object($result);
				$menge = $menge_res->Anzahl;
				

				//Errechnen wieviele Seiten es geben wird 
				$wieviel_seiten = $menge / $eintraege_pro_seite; 

				//Ausgabe der Seitenlinks: 
				echo "<div align=\"center\">"; 
				

				//Wenn weniger als 7 Einträge vorhanden sind, dann...
				//Fall 1)
				//1|2|3|4|5|6
				if ($wieviel_seiten <=7)
				{
					//Ausgabe der Links zu den Seiten 
					if ($gb_anzahl > 10)
					{
						for($a=0; $a < $wieviel_seiten; $a++) 
						{ 
							$b = $a + 1; 
							
							//Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben 
							if($seite == $b) 
							{ 
								//Wenn die erste Seite geschrieben wird, dann füge keinen "|" ein...
								if ($b == 1) echo "<b>$b</b>"; 
								//...sonst füge "|" ein
								else echo "|<b>$b</b>";
							} 
							//Aus dieser Seite ist der User nicht, also einen Link ausgeben 
							else 
							{ 
								//Wenn der Link der ersten Seite geschrieben wird, dann füge keinen "|" ein...
								if ($b == 1) echo "<a href=\"?seite=$b\">$b</a>";	
								//...sonst füge "|" ein
								else echo "|<a href=\"?seite=$b\">$b</a>"; 
							} 
						} 
					}
				}
				//sonst...
				//Fall 2)
				//1|2|3|...|5|6|7
				else 
				{
					//anfang der linkleiste berechnen
					for($c=0;$c <= 2; $c++)
					{
						$d = $c + 1; 
						
						//Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben 
						if($seite == $d) 
						{ 
							//Wenn die erste Seite geschrieben wird, dann füge keinen "|" ein...
							if ($d == 1) echo "<b>$d</b>"; 
							//...sonst füge "|" ein
							else echo "|<b>$d</b>";
						} 
						//Aus dieser Seite ist der User nicht, also einen Link ausgeben 
						else 
						{ 
							//Wenn der Link der ersten Seite geschrieben wird, dann füge keinen "|" ein...
							if ($d == 1) echo "<a href=\"?seite=$d\">$d</a>";	
							//...sonst füge "|" ein
							else echo "|<a href=\"?seite=$d\">$d</a>"; 
						}
					}
					//Startwert für die letzten 3 Seiten berrechnen
					$ende = $wieviel_seiten - 3;				
					//Mittelteil |... ausgeben
					echo '|...';
					//Letzte 3 Seiten ausgeben
					for($ende;$ende <= $wieviel_seiten;$ende++)
					{
						//Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben 
						if($seite == $ende) 
						{ 
							//füge "|" ein
							echo "|<b>$ende</b>";
						} 
						//Aus dieser Seite ist der User nicht, also einen Link ausgeben 
						else 
						{ 
							//füge "|" ein
							echo "|<a href=\"?seite=$ende\">$ende</a>"; 
						}
					}
				}
				//Fall 3)
				//1|2|3|...|5|6|7|...|8|9|10 noch in arbeit


hier geht's zur Seite
 
Hmm habs eben überflogen.

Bei Fall 2 greifst du auf

$ende = $wieviel_seiten - 3;

zurück.

Am anfang rechnest du:

$wieviel_seiten = $menge / $eintraege_pro_seite;

Denk darüber mal nach. Ich denke das es davon kommt. Überleg mal was so als ergebnis rauskommen kann wenn man teilt.
 
Hanni2k schrieb:
Hmm habs eben überflogen.

Bei Fall 2 greifst du auf

$ende = $wieviel_seiten - 3;

zurück.

Am anfang rechnest du:

$wieviel_seiten = $menge / $eintraege_pro_seite;

Denk darüber mal nach. Ich denke das es davon kommt. Überleg mal was so als ergebnis rauskommen kann wenn man teilt.

Sagen wir das $menge=73 ist, welches durch die Countfunktion in der sqlabfrage gezählt wurde...
Dann ist $wieviel_seiten = 73 / 10
also gleich 7.3

Und vor der Schleife von Fall 2 für die letzten 3 Ziffern rechne ich:
$ende = $wieviel_seiten - 3
das heißt ich würde dann 4.3 als Startwert für die schleife rausbekommen was dann auch den link 4.3 erklärt :-)

Aber wie kann ich am besten nur die glatte zahl also 4 usw. herausbekommen?
Da müsstet ihr mir nochmal auf die Sprünge helfen^^
 
Zuletzt bearbeitet:
Nach oben aufrunden:

PHP:
$wieviel_seiten = (int) (($menge / $eintraege_pro_seite) + 1);
$wieviel_seiten = intval( ($menge / $eintraege_pro_seite) + 1);
$wieviel_seiten = ceil($menge / $eintraege_pro_seite);

... und abrunden

PHP:
$wieviel_seiten = (int) ($menge / $eintraege_pro_seite);
$wieviel_seiten = intval( $menge / $eintraege_pro_seite );
$wieviel_seiten = floor($menge / $eintraege_pro_seite);

Bei allen anderen Fragen hilft auch meist das offizielle Handbuch weiter
 
Jo danke... das funktioniert jetzt einwandfrei :)
Aber ich muss dann nochmal gucken was die einzelnen Befehle (int),intval und ceil bewirken ;-)
Ich will ja auch nachvollziehen können wie das funktioniert^^

Aber jetzt kommt das schwierigste... Fall 3^^
muss ich mal nen bissl rumknobeln...;)
wenn ich es net hinbekomme dann melde ich mich nochmal

mfg
 
Zuletzt bearbeitet:
oder du machst es ganz einfach und mit substr alles abschneiden so das du nur die erste ziffer hast, is aber nich ganz so "sauber"

ansonsten

www.de.php.net --> intval oder ceil usw. eingeben da hasste ne erklärung dann
 
Ich denke ich werde den 3. Fall soo strukturieren

Wenn ich auf Seite 4 bin
1|...|3|4|5|...|8

Seite 5:
1|...|4|5|6|...|8

usw ;)

wäre das soo sinvoll oder hat jemand evtl. noch nen besseren Vorschlag wie man das machen sollte?
 
Jo, so find ich das auch am komfortabelsten - hab's selbst so gelöst :D

suchergebnisse.jpg
 
Bei mir im Communitychat ist das so geregelt:

2. Fall so wie bei mir

und beim 3.

Seite 4:

1|...|3|4|5|6|7|...|37|38|39|40

Seite 5:
1|...|4|5|6|7|8|...|37|38|39|40

Ist auch ne Überlegung Wert, falls man mal mehrere Seiten nach hinten springen will^^
Aber weiß noch net soo genau...^^
Die Werte wie viele der am anfang, in der mitte, und am ende dann ausgeben soll kann ich dann ja immernoch nach belieben ändern ;)
 
Kommt auch auf die Anzahl der Treffer an. Wenn ich oben in meinem Beispiel deine letzte Variante nutzen würde, könnte ich auch gleich alle Seiten von Anfang bis Ende auflisten :)

Bei sehr vielen Seiten wäre das natürlich nochmal eine Verbesserung, allerdings sollte man es mMn symmetrisch halten; dass man also auch genau so schnell zur Seite 2, 3 ,4 springen kann:

| 1 | 2 | 3| 4 | ... | 14 | 15| 16| 17| ... |27 | 28 | 29 | 30 |​
 
Jau...

ich glaub dann mach ich das man in 2er schritten springen kann...
und so wie bei dir das mitt vorherige und nächste ist auch keine schlechte idee^^

dann braucht man net immer zu suchen ;)

vll mach ich das dann so..

|<< = erste
< = vorherige
> = nächste
>>| = letzte
 
hey,

du kannst auch mit LIMIT arbeiten. Dann bekommst werden nur die Datensätze gelesen, die du tatsächlich anzeigen willst. Ein Beispiel von mir (Sorry für den schlechten Code, der stammt aus meiner PHP-Anfangszeit ;)).

Code:
<?php
	
	if($site != "gb"){
		include "redirect.inc.php";
	}
	
	$EntriesPerSite = 5;
	
	$token = md5(uniqid(rand())); 

	$write = $_GET['write'];
	
	echo "\n<table width=\"100%\"  cellpadding=\"2\" cellspacing=\"0\" \"><tr><th colspan=\"2\">G&auml;stebuch</th></tr>";		
	
	// Script zum eintragen	
	if( isset($_POST['write']) )
	{
		$token = $_POST['token'];
		$arrError = array();

		$gb_autor = $_POST['gb_autor'];
		$gb_text = $_POST['gb_text'];
		$ip = GETENV('REMOTE_ADDR');	

		if( $gb_autor == "" )		
			$arrError[] = "Bitte Namen eingeben.";		
		if ( $gb_text == "" )
			$arrError[] = "Bitte Text eingeben.";
			
		if($_SESSION['token'] == $token)
		{
			// $arrError[] = "schon geschrieben!";
		}
		else
		{
			if( count($arrError) > 0 )
			{
				echo "<tr><td colspan=\"2\" class=\"error\">";
				for($i=0;$i < count($arrError);$i++)
				{
			        	echo $arrError[$i]."<br>";
				}
				echo "</td>";
			}
			else
			{
				$_SESSION['token'] = $_POST['token'];
				// Entferne script-tags
				$gb_text = rm_tags($gb_text);			
				// Eintragen
				$sql_eingabe = "INSERT INTO $gb_tblname(datum, uhrzeit, autor, inhalt, ip) VALUES(CURRENT_DATE, CURRENT_TIME,'$gb_autor','$gb_text', '$ip')";			
				$result = sql_abfrage("$db_host","$db_user","$db_pass","$db_name","$sql_eingabe");
			}
		}
	}

	
	if ( !( isset($_POST['write']) AND count($arrError) > 0 ) AND !isset($_GET['write']))
	{
			$sql = "SELECT count(lfdnr) as anzahl FROM gaestebuch";
			$result = sql_abfrage("$db_host","$db_user","$db_pass","$db_name","$sql");
			$row = mysql_fetch_assoc($result);			
					
			$offset = $_GET['offset'];
			if($offset == "")
			{
				$offset = 0;
			}
			print("<tr><th colspan=\"2\">Seite");
		    
		    $pages = $row[anzahl]/$EntriesPerSite; 		
			if(fmod($row[anzahl], $EntriesPerSite) > 0)
			{
				$pages++;
			}
			
			$page = (($offset+$EntriesPerSite)/$EntriesPerSite);
						
			$next = 0;
			$counter = 1;			
			
			while($counter < $pages)
			{			
				if($page == $counter)
				{			
					// Die Seite, die angezeit wird nicht mit einem Link versehen
					print("&nbsp;".($counter)."&nbsp;");			
				}
				else
				{			
					if($counter >= $pages)
					{
						// Alle anderen Seiten mit einem Link versehen
						print("&nbsp;<a href=\"".$filename."?site=".$site."&offset=".$next."\">".($counter)."</a>&nbsp;");
					}
					elseif($counter <= ($page+3) && $counter >= ($page-3))
					{
						// Alle anderen Seiten bis +3/-3 mit einem Link versehen
						print("&nbsp;<a href=\"".$filename."?site=".$site."&offset=".$next."\">".($counter)."</a>&nbsp;");
					}
					elseif( $counter == ($page+4) || $counter == ($page-4) )
					{
						print("&nbsp;...");
					}					
				}
				// Endlosschleife vermeiden ;)
				$next = $next + $EntriesPerSite;
				$counter++;
			}
		    print("</th>\n\t\t</tr>");
			
			
				
	        //Script zum auslesen
	        $sql = "SELECT lfdnr, datum, uhrzeit, autor, inhalt, ip
	        		FROM $gb_tblname
	        		ORDER BY lfdnr DESC
					LIMIT $offset, $EntriesPerSite";
	        
	        $result = sql_abfrage("$db_host","$db_user","$db_pass","$db_name","$sql"); 
	        $lines = 0;
	        while ($row = mysql_fetch_assoc($result))
	        { 
	        	
		     	if(($zeile % 2) == "0"){
	        		print "\n\t<tr valign=\"top\" class=\"Line1\">";
	        	}else{
	        		print "\n\t<tr valign=\"top\" class=\"Line2\">";
	        	}
	        	echo "\n\t\t<td width=\"25%\">Von: <b>".$row['autor']."</b><br>Am: ".short_date($row['datum'])."<br>Um: ".short_time($row['uhrzeit'])."</td>";
	        	echo "\n\t\t<td width=\"75%\">".nl2br($row['inhalt'])."</td>";
	        	echo "\n\t</tr>\n\t<tr>\n\t\t<td>&nbsp;</td>\n\t</tr>";
	        	
	        	$lines++;
	        } 
	        if($lines = 0){
	        	print("\n\t<tr>\n\t\t<td class=\"info\">Kein Eintrag vorhanden</td>\n\t</tr>");
	        }
	}
	
	if($write == 1 || ($_POST['write'] && count($arrError) > 0))
	{
		echo "<tr>
			<td>
			<form method=\"post\" action=\"".$_SERVER['PHP_SELF']."?site=".$site."\">
			<input type=\"hidden\" name=\"token\" value=\"".$token."\">
			<table width=\"100%\">
				<tr>
					<td><a name=\"Input\"></a>Name:</td>
					<td><input type=\"text\" name=\"gb_autor\" maxlength=\"20\" value=\"".$gb_autor."\"></td>
				</tr>
				<tr>
					<td>Nachricht:</td>
					<td><textarea name=\"gb_text\" cols=\"50\" rows=\"10\">".$gb_text."</textarea></td>
				</tr>
				<tr>
					<td>&#160;</td>
					<td><input type=\"submit\" value=\"Eintragen\" name=\"write\"><input type=\"button\" value=\"N&ouml;, will doch net\" name=\"abort\" onclick=\"location.href='".$_SERVER['PHP_SELF']."?site=".$site."'\"></td>
				</tr>
			</table>
			</form>
			</td>
			</tr>";	
	}
	
	echo "\n<table width=\"100%\" class=\"ContentFooter\">
			<tr>
				<th>Version 0.9 5-3-6 | <a href=\"".$_SERVER['PHP_SELF']."?site=".$site."&write=1\">Neuer Eintrag</a></th>
			<tr>
			</table>";

?>
 
Zurück
Oben