PHP: Klasse/Funkction: Ausgabe ohne Wert

Der_baum

Mitglied
Hallo zusammen,

ich habe mal wieder ein Problem wo ich gerade nicht mehr durchsteige. Die Funktion „Create_Page_Data“ gibt mir leider die gewünschten Werte nicht aus. Komme auch nicht dahinter. Ist auch mein erster Versuch im Bereich Klassen und Funktionen, deswegen wäre ich über jeden Performance-, Sicherheits- oder sonstigen Tipp sehr dankbar.

Hier mal die Datei in der die Funktion liegt:

PHP:
<?php

class db_com {

	protected $dbhost = "xxxxxx";
	protected $dbuser = "xxxxxx";
	protected $dbpass = "xxxxxx";
	protected $dbname = "xxxxxx";
	protected $db_status = "disconnected";
	protected $connection_id;
	protected $errormessage;
	protected $errornumber;
	protected $id = 0;

// Variablen aus Page_Data Select
	protected $Page_Path;
	protected $Hersteller;
	protected $Hauptkategorie;
	protected $Subkategorie;
	protected $Kategorie01;
	protected $Kategorie02;

// Variablen aus Create_Page_Data Select

	protected $cp_PagePath;
	protected $cp_ImagePat;
	protected $cp_Hersteller;
	protected $cp_Modellbezeichnung;
	protected $cp_Hauptkategorie;
	protected $cp_Subkategorie;
	protected $cp_Kategorie01;
	protected $cp_Kategorie02;
	protected $cp_Finanzierung;
	protected $cp_Neu;
	protected $cp_Produkt_Beschreibung;

// Protect für sonstige Variablen

	protected $page_data_select;
	protected $query_page_data;
	protected $query_result_page_data;
	protected $create_page_select;
	protected $query_create_page;
	protected $query_result_create_page_data;
		



// ----------------------------------------------------Verbindung zum DB Server herstellen----------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Establish_Connection() {

			if($this->db_status == "disconnected") {
				$this->connection_id = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
				$this->errormessage = mysql_error();
				$this->errornumber = mysql_errno();
				return $this->db_status = "connnected";
			}else{
				echo "Fehler in function: Establish_Connection";
				return $this->db_status = "disconnected";
			}
		}
// ----------------------------------------------------Mit Datenbank Verbinden----------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Select_DB() {

			if($this->db_status != "disconnected") {
				$this->selected_db = mysql_select_db($this->dbname, $this->connection_id);
				$this->errormessage = mysql_error();
				$this->errornumber = mysql_errno();
			}else{
				echo "Fehler in function: Select_DB";
				return $this->db_status = "disconnected";
			}
		}
// ----------------------------------------------------Seiten ID holen-----------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Get_ID() {

			$this->id = mysql_real_escape_string($_GET['id']);
			
			if($this->id == '') {
				echo "<h1 style=\"color:#F00;\">Hack attempt!!</h1>";
				}else{
					return $this->id;
			}
		}
// ----------------------------------------------------Page Data Select----------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Page_Data() {

			$this->page_data_select = "	SELECT PagePath, Section, Hersteller, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02
										FROM link_verwaltung
										WHERE LinkID = ".$this->id."";

			if($this->db_status != "disconnected") {
				$this->query_page_data = mysql_query($this->page_data_select, $this->connection_id);
				if($this->query_result_page_data = mysql_fetch_array($this->query_page_data)) {
					mysql_free_result($this->query_page_data);
				}

				$this->Page_Path = $this->query_result_page_data['PagePath'];
				$this->Section = $this->query_result_page_data['Section'];
				$this->Hersteller = $this->query_result_page_data['Hersteller'];
				$this->Hauptkategorie = $this->query_result_page_data['Hauptkategorie'];
				$this->Subkategorie = $this->query_result_page_data['Subkategorie'];
				$this->Kategorie01 = $this->query_result_page_data['Kategorie01'];
				$this->Kategorie02 = $this->query_result_page_data['Kategorie02'];
				
				$this->errormessage = mysql_error();
				$this->errornumber = mysql_errno();
			}else{
				echo "Fehler in function: Page_Data<br>\n";
				return $this->db_status = "disconnected";
			}
		}
// ----------------------------------------------------Interpretiert den Query---------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Interpret_Query() {

			if($this->Page_Path != '') {
				return (include $this->Page_Path);
				}else{
					$this->Choose_Create_Page_Function();
				}
		}
