63130
Goto Top

Script zur Ausgabe von Datenbankeinträgen funktioniert nicht

Ich habe für mein aktuelles Projekt ein Script zur Ausgabe von Datenbankeinträgen in PHP erstellt, welches aber nicht Funktioniert. Könnt ihr es euch mal anschauen? Ich verzweifle noch daran!

Das folgende Script soll die Suchergebnisse in Gruppen zu je 10 Einträgen Bündeln und dann unten eine Seitennavigation generieren (Seite 1, 2, 3 etc). Ganz oben wird angezeigt, wie viele Einträge in der Datenbank vorhanden sind und falls es mehr als 20 sind soll noch zusätzlich auf die Suchfunktion verwiesen werden. Die Verbindung mit der Datenbank wird in dem include header.php hergestellt. Ich habe im Quelltext mal kurz notiert was was machen soll und an welcher Stelle er abbricht!


<?php
	include("../../include/header.php");  
		$sql = mysql_query("SELECT id, firma, ort FROM vc_branchenbuch ORDER BY firma ASC");	  
		$zahl = mysql_num_rows($sql); //Zählen der Einträge
		if (!empty($zahl)) {	      //Ausgabe wie viele Einträge vorhanden sind
			Echo "Es sind <b>".$zahl."</b> Eintrage in unserer Datenbank vorhanden.<br />";  
			If ($zahl > 20) {
				Echo "Tipp: Nutzen Sie doch unsere Suchfunktion!";}  
		}else{
			Echo "<br /><br />Es sind keine Einträge in unserer Datenbank vorhanden";		  
		}
      //------------------ Hier bricht er schon ab ----------------------
		if ($zahl < 11) {             //Falls keine Navigation erfolderlich ist (max. 10 Einträge)
			while ($row = mysql_fetch_array($sql)) {
					echo "<a href=\"detail.php?id=$row[id]\"><b>$row[firma]</b></a><br />$row[ort]<br /><br /><br />";  
					$temp = $row[id];
			}		
		}else{
			if (empty($_GET[page])){ //Wurde eine Seite übergeben sprich wurde schon navigiert?
				$page = 1;
			}else{
				$page = $_GET[page];
			}
			$last = $page * 10 - 10; 
			$sqlm = mysql_query("SELECT id, firma, ort FROM vc_branchenbuch LIMIT $last, 10 ORDER BY firma ASC"); //Abfrage  
			while ($row = mysql_fetch_array($sqlm)) { //Ausgabe
					echo "<a href=\"detail.php?id=$row[id]\"><b>$row[firma]</b></a><br />$row[ort]<br /><br /><br />";  
					$temp = $row[id];}		
             // Ab hier wird nur noch die navigation erstellt			
                        $counter = 0;
			while ($counter > $zahl){
				if ($counter + 1 == $page) {
					$c = $counter + 1;
					Echo " ".$c." ";  
				}else{
					$c = $counter + 1;
					Echo " <a href=\"liste2b.php?zahl=".$c."\">".$c."</a> ";  
				}
				if ($counter + 1 != $zahl) {	
					Echo "|";  
				}
				$counter = $counter + 1;
			}
		}
	//Der Footer wird wieder included. Alles dazwischen wird offensichtlich nicht ausgeführt.		
	include("../../include/footer.php");  
?>

Wäre nett wenn ihr mir hier helfen könntet, ich sitze schon seit Tagen (!) an diesem Script und komme nicht weiter. Ich habe es bereits mehrmals neu erstellt aber es funktioniert nie, egal was ich versuche!

Content-Key: 95745

Url: https://administrator.de/contentid/95745

Printed on: April 19, 2024 at 18:04 o'clock

Member: Arano
Arano Sep 01, 2008 at 10:28:11 (UTC)
Goto Top
Moin,

sah __eigentlich__ funktionstüchtig aus und einen logischen Fehler, warum es abbricht, habe ich nicht sehen können. Aber vielleicht sind die anderen kleinen Fehler schuld dran.

"$row[firma]"
Du verwendest 'firma' hier als Konstante, diese ist aber nirgends definiert (define("firma","administrator.de");)
Möchtest du "firma" hier aber als String verwenden, schreibt sich das so:
<?php
  $row['firma'];  
  // oder
  $key = 'firma';  
  $row[$key];
  // oder
  $row["$key"]; // wobei ich die anführungszeichen hier überflüssig finde  
  
  // mit konstante
  define("FIRMA","firma");  
  $row[FIRMA];
?>

Ich habe das und ein paar andere Dinge in deinem Script mal geändert, vielleicht klappt es ja.
Gibt es eigentlich keine Fehlermeldungen, auch nicht um Logfile ?
("error_reporting(E_ALL | E_STRICT);")

Deine Datenbankabfragen habe ich auch ein bisschen umgestaltet.
z.B. die Erste mit der du alle Einträge gezählt hast, warum ALLE Einträge auslesen (Speicherverbrauch) und dann noch mal extra zählen lassen? Es gibt doch "COUNT()".
Dazu habe ich den Query in eine extra Variable geschrieben und seiner Struktur entsprechend umgebrochen. Das hat den Vorteil, dass wenn der Query fehlschlägt, es nicht immer heist: "Check your syntax at line 1 near..." nun kann es auch "..line 2 near..." sein oder eine andere Zeile - Fehler lassen sich so natürlich auch schneller finden.

Fehlen tun noch die Kontrollen ob der Query auch wirklich ausgeführt wurde, oder ob es zu einem Fehler kam. ;)

Un dann gibt es noch ein paar weitere Kommentare die ich reingepfuscht habe ^^
<?php
	include("../../include/header.php");  
            $query     = "SELECT COUNT(*) AS gesamt  
                            FROM vc_branchenbuch";  
            $result    = mysql_query($query);
            $eintraege = mysql_fetch_assoc($result);
		if (!empty($eintraege['gesamt'])) {	      //Ausgabe wie viele Einträge vorhanden sind  
			Echo "Es sind <b>".$eintraege['gesamt']."</b> Eintrage in unserer Datenbank vorhanden.<br />";  
			If ($eintraege['gesamt'] > 20) {  
				Echo "Tipp: Nutzen Sie doch unsere Suchfunktion!";  
                  }
		}else{
			Echo "<br /><br />Es sind keine Einträge in unserer Datenbank vorhanden";  
            }
		
      //------------------ Hier bricht er schon ab ----------------------
		if ($eintraege['gesamt'] < 11) {             //Falls keine Navigation erfolderlich ist (max. 10 Einträge)  
                  $query  = "SELECT id, firma, ort  
                               FROM vc_branchenbuch
                           ORDER BY firma ASC";  
                  $result = mysql_query($query);
			while ($firma = mysql_fetch_array($result)) {
				echo "<a href=\"detail.php?id=$firma['id']\"><b>$firma['firma']</b></a><br />$firma['ort']<br /><br /><br />";  
				$temp = $firma['id'];  
			}
		}else{
                  #if (empty($_GET[page])){
                  /* ####################################################
                     schoen waere hier noch, wuerdest du die uebergebenen
                     seitenzahl mit der hoechst moeglichen vergleichen
                     (alle eingaben die vom benutzer kommmen sind BOESE)
                  */
			if (isset($_GET['page']) && is_numeric($_GET['page'])){ //Wurde eine Seite übergeben sprich wurde schon navigiert?  
				$page = (int)$_GET['page'];  
			}else{
				$page = 1;
			}
			$last   = $page * 10 - 10;
                  $query  = "SELECT id, firma, ort  
                               FROM vc_branchenbuch
                           ORDER BY firma ASC
                              LIMIT $last, 10";  
			$result = mysql_query($query); //Abfrage
			#while ($row = mysql_fetch_array($sql)) { {{comment_single_line_double_slash:5}}
                  /* ######################################
                     gib der variable doch einen vernünftigen
                     namen, einem mit dem man auf den ersten
                     blick erkennen kann was dessen inhalt
                     ist.
                  */
			while ($firma = mysql_fetch_array($result)) { //Ausgabe
				echo "<a href=\"detail.php?id=$firma['id']\"><b>$firma['firma']</b></a><br />$firma['ort']<br /><br /><br />";  
				$temp = $firma['id'];  
                  }
             // Ab hier wird nur noch die navigation erstellt
                  #$counter = 0;
			#while ($counter > $eintraege['gesamt']){ 
                  /* ######################################
                     wieso denn groesser als ? wenn $counter
                     vorher auf 0 gesetzt wird, wird die
                     while doch niemals durchlaufen !
                     ausserdem koennen wir doch auch bei 1
                     anfangen, dan muss nicht immer einer
                     dazu addiert werden.
                  */
                  $counter = 1;
			while ($counter < $eintraege['gesamt']){  
				if ($counter == $page) {
					Echo " ".$counter." ";  
				}else{
					Echo " <a href=\"liste2b.php?zahl=".$counter."\">".$counter."</a> ";  
                              /* #####################################################
                                 warum wir der seitenparameter den "zahl" genannt wenn 
                                 wir weiter oben mit "page" gearbeitet haben !? 
                              */
				}
				if ($counter != $eintraege['gesamt']) {  
                        /* ####################################
                           $counter wird niemals so gross wie
                           $eintraege['gesamt'] weil die while 
                           nur laeuft wen $counter kleiner ist.
                        */
					Echo "|";  
				}
				$counter++; // vorher: "$counter = $counter + 1;" 
                  /* #############################################################################
                     irre ich mich, oder wird hier ein link pro eintrag ausgegeben ? das sollte
                     doch ein link pro seite (10 eintraege) sein - oder nicht !?
                  */
			}
		}
	//Der Footer wird wieder included. Alles dazwischen wird offensichtlich nicht ausgeführt.		
	include("../../include/footer.php");  
