PHP Ausgabe bei Gästebuch mit Blätterfunktion funktioniert nicht...

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi hab nen Tipp aus nem anderen Beitrag bekommen, ein Tutorial anzuschauen, um in meinem Gästebuch eine Blätterfunktion einzubauen. Jedoch habe ich nach langem rumprobieren bestimmt noch Fehler eingebaut und deshalb bekomme ich das Gästebuch nicht ans Laufen.

Hier mein Quellcode:

PHP:
<?php
//Connect zur _GETbank
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', '*zensiert*' );
define ( 'MYSQL_KENNWORT', '*zensiert' );
define ( 'MYSQL__DATENBANK', '*zensiert*' );

$db_con = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_con )
{
    // das Problem ausgeben mit: mysql_error()
    die('Verbindung zur Datenbank fehlgeschlagen. Bitte später probieren. ');
}

$db_sel = mysql_select_db( MYSQL__DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen.");
		
$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist 

//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1 
if(!isset($seite)) 
   { 
   $seite = 1; 
   } 
	
?>

<table class="gaestebuchanzeige">
		<tr class="top">
			<td>
			
			<?php
				// Anzeige der Anzahl der Einträge
				$query_all = mysql_query("SELECT * FROM gaestebuch ORDER BY ID");
				$gb_anzahl = mysql_num_rows($query_all);
				echo "<p>Anzahl der Gästebuch-Einträge: $gb_anzahl  </p>";
				
				
				//Einträge pro Seite: Hier 10 pro Seite 
					$eintraege_pro_seite = 10; 

				//Ausrechen welche Spalte man zuerst ausgeben muss: 
					$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite; 
					
				// ausführen des mysql-Befehls
				$sql_query = "SELECT * FROM gaestebuch WHERE Aktiv = '1' 
							ORDER BY ID DESC LIMIT $start, $eintraege_pro_seite"; 							
				$ergebnis = mysql_query( $sql_query );
				if ( ! $ergebnis )
				{
					die('Ungültige Abfrage: ' . mysql_error());
				}		
				
				
				while($row = mysql_fetch_object($ergebnis)) 
				{ 
					$id = $row->ID;
					$inhalt = $row->Text; 
					$inhalt = htmlentities($inhalt); 
					$inhalt = nl2br($inhalt); 
					$datum = date("d.m.Y H:i", $row->Datum); 

					//Der Besucher hat keine E-Mail Adresse angegeben: 
					if($row->Email == "") 
					{ 
						$name = "<b>$row->Name</b>"; 
					} 
					else 
					{ 
						//Der User hat eine Email Adresse angegeben: 
						$name = "<a href=\"mailto:$row->Email\">$row->Name</a>"; 
					}
					
					// Aushabe der _GET
					echo "<div class='boxtitlesub'><label class='x-small'>
							# $id von $name am: $datum
							</label></div>";
					echo "<label class='small'>$inhalt</label>";
					echo "<br /> <br />";   
				}
				if (!$row)
				{
					die ("Zeilenauswahl fehlgeschlagen.".mysql_error());
				}
				mysql_free_result( $ergebnis );
				//Jetzt kommt das "Inhaltsverzeichnis", 
				//sprich dort steht jetzt: Seite: 1 2 3 4 5 

				//Wieviele Einträge gibt es überhaupt 
				//Wichtig! Hier muss die gleiche Abfrage sein, wie bei der Ausgabe der Daten 
				//also der gleiche Text wie in der Variable $abfrage, blo&szlig; das hier das LIMIT fehlt 
				//Sonst funktioniert die Blätterfunktion nicht richtig, 
				//und hier kann nur 1 Feld abgefragt werden, also id 

				$result = mysql_query("SELECT ID FROM gaestebuch WHERE aktiv = '1'"); 
				$menge = mysql_num_rows($result);
				

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

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


				//Ausgabe der Links zu den Seiten 
				for($a=0; $a < $wieviel_seiten; $a++) 
				{ 
					$b = $a + 1; 

					//Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben 
					if($seite == $b) 
					{ 
						echo "  <b>$b</b> "; 
					} 

					//Aus dieser Seite ist der User nicht, also einen Link ausgeben 
					else 
					{ 
						echo "  <a href=\"?seite=$b\">$b</a> "; 
					} 


				} 
				echo "</div>"; 
				?>

			</td>
		</tr>
	</table>
Der jetzige Fehler, der mir angezeigt wird ist der, der nach der While-Schleife bei der Ausgabe verursacht wird.
Nun noch der Link zu meiner Seite.
Hoffe das Ihr mir weiterhelfen könnt.

Wie kann ich testen ob die Schleife arbeitet? Diese Schleife zeigt keine Wirkung. Einen mysql_error wird nicht erzeugt, also scheint die Abfrage ja in Ordnung zu sein.
 
Zuletzt bearbeitet:
Da kommt nur die Fehlermeldung, die ich selbst eingebaut habe nach der While-Schleife...
Aber keine mysql_error-Fehlermeldung...
 
Hab mal nen bissl rumgelesen und herausgefunden, dass man mit der einstellung error_reporting(E_ALL); alle Fehlerursachen anzeigen lassen kann...

Nun hab ich den Fehler :
Notice: Undefined index: seite in /usr/export/www/vhosts/funnetwork/hosting/raven16/homepage_2008/include/gaestebuchform.inc.php on line 19

das ist diese zeile:
$seite = $_GET["seite"]; //Abfrage auf welcher Seite man ist

Hab sowiso den Sinn daraus nicht verstanden... Im tutorial soll hier die Seite abgefragt werden...
d.h. wenn irgendwo denke ich (...).php?seite=1 oder so steht dann soll diese funktion die derzeitige seite auslesen...
komisch...

weiß jemand dazu nen rat?
 
Das ist ja eigtl. nur ne Notice und kein direkter schwerwiegender Fehler. Trotzdem sollte
PHP:
$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist 

//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1 
if(!isset($seite)) 
   { 
   $seite = 1; 
   }
geändert werden in
PHP:
if(isset($_GET["seite"])) $seite = $_GET["seite"];
else $seite = 1;
Dann ist das weg.

Nun zum eigentlichen Fehler:
Was soll das "if (!$row)" überhaupt bringen? Das ist doch genau das Abbruchkriterium der while-Schleife und daher ists klar, dass das IMMER diesen "Fehler" ausgeben wird obwohl eigentlich gar kein Fehler existiert.

Hab sowiso den Sinn daraus nicht verstanden... Im tutorial soll hier die Seite abgefragt werden...
d.h. wenn irgendwo denke ich (...).php?seite=1 oder so steht dann soll diese funktion die derzeitige seite auslesen...
komisch...
Das hast du richtig erfasst. Diese Links werden übrigens auch an der Stelle erzeugt, an der"//Aus dieser Seite ist der User nicht, also einen Link ausgeben " steht.
 
Hab das jetzt geändert, aber is kommt trotzdem kein vernünftiges ergebnis zu stande...

Ist zwar kein Fehler mehr da, aber nun ist alles leer und unten steht nur Seite:

Über der Seite: müssten noch 10 Einträge sein und unten müssten 2 Seiten stehen weil ich 11 Einträge insgesamt gemacht hatte um das zu testen
 
Vielleicht werden sie ja nur nicht angezeigt, weil sie nicht aktiv sind ("Aktiv = '1' ") in der Datenbank. Dieses "Aktiv = 1" hast du nämlich in der ersten Abfrage zur Zählung der Gesamteinträge nicht drin während es bei den anderen Abfragen drin ist.

Im Übrigen solltest du zum Zählen der Einträge immer (du hast das mehrfach) ein "SELECT COUNT(*) as anzahl" verwenden und das Ergebnis abfragen, denn wenn dus so machst wie bisher, dann ist das sobald es viele Einträge nicht gerade effizient. Denn bei deiner Variante wird tatsächlich die komplette Tabelle von MySQL an PHP geschickt während bei der Count-Abfrage MySQL das Zählen übernimmt (was dann auch noch extrem schnell geht wenn es einen entsprechenden Index gibt) und nur die Zahl schickt.
 
Dieses Tutorial scheint sehr schlecht erklärt zu sein...

Laut dem Tutorial sollte eine zusätzliche Tabellenspalte angelegt werden: Aktiv,tinyint,1,unsigned

wie das funktioniert wird überhaupt nicht richtig erklärt...
 
Bist du denn von vornherein mit dem Tutorial gegangen oder sind Teile davon bei dir wieder anders? Die dort verwendete eintragen.php setzt ja korrekterweise "aktiv = 1".
Wie man Tabellen bzw. in dem Fall Spalten anlegt wird als vorausgesetzt angesehen, da wirklich nicht alles erklären kann. Normalerweise benutzt man dazu ein Tool wie phpmyadmin (wird meist vom Hostinganbieter schon vorinstalliert irgendwo) was im Übrigen auch sehr empfehlenswert für deine restliche Arbeit ist, weil du dann siehst, was denn nun in der Datenbank ist oder nicht und außerdem dort auch die SQL-Abfragen schnell und einfach testen kannst.
 
Also ich hab mir die Tabelle in phpmyadmin mal angeschaut und es stimmt wie von dir gesagt alle einträge auf aktiv = 0 gesetzt

aber wirklich verstehe ich das nicht wie die von 0 auf eins gesetzt werden und wofür man das überhaupt braucht...
doofes tut xD
 
Jaja Hauptsache die andern sind schuld. Der Code im Tutorial erzeugt - wie bereits gesagt - einen korrekten Eintrag (der "INSERT INTO" Befehl ist hier entscheidend) aber wahrscheinlich hast du zum Eintragen des Gästebucheintrags einen anderen Code (irgendwo zusammenkopiert?) den du hier aber scheinbar auch nicht preisgeben willst.

Im Übrigen würde ich dir empfehlen, mal wirklich PHP und MySQL zu lernen (nein, das geht nicht mit einem 5-Minuten-Tutorial). In der Form von dir und des Tutorials kann ich keine Empfehlung geben, das öffentlich ins Internet zu stellen (SQL-Injections, Spam) und ich werde es dir auch sicher nicht schreiben, da die Eigenleistung von dir bislang praktisch nicht vorhanden ist (alles aus dem Tutorial kopiert).
 
Ich lerne auch mit einem kleinen PHP-Buch :P
Da steht aber leider nicht alles drin^^
Und das feld ist extra dafür da damit man sich den Quelltext kopieren kann und das damit ausprobieren kann...erst wenn es funktioniert passe ich das auf meine Bedürfnisse an ;)