// ----------------------------------------------------Funktion wählt aus, welche Funktion zum Seite erstellen benutzt wird------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		protected function Choose_Create_Page_Function() {

			if(!($this->Subkategorie == '')) {
				echo "Call Create_Producer_Index<br>\n";
				$this->Create_Producer_Index();
				}else{
					$this->Create_Page_Data();
				}
			}
// ----------------------------------------------------Create Page Select--------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		protected function Create_Page_Data() {

			$this->create_page_select = "	SELECT PagePath, ImagePath, Hersteller, Modellbezeichnung, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02, Aktiv, Finanzierung, Neu, Produkt_Beschreibung
											FROM produkte
											WHERE Hersteller = '".$this->Hersteller."'
											AND	Hauptkategorie = '".$this->Hauptkategorie."'
											AND	Subkategorie = '".$this->Subkategorie."'
											AND	Kategorie01 = '".$this->Kategorie01."'
											AND	Kategorie01 = '".$this->Kategorie02."'
											AND	Aktiv = 1";

			$this->query_create_page = mysql_query($this->create_page_select, $this->connection_id);
			$this->query_result_create_page_data = mysql_fetch_array($this->query_create_page, MYSQL_ASSOC));
			$this->mysql_free_result($this->query_result_create_page_data);
			
		}
// ----------------------------------------------------Funktion erstellt Hersteller Index Seite----------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Create_Producer_Index() {

			echo "Herstellerindex bauen<br>\n";
		}
// ----------------------------------------------------Funktion erstellt Produkt Index Seite-------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------
		protected function Create_Product_Index() {

			echo "\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"artikel_table\">";

			printf ("<tr>
					<td class=\"left\"><img src=\"". $this->query_result_create_page_data['ImagePath'] ."\" alt=\"". $this->query_result_create_page_data['Hersteller'] ." ". $this->query_result_create_page_data['Modellbezeichnung'] ." \"></td>
					<td><strong>". $this->query_result_create_page_data["Hersteller"] ." ". $this->query_result_create_page_data["Modellbezeichnung"] ."</strong><br>
					". $this->query_result_create_page_data['Produkt_Beschreibung'] ."<br>
					<a href=\"". $this->query_result_create_page_data['PagePath'] ."\" class=\"readmore\" alt=\"Lesen Sie weiter...\">Lesen Sie mehr...</a></td>
					</tr>"
					,$this->query_result_create_page_data['PagePath'], $this->query_result_create_page_data['ImagePath'], $this->query_result_create_page_data['Hersteller'], $this->query_result_create_page_data['Modellbezeichnung'], $this->query_result_create_page_data['Produkt_Beschreibung']
					);
			print "</table>";
		}


// ----------------------------------------------------Letzten Fehler ausgeben----------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
		protected function free_query() {

			mysql_free_result();
		}
// ----------------------------------------------------Letzten Fehler ausgeben----------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
		public function Get_last_error() {
			
			if($this->db_status == "disconnected") {
				return (print "Fehlernummer: ".$this->errornumber . "<br>\n Fehlerbeschreibung: " . $this->errormessage);
			}
		}
// ----------------------------------------------------Script Ende----------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------
}

Und so wird das ganze aufgerufen:
PHP:
require_once 'scripte/functions/db_com.php';

$db_com = new db_com();
$db_com->Establish_Connection();
$db_com->Select_DB();
$db_com->Get_ID();
$db_com->Page_Data();
$db_com->Interpret_Query();
$db_com->get_last_error();

Die Funktion
Hoffe wir kommen da weiter. Danke,
Daniel
 
Zuletzt bearbeitet:
Naja, Klassen hervorragend dazu geeignet, kontextorientiert die Daten zu strukturieren..

Als erstes würde ich eine Klasse nur für die Datenbankverbindung bauen, die sähe vom Grundgerüst vielleicht so aus:

PHP:
class db_connector
{
  private db_user    = x;
  private db_pass   = x;
  private db_datab  = x;

  private db_handle = false;
  .
  .
  .

  public function db_connect()
  {
    //mit datenbank verbinden
  }
  public function db_query($query)
  {
    //den query an die db schicken, und 
    return $ar_result;  //das ergebnis zum bsp als array zurückgeben
  }
}

überleg Dir, welche Daten zusammen gehören, und bilde am besten danach Deine Klassen. Mir fällt noch auf, dass Du an vielen Stellen zum Beispiel hier:
PHP:
if($this->id == '') {
  echo "<h1 style=\"color:#F00;\">Hack attempt!!</h1>";
}else{
  return $this->id;
}
über "return $this->id;" den Wert an die aufrufende Funktion zurückgibst.. ist in Deinem Codebeispiel nicht wirklich notwendig. Dann ist es einfach übersichtlicher, wenn erst die Daten über die Objekte auf deiner Hauptseite gesammelt werden, und du sie zum Schluss ausgibst. Hat finde ich den Vorteil, dass du durch die Delegation der Aufgaben und Daten an die einzelnen Objekte Fehler einfacher lokalisieren kannst, und dass das ganze meiner Meinung nach sehr viel übersichtlicher wird.

so long

softi
 
Hallo,

also meinst du ich soll 4 Klassen schreiben:

- db_connector (s.o.)
- Klasse die Daten sammelt
- Klasse die Daten analysiert
- und eine Klasse die ggf. die Seiten erstellt

Gruß und Danke für deine Antwort,
Baum
 
Jau, ich denke das wird dir vielleicht selber helfen, das problem zu finden oder zumindestens einzugrenzen! Für die Seitenerstellung brauchst du vielleicht keine Klasse; ich finde, dass das in vielen fällen mit Kanonen auf Spatzen schiessen ist, wenn Die Site nicht so umfangreich wird, dass sich das wirklich lohnt. Aber das liegt zum Glück in den Händen des Entwicklers ;)
Ansonsten fällt mir dazu nur noch ein - wenn Du zum Beispiel die Seite mit der index.php darstellen willst finde ich es übersichtlicher, in der ersten Hälfte die Daten hin- und herzuschubsen, und anschliessend, wenn sie alle gesammelt sind, im HTML teil darunter ausgeben zu lassen. Aber das ist wahrscheinlich wieder Ansichtssache. Zumindestens trennt man so in dem Dokument die Logik von der Ausgabe.

gruß softi
 
Hi,

ich werde, wenn ich das Script eh abändere, trotzdem eine eigene Klasse zur Seitenerstellung schreiben, denn bis dato habe ich 2 verschiedene Seiten die erstellt werden müssen, .... werden aber bestimmt noch mehr. So halte ich mir dann die Erweiterung offen.
Was anderes, als die Daten hin und her zu schupsen, bleibt mir eh nicht übrig da bestimmte Abläufe bedingt durch die erste DB-Afrage gestartet werden.
 
Das hört sich nach einem Plan an! Also, du hast willst Klasse, die den Rohbau der Seite ausgibt. Eine css Datei steuert das Layout, das wird wahrscheinlich auf deinem gesamten Auftritt gleich sein. Überleg dir, welche Teile auf der Seite "dynamisch" werden, diese müssen schliesslich gesteuert werden.
Ich weiss gar net, ob man das darf, aber ein nettes tool zum Brainstormen und zum Ordnen der Gedanken ist der GoVisual Diagram Editor, den man kostenlos auf der seite http://www.oreas.com runterladen kann.. es schmiert gerne mal ab, also immer schön strg-s während der Arbeit drücken :-)
Als erstes ist da natürlich der content-bereich, der hat entsprechend auch ein eigenes Layout. Um den Umfang vielleicht nicht ausufern zu lassen, würde ich für jede unterseite, wie zum Beispiel Gästebuch oder Home, in den entsprechenden Verzeichnissen eine "Steuerdatei" hinterlegen. Diese wird dann vom Betrachter direkt aufgerufen, in der das Anzeigeobjekt mit dem entsprechenden Inhalt des Contentbereichs und dem zugehörigen css-Dateilink gefüttert wird.
Darf ich mal ganz doof fragen, was in den Auftritt alles rein soll? So etwas zu planen, muss sich auch ein bischen an dem Funktionsumfang der Seite orientieren..
 
Also, du hast willst Klasse, die den Rohbau der Seite ausgibt. Eine css Datei steuert das Layout, das wird wahrscheinlich auf deinem gesamten Auftritt gleich sein.
Richtig!

Es gibt nur 2 Teile der Page die dynamisch gesteuert werden. Der Content- und der Subnavi-Bereich. Wobei die Subnavi in Abhängigkeit von dem Content arbeitet.

Effektiv habe ich nur 4-7 Seiten die inkludiert werden, denn für diese Seiten wäre es einfach zu übertrieben die Daten aus einer DB zu holen. Der Rest wird komplett mit Daten aus der DB gefüllt und erstellt.

Den Part mit der jeweiligen Steuerdatei habe ich nicht ganz durchblickt. Warum kann ich diese nicht einfach inkludieren lassen? Geht doch am schnellsten, oder nicht? Da auch die Links für diese Seiten in der DB stehen und mit einer Zahl maskiert sind. Home (index.php?id=01), Über mich (index.php?id=05), usw. Die DB brauche ich, da ich mir vielleicht später daraus eine Art Breadcrumb Navi machen will.

