PHP Gästebucheinträge auf mehrere Seiten verteilen

M

mustermen

Gast
Ich habe Probleme mit PHP und zwar werden die Daten von der MySQL Datenbank nicht angezeigt, wegen eines Fehlers in Zeile 49:

"Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\gb.php on line 49"

Zeile 49 wurde hervorgehoben durch ein Kommentar!
Dabei will ich nur alle Gästebuch Einträge auf mehrere Seiten verteilen, anstatt alle auf einer.

PHP:
<?php
			// Neues Datenbank-Objekt erzeugen
			$db = @new mysqli( 'localhost', 'root', '', 'gb' );
			// Pruefen ob die Datenbankverbindung hergestellt werden konnte
			if (mysqli_connect_errno() == 0)
			{
				$sql = 'SELECT `id`, `name1`, `url2`, `datum`, `text1` FROM `gb` ORDER BY `id` DESC  LIMIT `$start`, `$eintraege_pro_seite`';   // Hier wurde LIMIT `$start`, `$eintraege_pro_seite`' neu hinzugefügt
				// Statement vorbereiten
				$ergebnis = $db->prepare( $sql );
				// an die DB schicken
				$ergebnis->execute(); //>>>>>>>>HIER IST ZEILE 49!!!!!!!!!!!!!!!!!!!!!!!!!!
				// Ergebnis an Variablen binden
				$ergebnis->bind_result( $id, $name1, $url2, $datum, $text1 );
				// Ergebnisse ausgeben
				while ($ergebnis->fetch())
				{
					echo "<div>";
              		                echo "<p>";
					if ($url2 != ""){
						echo "<a href=\"";
						echo $url2;
						echo "\" target=\"_blank\">";
						echo $name1;
						echo "</a>";
					} else {
						echo $name1;
					}
              		                echo "</p>";
              		                echo "<p>";
              		                echo $datum;
              		                echo "</p>";
              		                echo "<p>";
              		                echo nl2br($text1);
              		                echo "</p>";
              		                echo "</div>";
				        }
			}
			else
			{
				// Es konnte keine Datenbankverbindung aufgebaut werden. Folgender Fehler trat auf: <span class="hinweis">' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</span>
				echo 'Die Datenbank konnte nicht erreicht werden.';
			}
			//Bis hier lief alles immer Problemlos! Jetzt kommt der neue hinzugefügte Code
			
			$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; 
			   } 
			//Verbindung zu Datenbank aufbauen 
			$link = mysql_connect('localhost', 'root', '') or die ("Keine Verbindung moeglich"); 
			mysql_select_db('gb') or die ("Die Datenbank existiert nicht"); 
			//Einträge pro Seite: Hier 5 pro Seite 
			$eintraege_pro_seite = 5; 
			//Ausrechen welche Spalte man zuerst ausgeben muss: 
			$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite; 
			
			
			
			
			//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 `gb`'); 
			$menge = mysql_num_rows($result); 
			
			//Errechnen wieviele Seiten es geben wird 
			$wieviel_seiten = $menge / $eintraege_pro_seite; 
			
			//Ausgabe der Seitenlinks: 
			echo "<div >"; 
			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>"; 

			// Datenbankverbindung schliessen
			$db->close();
			 
			?>
 
Die Backtics bei deiner Limit-Angabe sind falsch, deshalb hat dir prepare einen Fehler und kein Objekt zurückgegeben.
 
http://de3.php.net/manual/de/mysqli.prepare.php
Rückgabewerte

mysqli_prepare() returns a statement object or FALSE if an error occurred.
Da wird wohl irgendwo ein Fehler im Query sein.
Code:
SELECT
  `id`,
  `name1`,
  `url2`,
  `datum`,
  `text1`
FROM
  `gb`
ORDER BY
  `id` DESC
LIMIT `$start`, `$eintraege_pro_seite`
Die Limit-Zeile funktioniert so nicht, denn der Query den du übergibst, wird nicht evaluiert, da du einzelne Hochkommas verwendest.

Entweder
Code:
$sql = " ... LIMIT $start, $eintraege_pro_seite";
oder
Code:
$sql = ' ... LIMIT '.$start.', '.$eintraege_pro_seite;
Weiterhin übergibst du der Limitzeile einen "Spaltennamen" (oder wie man das hier auch bezeichnen mag). Mit `` grenzt man Spalten-, Tabellen- oder anderweitige Namen ein, Werte werden entweder in Hochkommas gesetzt (Strings) oder stehen einfach so da (Int).
 