Das ist bisher mein eintrag-quellcode
PHP:
<?php
//Connect zur Datenbank
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', '*zensiert*' );
define ( 'MYSQL_KENNWORT', '*zensiert*' );
define ( 'MYSQL_DATENBANK', '*zensiert*' );

$db_con = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_con )
{
    // das Problem ausgeben mit: mysql_error()
    die('Verbindung zur Datenbank fehlgeschlagen. Bitte später probieren. ');
}
$db_sel = mysql_select_db( MYSQL_DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen.");

				// In die SQL-Datenbank eintragen

				if($_POST['valider'] && strlen($_POST['eintrag'])>4)
				{
					$sql="INSERT INTO gaestebuch (Name, Email, Datum, Text)
					VALUES('".mysql_real_escape_string($_POST['name'])."',
						'".mysql_real_escape_string($_POST['email'])."',
						'".mysql_real_escape_string(date('Y-m-d H:i:s'))."',
						'".mysql_real_escape_string($_POST['eintrag'])."')";  
					$result = mysql_query($sql);
					if (!$result) 
					{
						die('SQL Befehl konnte nicht ausgeführt werden. ' . mysql_error());
					}			
				}
				else
				{
					header("location:gaestebuchform_eintragen_fehler.inc.php");
				}
				header("location:index.php");  
?>

Werd das noch so fixen, das das läuft

Aber ich verstehe immernoch nicht, warum man einträge als aktiv speichern sollte
 
Zuletzt bearbeitet:
Das sieht ja schon mal ganz gut aus mit mit dem mysql_real_escape_string...
Das aktiv-Feld ist wohl dafür vorgesehen, dass man z.B. sagt: Alle Einträgen sind zu Beginn aktiv=0. Erst wenn der Besitzer des Gästebuchs es freischaltet, werden die Einträge auf aktiv=1 gesetzt, so dass sie jeder sieht. Oder eben dafür, dass der Besitzer des Gästebuchs bestimmte Einträge deaktivieren kann ohne dass sie komplett gelöscht werden. Wenn du das nicht brauchst, kannst du die Spalte auch entfernen (natürlich dann auch überall das "aktiv=1" aus den Abfragen entfernen!). Wenn du die Einträge sofort sichtbar haben willst, muss es halt so aussehen:
PHP:
$sql="INSERT INTO gaestebuch (Name, Email, Datum, Text, aktiv)
                    VALUES('".mysql_real_escape_string($_POST['name'])."',
                        '".mysql_real_escape_string($_POST['email'])."',
                        '".mysql_real_escape_string(date('Y-m-d H:i:s'))."',
                        '".mysql_real_escape_string($_POST['eintrag'])."', 1)";
 
Danke ;)

Also ich bin schon mal nen Schritt weiter...
Den ersten aktiven Eintrag hab ich manuell via phpmyadmin eingetragen um zu gucken, wie die Abfrage sein muss...
 
Ich hab jetzt noch ein Problem mit dem Datum :-/

In meiner eintragen-include-datei speichert time() zuerst den aktuellen Unix-Timestamp (Zeitstempel), d.h. die Anzahl der Sekunden seit dem 1.1.1970, 0:00 Uhr (Beginn der Unix-Epoche). Grundlage ist Systemzeit des Servers.

Ich bekomme dadurch einen Eintrag in der Spalte "Datum" meiner Datenbank, welcher als Integer beispielsweise so aussieht: 1232974099

ausgelesen wird dieser Wert laut dem Tutorial mit dieser Zeile:
PHP:
$datum = date("d.m.y H:i", $row->datum);
Jedoch erhalte ich in dieser Zeile bei jedem angezeigten Eintrag folgende Notiz
Notice: Undefined property: stdClass::$datum in /usr/export/www/vhosts/funnetwork/hosting/raven16/homepage_2008/include/gaestebuchform.inc.php on line 80


Die Uhrzeit wird falsch wieder aus der Datenbank ausgelesen und bei jedem Eintrag wird das Datum 01.01.1970 01:00 angezeigt


