Autor Zpráva
Dušan
Profil *
Dobrý den, chtěl bych se zeptat na jednu več ohledně mého kódu, možná to bude blbost ale nějak jsem si s tím už nevěděl rady.
Mám třídu DatabaseConnector, která pomocí metody spojit() vrací zpět hadler databázového připojení a novou třídu LogIn, která by měla dědit původní třídu DatabaseConnector. Puvodní třída je bez problému, ale když chci v nové třídě nadstavirt databazi php vyhodí chybu: mysql_select_db(): supplied argument is not a valid MySQL-Link resource

class LogIn extends DatabaseConnector	{
	
	private	$email;
	private $tabulka;
	private $heslo;
	private $handler;
	
	public function __constuct($tab,$mail,$heslo)	{
		$this->email	= htmlspecialchars($mail);
		$this->tabulka	= htmlspecialchars($tab);
		$this->heslo	= htmlspecialchars($heslo);
		$this->handler	= parent::spojit();						// az to bude fungovat tak bude parent::spojit();
	}

	public function checkDatabase($database)	{
		
		if(mysql_select_db($database,$handler) == FALSE)	{
			ErrorMessage::errConnection(sprintf("Nelze nadstavit databazi"));
		}
	}
}


Nechce mi to přiřadit handler... prosím pomozte kdo by měl nápad. Předem děkuji
Vojtěch Zicha
Profil *
Místo $handler tam dej $this->handler
Dušan
Profil *
jinak ta chyba ze je zde __constuct misto __construct je opravena a nejde to stale
Mastodont
Profil
-- edit: pozdě
BetaCam
Profil
Takovej OT:

Co má třída LogIn společného s třídou DatabaseConnector, že z ní děláš potomka??
Dušan
Profil *
potrebuje handler na pripojeni k databazi. a dal na ni bude navazovat. nimene i kdyz jsem odstranil dedicnost a dal:

$this->handler	= DatabaseConnector:spojit();	


Tak to neslo
BetaCam
Profil
$this->handler = DatabaseConnector:spojit();

Tohle je blbost.

Pokud je ta metoda statická musíš jí volat

$this->handler	= DatabaseConnector::spojit();


Pokud je instanční tak bude třída DatabaseConnector s největší pravděpodobností Singleton. Takže si zavoláš Factory metodu a handler si zjistíš z vrácené instance. Tedy něco jako.

$DBConnector = DatabaseConnector::getInstance();
$this->handler  =  $DBConnector->spojit();


Pokud ta třída nemá stou druhou nic společného je podle mě lepší je složit než využívat dědičnosti, ale to je pouze můj názor.
Dušan
Profil *
jestě se zeptám tak trochu hloupě. tak metoda getInstance() je definovana php ? protože mi to píše, že není definována.
Mastodont
Profil
Ne, není.
Dušan
Profil *
metoda spojit v třídě DatabaseConnector je instancni, avšak jak nahradit tento řádek
$DBConnector = DatabaseConnector::getInstance();
to getInstance()
BetaCam
Profil
jestě se zeptám tak trochu hloupě. tak metoda getInstance() je definovana php ? protože mi to píše, že není definována.

Neni. Otázka je jak máš definovanou třídu DatabaseConnector. Máš jí definovanou jako Singleton a nebo ji máš definovanou jako třídu s možností více instancí??
Dušan
Profil *
trida je zde:
class DatabaseConnector	{

	const	UZIVATELSKEJMENO	=	"***";
	const	HOST				=	"***";
	const	HESLO				=	"****";
	
	public function spojit()	{
		$spojeni	=	$this->vytvoritDbSpojeni();
		$this->ukazDbSpojeni($spojeni);
		return $dbSpojeni;
	}
	protected function vytvoritDbSpojeni()	{
		if(!($link = mysql_pconnect(self::HOST, self::UZIVATELSKEJMENO, self::HESLO)))	{
			ErrorMessage::errConnection(sprintf("Chyba pripojeni k databazi pro uzivatele %s k hostiteli %s",self::UZIVATELSKEJMENO,self::HOST));
			exit();
		}
		else	{
			return $link;
		}
	}
	private function ukazDbSpojeni($spojeni)	{
		$this->dbSpojeni = $spojeni;
	}
		
	private $dbSpojeni;
}
BetaCam
Profil
Dušan
$DBConnector = DatabaseConnector::getInstance();

Pokud máš třídu DatabaseConnector nadefinovanou jako třídu která může mít více instancí můžes ten řádek nahradit tímto:

$DBConnector = new DatabaseConnector();

Otázka ovšem je jestli opravdu zrovna u třídy pro připojení k DB je nutné mít více instancí.
Dušan
Profil *
tohle neresi situaci to vytvoreni v konstruktoru jsem take zkousel a výsledek je stejný.
Mastodont
Profil
	public function spojit()	{
		$spojeni	=	$this->vytvoritDbSpojeni();
		$this->ukazDbSpojeni($spojeni);
		return $dbSpojeni;
	}

	}
	private function ukazDbSpojeni($spojeni)	{
		$this->dbSpojeni = $spojeni;
	}


To jsem nepochopil. Proč ne prostě

	public function spojit()	{
		return $this->vytvoritDbSpojeni();
	}
Dušan
Profil *
Mastodont Tohle ted neresme je to pripavene pro dalsi upgrade. Vazne jsem uz zkousel skoro vsechyn moznosti. od dedicnosti po předávaní při vytvoření v konstruktoru. normálně nemám vůbec problémy ale tohle mi vážně nejde. Až se stydím za svou pitomost.
BetaCam
Profil
Mastodont

Přesně ta třída je opravdu navržena dost divoce.
Mastodont
Profil
Dušan
Když jsem opravil to construct a $this->handler, a dále jsem změnil jednu metodu na

	public function spojit()	{
		$spojeni	=	$this->vytvoritDbSpojeni();
		$this->ukazDbSpojeni($spojeni);
		return $this->dbSpojeni;
	}


tak mi to žádnou chybu nehází.
Dušan
Profil *
Tak jsme to upravil a už vím kde je chyba. nastavení modifikatoru pristupu. Jsem to rikal ze jsem byl blbec ... chlapi děkuji, vážím si vaší pomoci.
BetaCam
Profil
Dušan
Vazne jsem uz zkousel skoro vsechyn moznosti. od dedicnosti po předávaní při vytvoření v konstruktoru. normálně nemám vůbec problémy ale tohle mi vážně nejde. Až se stydím za svou pitomost.

Tak to vemem jinak hází ti to nějakou chybu?? Co přesně od té třídy chceš.(myslim i do budoucna)
BetaCam
Profil
Dušan
Tak jsme to upravil a už vím kde je chyba. nastavení modifikatoru pristupu.

Uf ale byla to drina :)
Dušan
Profil *
Jo byla, ale přesto si vážím, že jste mi pomohli. Málo kde se vidí, že jsou lidi ochotní. Takže jen chci říct, smekám...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: