PHP OOP Probleme

SkyDevMent

Erfahrenes Mitglied
Hallo,
ich bin relativ neu hier bei tutorials.de und wollte deshalb erstmal Guten Tag sagen und mich herzlich bedanken.
Vielleichz zum Anfange etwas übermich und eine Kenntniss im bereich PHP:
Also generell habe ich, so würde ich mich einschätzen ein gutes Wissen was die PHP Programierung angeht, allerdings bin ich im Bereich OOP bei PHP relativ neu un bräuchte deshalb vielleicht etwas hilfe bei einigen Problemen die in meiner Implementierung auftreten.

Mein Problem ist ich habe eine Haupt- und 2 Subclasse, in der Hauptclass rufe ich Methoden aus der Subclass nach diesem Muster auf:
className::MethodenName; das Funktioniert auch alles wunderbar, aber wenn ich mir mit
PHP:
error_reporting(-1);
ini_set("html_errors", 1);
Alle Fehler anzeigen lasse bekomme ich einige Strict Standard Fehler, die für mich undurchsichtig sind.
Ich weiß zwar das diese "Fehler" nicht gravierend sind, aber ich möchte sie los weden weil ich nicht einschätzen kann ob sie mal zu einem Richtigen Problem werden können, deshalb Poste ich hier einmal meinen Code und die daraus Resultierenden Fehlermeldungen.

Ich hoffe ihr könnt mir weiter helfen.

PHP:
error_reporting(-1);
ini_set("html_errors", 1);

class termine
{
	public function __construct()
	{
		session_start();
		database::makeConnection("cms_main_db");
		if(self::verifySession())
		{
			self::showAllTermine();
			if($_POST['ADD'])
			{
				self::addNewTermin();
			}
		}
		else
		{
			if(login::doLogin())
			{
				self::setSession();
				self::showAllTermine();
			}
			else
			{
				login::getUserInfos();
				login::saveWrongLoginDataInDatabase();
				return false;
			}
		}
	}

	
	private function showAllTermine()
	{
		$terminArray = database::mysqlBigData("Select * From Termine order by Datum ASC","ID");
		$outPut = "<ul>";
		date_default_timezone_set('Europe/Berlin');
		$today = strtotime(date("d-m-Y",time()));
						
		foreach($terminArray as $termin)
		{
			if($today < $termin['Datum'])
			{
				$outPut .= "<li>".$termin['Name']."</li>";
			}
		}
		echo $outPut;
	}
	
	private function addNewTermin()
	{
		
	}
	private function setSession()
	{
		$_SESSION['SitePass'] = true;
	} 
	private function verifySession()
	{
		if($_SESSION['SitePass'] === true)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

class database extends termine
{
	/* Variablen für den Internen Gebrauch*/
	const host = "*****";
	const user = "****";
	const pssw = "******";
	public $connection;

	protected function makeConnection($db)
	{
		$this->connection =	mysql_connect(self::host,self::user,self::pssw);
		mysql_select_db($db);
	}
	
	public function __destruct()
	{
		mysql_close($this->connection);
	}
	
	public function mysqlResultAsArray($query)
	{
		$tmpResult = mysql_query($query);
		$tmpArray  = mysql_fetch_array($tmpResult);
		return $tmpArray;
	}
	public function mysqlBigData($query,$index)
	{
		$tmpResult = mysql_query($query);
		$array = array();
		while($row = mysql_fetch_assoc($tmpResult))
		{
			$array[$row[$index]] = $row;
		}
		return $array;
	}
	public function mysqlResultAsAssoc($query)
	{
		$tmpResult = mysql_query($query);
		$tmpArray  = mysql_fetch_assoc($tmpResult);
		return $tmpArray;
	}
	public function mysqlResultAsObject($query)
	{
		$tmpResult = mysql_query($query);
		$tmpObject  = mysql_fetch_object($tmpResult);
		return $tmpObject;
	}
}

class login extends termine
{
	/* Variablen für den Internen Gebrauch*/
	private $username;
	private $passwort;
	private $dataBaseHash;
	private $userID;
	private $sucsess;
	private $uncryptPW;
	
	/*Varieblen für Speicherung*/
	private $UserOsName;
	private $UserOsVersion;	
	private $UserBrowser;
	private $ScriptSelfLocation;
	private $ClientIP;
		
	public function doLogin()
	{
		self::getTheUserDataAndStoreIt();
		self::getUserDataFromDatabase();
		self::verifyTheUser();	
		if($this->sucsess === true)
		{
			return true;
		}
		else
		{
			return false;
			
		}
	}
	
	private function verifyTheUser()
	{
		if($this->passwort == $this->dataBaseHash) $this->sucsess = true;
		else  $this->sucsess = false;
		return true;
	} 
	
	private function getTheUserDataAndStoreIt()
	{
		$this->username = $_GET['usr'];
		$this->uncryptPW = $_GET['pssw'];
		$this->passwort = self::cryptTheUserPasswort($_GET['pssw']);
		return true;
	}
	
	private function cryptTheUserPasswort($passwort)
	{
		$passwort = hash('sha512',$passwort);
		return $passwort;
	}
	
	private function getUserDataFromDatabase()
	{
 		 $UserData = database::mysqlResultAsObject("Select Passwort,ID From user where Name='".$this->username."'"); 
		 $this->dataBaseHash =  $UserData->Passwort;
		 $this->userID		 =  $UserData->ID;
		 return true;
	}
	
	public function getUserInfos()
	{
		$this->ScriptSelfLocation = $_SERVER["SCRIPT_FILENAME"];
		if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 	$this->ClientIP = $_SERVER['REMOTE_ADDR'];
		else 											$this->ClientIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
		
		$user_infos  	= $_SERVER['HTTP_USER_AGENT']; 
		$result2 	= explode("(",$user_infos);
		$result3	= explode(")",$result2[1]);
		$osRow 		= explode(";",$result3[0]);
		$result4 	= explode(" ",$result3[1]);
		
		$this->UserOsName 		= $osRow[0];
		$this->UserOsVersion	= $osRow[1];		
		$this->UserBrowser		= $result4[2];

	}

	public function saveWrongLoginDataInDatabase()
	{
		$sql = "INSERT INTO login_failed (name, passwort, ip, os, browser, location, date_time) 
		values('".$this->username."', '".$this->passwort."', '".$this->ClientIP."', '".$this->UserOsName." - ".$this->UserOsVersion."', '".$this->UserBrowser."','".$this->ScriptSelfLocation."', NOW())";
		mysql_query($sql);
	}

	
}

$termine = new termine();

Code:
Strict Standards: Non-static method database::makeConnection() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 10

Notice: Undefined index: SitePass in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 63

Strict Standards: Non-static method login::doLogin() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 21

Strict Standards: Non-static method login::getTheUserDataAndStoreIt() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 141

Notice: Undefined index: usr in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 164

Strict Standards: Non-static method login::cryptTheUserPasswort() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 165

Notice: Undefined index: pssw in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 165

Strict Standards: Non-static method login::getUserDataFromDatabase() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 142

Strict Standards: Non-static method database::mysqlResultAsObject() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 177

Notice: Trying to get property of non-object in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 178

Notice: Trying to get property of non-object in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 179

Strict Standards: Non-static method login::verifyTheUser() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 143

Strict Standards: Non-static method login::getUserInfos() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 28

Strict Standards: Non-static method login::saveWrongLoginDataInDatabase() should not be called statically, assuming $this from incompatible context in /var/www/vhosts/sky-lab.de/podo/termine/classes.php on line 29
PS: Natürlich weiß ich das mann sowohl den Usernamen als auch das Passwort nicht per GET Übergibt, da diese Datei aber nur zu Testzwecken bei mir lokal eingesetzt wird, sollte das kein Problem sein.
 
Hallo,

erst mal finde ich sehr gut, dass du die Fehler wegbekommen möchtest. Vielen Leuten sind solche Fehler einfach egal!

Das Problem mit deinem Code ist, dass du die Methoden statisch (also mit ::, anstatt mit ->) aufrufst.
Auf eigene Eigenschaften oder Methoden innerhalb eines Objekts greifst du mit -> zu.

Wenn die Methode als static deklariert wurde, musst du sie von überall mittels :: aufrufen.

Im Prinzip musst du jetzt bei deinem Code alle self::[funcName]() durch $this->funcName() ersetzen.
 
Erstmal vielen Dank für deine rasche Antwort, leider sehe ich da ein Problem, wenn ich in der class termine alle Methoden von self oder den Class namen auf this umstelle bekomme ich mehrere Fatal Errors weil die Methoden nicht vorhanden sind, da meiner Meinung nach $this ja nur ein Pointer auf das Object ist in dem Man sich befindet, da aber z.B. die Methode doLogin() in einer Subcalss ist kann sie doch nicht über $this->doLogin() aufgerufen werden oder?
 
Der ist schon mit drinn, da ich ja mit einem __construct() arbeite brauche ich nur einen aufruf und der ist ganz unter in der letzten Zeile meines Codes
 
Sorry, hatte nicht hingeschaut ;)
Kannst du mal den aktuellen Code posten und die genauen Fehler (inkl. Zeilennummern)?
 
Noch habe ich keine änderungen am Code vorgenommen. Aber ich kann dir den gerne noch mal schicken.

PHP:
<?php
error_reporting(-1);
ini_set("html_errors", 1);

class termine
{
	public function __construct()
	{
		session_start();
		database::makeConnection("cms_main_db");
		if(self::verifySession())
		{
			self::showAllTermine();
			if($_POST['ADD'])
			{
				self::addNewTermin();
			}
		}
		else
		{
			if(login::doLogin())
			{
				self::setSession();
				self::showAllTermine();
			}
			else
			{
				login::getUserInfos();
				login::saveWrongLoginDataInDatabase();
				return false;
			}
		}
	}

	
	private function showAllTermine()
	{
		$terminArray = database::mysqlBigData("Select * From Termine order by Datum ASC","ID");
		$outPut = "<ul>";
		date_default_timezone_set('Europe/Berlin');
		$today = strtotime(date("d-m-Y",time()));
						
		foreach($terminArray as $termin)
		{
			if($today < $termin['Datum'])
			{
				$outPut .= "<li>".$termin['Name']."</li>";
			}
		}
		echo $outPut;
	}
	