Weiß jemand noch Rat, wie ich die Uhrzeit richtig auslesen kann oder was ich falsch mache?
Der Quelltext ist oben
 
Heisst denn die Spalte in der Datenbank wirklich genau "datum" (also auch von der Klein-/Großschreibung her!)?
 
BerniG schrieb:
Heisst denn die Spalte in der Datenbank wirklich genau "datum" (also auch von der Klein-/Großschreibung her!)?

Ja...
sonst wäre ja beim Eintrag in die Datenbank schon was schiefgegangen...

was jetzt schief geht ist das Auslesen... ;)
 
BerniG schrieb:
Beim Eintragen schreibst dus aber groß :freak:

*hust*
Peinlicher gehts gar net mehr :D: lol
Bin heute aber auch irgendwie voll unkonzentriert ^^

Hab noch nen bissl an den If-Fragen rumgeschraubt für das Seitenblättern und wollte erreichen das nicht mehr Seite: da steht, sondern einfach nur 1|2 usw.

PHP:
//Ausgabe der Links zu den Seiten 
				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> "; 
					} 
				}

Meine allerletzte Frage ist, bevor ich den Thread erfolgreich schließen kann von meiner Seite aus, wo und wie ich die maximale Performance mit Count() in der SQL-Abfrage realisieren kann...
Ich hab gelesen das es erst ab 90.000 Dateneinträgen etwas ausmachen soll oder so ähnlich und dies nicht in absehbarer Zeit in meinem Gästebuch eintreffen wird, aber es ist ja doch schon nützlich das noch zu wissen
 
So in etwa:
PHP:
$query_all = mysql_query("SELECT COUNT(*) AS anzahl FROM gaestebuch");
$row = mysql_fetch_object($query_all);
$gb_anzahl = $row->anzahl;

...

$result = mysql_query("SELECT COUNT(*) AS anzahl FROM gaestebuch WHERE aktiv = '1'"); 
$row = mysql_fetch_object($result);
$menge = $row->anzahl;
 

Ähnliche Themen

Zurück
Oben