Klar darfst du. In die Seite kommen folgende Teilbereich: Home, News, Produkte Hersteller, Finanzierung, Unternehmen, Kontakt, Sitemap.
Wobei der Bereich Produkte komplett durch die DB erstellt wird. Bis auf die Seite, wenn man auf Produkte klickt. Hier wählt der Benutzer dann z.B. Hersteller A, hinter dieser ID ist aber kein Pfad hinterlegt, so startet der Rest des Programms und erstellt, anhand der restlichen Daten in der DB, die Seite.

PUH! :)

Gruß und danke,
Baum
 
Heyo =)

Ich denke halt an der Stelle wie Du, dass man nicht alles in eine Datenbank packen muss, wenn es nicht unbedingt nötig ist. Abstraktion macht immer mehr Arbeit. Aber das nennt man künstlerische Freiheit ;D Ich finde es persönlich schicker, wenn die Seitenstruktur auch über die URI zu erkennen ist und die Parameterliste nicht so ewig lang ist. Mit Suchmaschinenoptimierung kenn ich mich noch nicht so aus; aber ich kann mir vorstellen, dass es dafür vielleicht auch nicht nachteilig ist.
Die Steuerdatei kannst du auch einfach inkludieren. Letzendlich ist es egal, wie du es machst, Von den Überlegungen her finde ich, dass es kein richtig oder falsch gibt. Es gibt nur Vorteile und Nachteile.
Für die Breadcrumbnavigation könntest du auch an der stelle fixe Links in den Steuerdateien hinterlegen, Bei 4-7 Seiten fände ich es zu viel Aufwand, das ganze über die DB zu machen. Wenn du Deine Produkte hierarchisch sortierst, wäre da allerdings der Ansatz gut, die BC-Navigation zur Navigation zwischen den Produkten mit Inhalten aus der DB zu ergänzen. Ich bin gespannt, wie es bei Deinem Projekt weiter geht! =o)
Mir fällt gerade auf, dass unser Inhalt der Diskusion mit der Themenüberschrift gar nix mehr zu tun hat :D

Wünsch dir noch nen netten Samstag Abend, ich geh jetzt feiern ^^

Lass es krachen

-softi
 
Aso, Nachtrag! Ein Tip für deine Datenbankklasse hab ich noch, der fällt unter das Thema Entwurfsmuster ;)
Wenn Du die Datenbankklasse als Singleton aufbaust, teilen sich alle Datenbankabfragen in einem Seitenaufruf eine Datenbankverbindung:
PHP:
class db_connector
{
.
.
.
  private static INSTANCE = false; //Beim erstellen des Objektes wird hier der Handle   gespeichert;  statisch angelegte Variablen werden auf Klassenebene angelegt und jede Instanz der Klasse, also alle Objekte von db_connector, greifen auf den selben Wert zu

  private function __construct(); //Der Konstruktor wird nach aussen hin versteckt

  public static function instance() //Die neue Funktion, mit der wir das Objekt erstellen, ist die Funktion instance().  Es wird genau einmal das Objekt erzeugt, und immer wenn du in deinem code die Funktion instance() aufrufst, wird dir der gleiche Handle zurückgegeben
  {
    if (!db_connector::$INSTANCE)
    {
      db_connector::$INSTANCE = new db_connector();
    }
    return self::$INSTANCE;
  }
}
Bis denne!

-softi
 
Guten morgen,

ich denke da nicht nur an Abstraktion, wenn ich nicht alles in die DB packe, sondern auch an Performance.
In punkto Suchmaschinenoptimierung hast du wohl recht, werde ich vielleicht mit mod_rewrite wieder ändern.
Hast du absolut recht, da wirklich nur 4-7 Seiten statistisch sind, die restlichen +100 aber dynamisch sind, kommen diese 4-7 sicherlich ned in die DB, da hat dann später genug zu tun!
Für die BC-Navi habe ich schon entsprechende Spalten in der DB definiert, d.h. ich kann sie mir ohne weitere Probleme einfach mit der erstellten Seite ausgeben lassen.

Danke für den schönen Abend, hoffe deiner war auch gut! Also wir haben’s Krachen lassen, … aber richtig! ;) Und du?


Zum Nachtrag:
Mit Singletons kenn ich mich irgendwie noch gar ned aus, deswegen sagt mir dein Bsp. leider nicht so wirklich viel. Habe auch schon bissi drüber gelesen, aber irgendwie hat mich das nicht weiter gebracht!


Grüße,
Daniel
 
Zuletzt bearbeitet:
Zurück