	private function addNewTermin()
	{
		
	}
	private function setSession()
	{
		$_SESSION['SitePass'] = true;
	} 
	private function verifySession()
	{
		if($_SESSION['SitePass'] === true)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

class database extends termine
{
	/* Variablen für den Internen Gebrauch*/
	const host = "localhost";
	const user = "cms";
	const pssw = "0okmju7";
	public $connection;

	protected function makeConnection($db)
	{
		$this->connection =	mysql_connect(self::host,self::user,self::pssw);
		mysql_select_db($db);
	}
	
	public function __destruct()
	{
		mysql_close($this->connection);
	}
	
	public function mysqlResultAsArray($query)
	{
		$tmpResult = mysql_query($query);
		$tmpArray  = mysql_fetch_array($tmpResult);
		return $tmpArray;
	}
	public function mysqlBigData($query,$index)
	{
		$tmpResult = mysql_query($query);
		$array = array();
		while($row = mysql_fetch_assoc($tmpResult))
		{
			$array[$row[$index]] = $row;
		}
		return $array;
	}
	public function mysqlResultAsAssoc($query)
	{
		$tmpResult = mysql_query($query);
		$tmpArray  = mysql_fetch_assoc($tmpResult);
		return $tmpArray;
	}
	public function mysqlResultAsObject($query)
	{
		$tmpResult = mysql_query($query);
		$tmpObject  = mysql_fetch_object($tmpResult);
		return $tmpObject;
	}
}

class login extends termine
{
	/* Variablen für den Internen Gebrauch*/
	private $username;
	private $passwort;
	private $dataBaseHash;
	private $userID;
	private $sucsess;
	private $uncryptPW;
	
	/*Variablen für Speicherung*/
	private $UserOsName;
	private $UserOsVersion;	
	private $UserBrowser;
	private $ScriptSelfLocation;
	private $ClientIP;
		
	public function doLogin()
	{
		self::getTheUserDataAndStoreIt();
		self::getUserDataFromDatabase();
		self::verifyTheUser();	
		if($this->sucsess === true)
		{
			return true;
		}
		else
		{
			return false;
			
		}
	}
	
	private function verifyTheUser()
	{
		if($this->passwort == $this->dataBaseHash) $this->sucsess = true;
		else  $this->sucsess = false;
		return true;
	} 
	
	private function getTheUserDataAndStoreIt()
	{
		$this->username = $_GET['usr'];
		$this->uncryptPW = $_GET['pssw'];
		$this->passwort = self::cryptTheUserPasswort($_GET['pssw']);
		return true;
	}
	
	private function cryptTheUserPasswort($passwort)
	{
		$passwort = hash('sha512',$passwort);
		return $passwort;
	}
	
	private function getUserDataFromDatabase()
	{
 		 $UserData = database::mysqlResultAsObject("Select Passwort,ID From user where Name='".$this->username."'"); 
		 $this->dataBaseHash =  $UserData->Passwort;
		 $this->userID		 =  $UserData->ID;
		 return true;
	}
	
	public function getUserInfos()
	{
		$this->ScriptSelfLocation = $_SERVER["SCRIPT_FILENAME"];
		if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 	$this->ClientIP = $_SERVER['REMOTE_ADDR'];
		else 											$this->ClientIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
		
		$user_infos  	= $_SERVER['HTTP_USER_AGENT']; 
		$result2 	= explode("(",$user_infos);
		$result3	= explode(")",$result2[1]);
		$osRow 		= explode(";",$result3[0]);
		$result4 	= explode(" ",$result3[1]);
		
		$this->UserOsName 		= $osRow[0];
		$this->UserOsVersion	= $osRow[1];		
		$this->UserBrowser		= $result4[2];

	}

	public function saveWrongLoginDataInDatabase()
	{
		$sql = "INSERT INTO login_failed (name, passwort, ip, os, browser, location, date_time) 
		values('".$this->username."', '".$this->passwort."', '".$this->ClientIP."', '".$this->UserOsName." - ".$this->UserOsVersion."', '".$this->UserBrowser."','".$this->ScriptSelfLocation."', NOW())";
		mysql_query($sql);
	}

	
}

$termine = new termine();

?>
 
Ich dachte, du hättest alle self:: durch $this-> ersetzt?

Allerdings gibt es da noch ein Problem:

Du greifst von termine aus auf die Methoden der Klasse database zu.

Das ist an sich kein Problem, solange du nur Objekte der Klasse database instanzierst.
Sobald du aber nur ein termine-Obnjekt erstellt (welches du in der letzten Zeile machst), kommt es zu den Fatal Errors!
 
Nein self habe ich nicht durch $this-> ersetzt, weil ich mir unsicher war.
Das heißt für die lösung meines Problem füge ich einfach die isntanzierung ind meine construct methode ein und schon wars das?
 
Zuletzt bearbeitet:
Was für eine construct-Klasse?

Das Problem ist deine OOP-Hierachie. Wieso z.B. soll eine Datenbank-Klasse von einer Termin-Klasse erben?
Andersrum würde ich es auch nicht schreiben, sondern ich würde in der Termin-Klasse ein DB-Objekt erwarten.
PHP:
class Termine {
  private $db;
  public function __construct($db) {
    $this->db = $db;
  }
}

class Database {
  // Verbinden, SQL-Query ausführen, ...
}

$db = new Database('localhost', 'user', 'pw', 'table');
$termine = new Termine($db);
 
Zurück