?>

Schönen Gruß
Arano
Mitglied: 63130
63130 Sep 01, 2008 at 11:21:10 (UTC)
Goto Top
Juchu, Super, danke! Ich musste nur noch eine variable umbenennen (In der Navigation unten statt liste2b.php?zahl= musste ich page= nehmen), die Variablen im Link zu den einzelnen Einträgen "outsourcen" (immer mit ".$firma['id'].") und beim counter in Zeile 77 durch 10 teilen und dann 1 addieren (Er hat doch pro eintrag eine Seite angelegt) und dann hats einwandfrei geklappt face-smile

Viiiielen Dank!!!

Max

PS: Hier nochmal der entgültige Code wie er funktioniert:

<?php
	include("../../include/header.php");  
            $query     = "SELECT COUNT(*) AS gesamt  
                            FROM vc_branchenbuch";  
            $result    = mysql_query($query);
            $eintraege = mysql_fetch_assoc($result);
		if (!empty($eintraege['gesamt'])) {	      //Ausgabe wie viele Einträge vorhanden sind  
			Echo "Es sind <b>".$eintraege['gesamt']."</b> Eintrage in unserer Datenbank vorhanden.<br />";  
			If ($eintraege['gesamt'] > 20) {  
				Echo "Tipp: Nutzen Sie doch unsere Suchfunktion!<br /><br /><br />";  
                  }
		}else{
			Echo "<br /><br />Es sind keine Einträge in unserer Datenbank vorhanden";  
            }
		
      //------------------ Hier bricht er schon ab ----------------------
		if ($eintraege['gesamt'] < 11) {             //Falls keine Navigation erfolderlich ist (max. 10 Einträge)  
                  $query  = "SELECT id, firma, ort  
                               FROM vc_branchenbuch
                           ORDER BY firma ASC";  
                  $result = mysql_query($query);
			while ($firma = mysql_fetch_array($result)) {
				echo "<a href=\"detail.php?id=".$firma['id']."\"><b>".$firma['firma']."</b></a><br />".$firma['ort']."<br /><br /><br />";  
				$temp = $firma['id'];  
			}
		}else{
                  #if (empty($_GET[page])){
                  /* ####################################################
                     schoen waere hier noch, wuerdest du die uebergebenen
                     seitenzahl mit der hoechst moeglichen vergleichen
                     (alle eingaben die vom benutzer kommmen sind BOESE)
                  */
			if (isset($_GET['page']) && is_numeric($_GET['page'])){ //Wurde eine Seite übergeben sprich wurde schon navigiert?  
				$page = (int)$_GET['page'];  
			}else{
				$page = 1;
			}
			$last   = $page * 10 - 10;
                  $query  = "SELECT id, firma, ort  
                               FROM vc_branchenbuch
                           ORDER BY firma ASC
                              LIMIT $last, 10";  
			$result = mysql_query($query); //Abfrage
			#while ($row = mysql_fetch_array($sql)) { {{comment_single_line_double_slash:5}}
                  /* ######################################
                     gib der variable doch einen vernünftigen
                     namen, einem mit dem man auf den ersten
                     blick erkennen kann was dessen inhalt
                     ist.
                  */
			while ($firma = mysql_fetch_array($result)) { //Ausgabe
				echo "<a href=\"detail.php?id=".$firma['id']."\"><b>".$firma['firma']."</b></a><br />".$firma['ort']."<br /><br /><br />";  
				$temp = $firma['id'];  
                  }
             // Ab hier wird nur noch die navigation erstellt
                  #$counter = 0;
			#while ($counter > $eintraege['gesamt']){ 
                  /* ######################################
                     wieso denn groesser als ? wenn $counter
                     vorher auf 0 gesetzt wird, wird die
                     while doch niemals durchlaufen !
                     ausserdem koennen wir doch auch bei 1
                     anfangen, dan muss nicht immer einer
                     dazu addiert werden.
                  */
                  $counter = 1;
			while ($counter < ($eintraege['gesamt'] / 10 + 1)){  
				if ($counter == $page) {
					Echo " ".$counter." ";  
				}else{
					Echo " <a href=\"liste2b.php?page=".$counter."\">".$counter."</a> ";  
                              /* #####################################################
                                 warum wir der seitenparameter den "zahl" genannt wenn 
                                 wir weiter oben mit "page" gearbeitet haben !? 
                              */
				}
				if ($counter != $eintraege['gesamt']) {  
                        /* ####################################
                           $counter wird niemals so gross wie
                           $eintraege['gesamt'] weil die while 
                           nur laeuft wen $counter kleiner ist.
                        */
					Echo "|";  
				}
				$counter++; // vorher: "$counter = $counter + 1;" 
                  /* #############################################################################
                     irre ich mich, oder wird hier ein link pro eintrag ausgegeben ? das sollte
                     doch ein link pro seite (10 eintraege) sein - oder nicht !?
                  */
			}
		}
	//Der Footer wird wieder included. Alles dazwischen wird offensichtlich nicht ausgeführt.		
	include("../../include/footer.php");  