Jo danke, ich bin ziemlich neu in PHP, also ich habe verstanden irgendetwas mit den Backtics zumachen, also habe ich sie weggelassen nur der Fehler kommt immer noch.
 
Zuletzt bearbeitet:
Dann lass dir den Query mal separat ausgeben vor prepare() und führ diesen mal direkt in PhpMyAdmin aus. Dort wirst du dann ja sehen was der genaue Fehler ist.
 
Versuch mal die Hochkommas bei FROM 'gb', ORDER BY 'id' und wie Yuuri geschrieben bei LIMIT wegzulassen, also ungefähr so:
PHP:
$sql = "SELECT 'id', 'name1', 'url2', 'datum', 'text1' FROM gb ORDER BY id DESC LIMIT $start, $eintraege_pro_seite";
 
Zuletzt bearbeitet:
Ok dass mit den Backtics weglassen hat nichts gebracht. Ich habe nun diese 2 Variablen einfach durch die Zahl 10 ausgetauscht

PHP:
$sql = "SELECT 'id', 'name1', 'url2', 'datum', 'text1' FROM gb ORDER BY id DESC LIMIT 10";

und es werden schon mal 10 Einträge gezeigt, nur steht da immer nur "name1 datum text1" da müssten eigentlich andere Werte stehen.
 
Wie gesagt: Spalten- und Tabellennamen kommen in ``, Strings in '' und Ints, Datumsangaben bspw. stehen einfach nur so da.
Code:
$sql = "
  SELECT
    `id`,
    `name1`,
    `url2`,
    `datum`,
    `text1`
  FROM
    `gb`
  ORDER BY
    `id` DESC
  LIMIT $start, $eintraege_pro_seite";
 
Jo super habe den Code jetzt von dieser Seite
http://www.webmaster-resource.de/gastebuch-mit-php-und-mysql-teil-2.php
genommen funktioniert super, bis auf das die Verlinkung nicht hinhaut. Und sobald man unten auf die Links klickt, diese Fehlermeldung erscheint:

"Objekt nicht gefunden! - Error 404"

Der obere punkt ist gelöst ich Dussel habe vergessen gaestebuch.php in gb.php umzubenennen.

Habe nur noch einen Fehler: Bsp. in der Datenbank sind 15 Einträge und $ErgebnisseProSeite = 50; das heißt alles wird auf einer Seite angezeigt. Dieser Fehler wird aber angezeigt:

Notice: Undefined variable: Seiten in C:\xampp\htdocs\cjw\gb.php on line 92
Hier der aktuelle Code:


PHP:
<?php
				$ErgebnisseProSeite = 10;
				 
				$DatabasePointer = mysql_connect("localhost", "root", "");
				mysql_select_db("gb", $DatabasePointer);
				 
				if(!isset($_REQUEST['AktuelleSeite']))
				{
				$AktuelleSeite = 0;
				}
				else
				{
				$AktuelleSeite = $_REQUEST['AktuelleSeite'];
				}
				 
				$ResultPointer = mysql_query("SELECT `id`, `name1`, `url2`, `datum`, `text1` FROM gb ORDER BY `id` DESC LIMIT $AktuelleSeite, $ErgebnisseProSeite", $DatabasePointer);
				$Anzahl = mysql_num_rows(mysql_query("SELECT `id`, `name1`, `url2`, `datum`, `text1` FROM gb ORDER BY `id` DESC", $DatabasePointer));
				  
				for($i = 0; $i < mysql_num_rows($ResultPointer); $i++)
				{
				$Gaestebuch = mysql_fetch_object($ResultPointer);
				echo "<div>";
				echo "<p>";
				if ($Gaestebuch->url2 != ""){
					echo "<a href=\"";
					echo $Gaestebuch->url2;
					echo "\" target=\"_blank\">";
					echo $Gaestebuch->name1;
					echo "</a>";
				} else {
					echo $Gaestebuch->name1;
				}
				echo "</p>";
				echo "<p>";
				echo $Gaestebuch->datum;
				echo "</p>";
				echo "<p>";
				echo nl2br($Gaestebuch->text1);
				echo "</p>";
				echo "</div>";
				}
				 
				if($Anzahl > $ErgebnisseProSeite)
				{
				$Seiten = intval($Anzahl/$ErgebnisseProSeite);
				 
				if($Anzahl%$ErgebnisseProSeite)
				{
				$Seiten++;
				}
				 
				echo"Seite ";
				}
				 
				for($i = 1; $i <= $Seiten; $i++) <<<ZEILE 92
				{
				echo"<a href=\"gaestebuch.php?AktuelleSeite=", <<<hier muss nur geastebuch.php in gb.php umgewandelt werden
				($i-1)*$ErgebnisseProSeite,
				"\">$i</a>&nbsp;";
				}
			?>
 
Zuletzt bearbeitet:
Naja, wenn $Anzahl = 15 und $ErgebnisseProSeite = 50, dann wird die if-Anweisung direkt vor Zeile 92 nicht ausgeführt und daher $Seiten nicht gesetzt. Dann weiß die for-Anweisung nicht, womit sie da eigentlich vergleichen soll. Du kannst jetzt entweder ein "else { $Seiten = 1; }" an die if-Anweisung anfügen oder den for-Block mit in den if-Block hineinziehen. Letzteres hätte natürlich zur Folge, daß die Seiten-Links nur angezeigt werden, wenn es mehr als eine Seite gibt.
 
Danke NullPointer hat super geklappt!
Mir fällt auf das man nie weiß auf welcher Seite man sich gerade befindet, da alle Seitenzahlen als Links ausgegeben werden. Nun will ich die Aktuelle Seite als nicht link ausgegeben. Mein Problem if($Seiten == $i) wird niemals gleich sein, da $Seiten den Wert 0 für Seite 1, 5 für Seite 2 und 10 für Seite 3 hat. Ich muss $Seiten durch eine andere Variable austauschen aber welche?

if($Seiten == $i) findet ihr fast ganz unten.

PHP:
<?php
				$ErgebnisseProSeite = 5;
				 
				$DatabasePointer = mysql_connect("localhost", "root", "");
				mysql_select_db("gb", $DatabasePointer);
				 
				if(!isset($_REQUEST['AktuelleSeite']))
				{
					$AktuelleSeite = 0;
				}
				else
				{
					$AktuelleSeite = $_REQUEST['AktuelleSeite'];
				}
				 
				$ResultPointer = mysql_query("SELECT `id`, `name1`, `url2`, `datum`, `text1` FROM gb ORDER BY `id` DESC LIMIT $AktuelleSeite, $ErgebnisseProSeite", $DatabasePointer);
				$Anzahl = mysql_num_rows(mysql_query("SELECT `id`, `name1`, `url2`, `datum`, `text1` FROM gb ORDER BY `id` DESC", $DatabasePointer));
				  
				for($i = 0; $i < mysql_num_rows($ResultPointer); $i++)
				{
					$Gaestebuch = mysql_fetch_object($ResultPointer);
					echo "<div>";
					echo "<p>";
					if ($Gaestebuch->url2 != ""){
						echo "<a href=\"";
						echo $Gaestebuch->url2;
						echo "\" target=\"_blank\">";
						echo $Gaestebuch->name1;
						echo "</a>";
					} else {
						echo $Gaestebuch->name1;
					}
					echo "</p>";
					echo "<p>";
					echo $Gaestebuch->datum;
					echo "</p>";
					echo "<p>";
					echo nl2br($Gaestebuch->text1);
					echo "</p>";
					echo "</div>";
					}
					 
					if($Anzahl > $ErgebnisseProSeite)
					{
						$Seiten = intval($Anzahl/$ErgebnisseProSeite);
					 
						if($Anzahl%$ErgebnisseProSeite)
						{
							$Seiten++;
						}
						
						echo "<div>";
						echo"Seiten: ";
					
						for($i = 1; $i <= $Seiten; $i++)
						{
							if($Seiten == $i) //Das Problem ist die variable $Seiten sie hat den wert 0 für Seite 1, 5 für Seite 2, 10 für Seite 3 also kann sie nie gleich mit i sein die nur die Werte 1 - 4 hat.
							{
								echo"<b>$i</b>"; //Hier die Ausgabe des nichtlinks
							} else {
								echo"<a href=\"gb.php?AktuelleSeite=", //Hier die Ausgabe der links
								($i-1)*$ErgebnisseProSeite,
								"\">$i</a>,&nbsp;";
							}
					}
						
						echo "</div>";
				}
			?>

Gelöst ich habe einfach das hier gemacht!

PHP:
for($i = 1; $i <= $Seiten; $i++)
						{
							$SeiteAktuell = $AktuelleSeite/$ErgebnisseProSeite+1;
							if($SeiteAktuell == $i)
							{
								echo"<b>$i, </b>";
							} else {
								echo"<a href=\"gb.php?AktuelleSeite=",
								($i-1)*$ErgebnisseProSeite,
								"\">$i</a>,&nbsp;";
							}
						}

Danke für eure Hilfe
 
Zuletzt bearbeitet:
Zurück
Oben