?>
Member: Arano
Arano Sep 01, 2008 at 21:57:47 (UTC)
Goto Top
Schön schön, dann haben meine Kommentare ja doch ein bisschen geholfen ^^

Eine Kleinigkeit habe ich da aber jetzt noch (oder wieder):
In Zeile 67. hast du "while ($counter < ($eintraege['gesamt'] / 10 + 1)){ " stehen, der rechte Teil des veergleichs (die Rechnung) wir bei jedem durchlaufen der Schleife berechnet, das ist bei vielleicht unwesentlich, aber wie heisst es doch so schön: "Kleinvieh macht auch misst !"
Hier also das Ergebnis in einer Variablen speichern und diese verwenden:
<?php
  $maxSeite = ceil($eintraege['gesamt'] / 10);  
  while ($counter < $maxSeite){ 
     [...]
  }
  /*
    mit ceil() wird aufgerundet, daher brauchst du dein "+1" nicht mehr, das, wenn ich mich nicht irre, sowieso einen zuviel addiert hätte wenn eine passende Anzahl von eintraegen vorhanden ist: 
    div     ceil   maxSeite   richtig?
    10/10 = 1    = 1        = ja
    15/10 = 1,5  = 2        = ja
    div     +1     maxSeite   richtig?
    10/10 = 1    = 2        = nein
    15/10 = 1,5  = 2,5      = nein
  */
?>

~Arano
Member: masterG
masterG Sep 02, 2008 at 10:12:10 (UTC)
Goto Top
Thread closed
masterG(Moderator)