Autor Zpráva
Cpk
Profil
Pekný den prajem

Potreboval by som poradiť ohľadne dedičnosti.

mam triedu databaza :

class databaza{

	protected $mysqli;
	private $instance = 0;
  private $pom  = 0 ;

	function __construct(){
          if($this->instance === 0){
              $this->mysqli = @new mysqli(DB_HOST, DB_LOGIN, DB_PASS, DB_NAME , 3306);
              if (mysqli_connect_errno()) {
                echo "DATABASE ERROR, try it leater please.";
                exit();
                }
              if (!$this->mysqli->query("set names 'utf8'")){
                echo "DATABASE ERROR, try it leater please.";
                exit();
              }
              $this->instance = 1;
          }else{
            die('Duplicate conntection to database, close the existing instance.');
          }
  }

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// singlton
public function getConn() {
      if($this->instance === 1){
          return self::$mysqli;
      }
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public function user_exist($login_name){

      $login_name = $this->ClearData($login_name);
  if ($result = $this->mysqli->query("SELECT `login` FROM `uzivatel` WHERE `login`='$login_name' AND `aktivny`=true LIMIT 1")) {        
      $count = $result->num_rows;
      $result->close();     
  }
  return $count;
}

}


a triedu uzivatel:

class uzivatel extends databaza{

private $login_name;
private $login_pass;
protected $mysqli;

/*
function __construct(){
  $this->mysqli = parent::getConn() ;
}   
*/
 public function prihlasenie($conn){
 
  $login_name = $this->ochrana($_POST['meno']);
  $login_pass = md5($this->ochrana($_POST['heslo']));
  
  $return = $conn->user_exist($login_name);
  ...
  ...
  }


môj problem je nasledovný:

Chcel by som metodu z user_exist celú presunúť do triedy uzivatel, a znej sa dotazovat na databazu, len problem je vtom ze ked predám vytovrené spojenie pomocou metody getConn, tak to nefunguje. Dufam, že som to dobre napisal a pochopíte ma.

Ďakujem za rady.
Mastodont
Profil
Zásadní problém je v tom, že odvozovat uživatele od databáze je blbost. Uživatel je člověk, ne databáze.
Nox
Profil
Hlavně mi přijde dost podivné aby uživatel měl za předka databázi, když to spolu nijak nesouvisí.... přístup k databázi pro třídu uživatel můžeš zajistit např. pomocí proměnné která bude obsahovat "instanci" třídy databaza a pracovat pomocí dependency injection

Píši instanci v uvozovkách, protože PHPčko to stejně má v datech jako jeden objekt (důkladně ozkoušeno, jinak viz třeba kvalitní články od Davida Grudla)
AM_
Profil
Cpk:
if($this->instance === 0){
Při volání konstuktoru bude $this->instance vždycky nula.

// singlton
public function getConn() {
if($this->instance === 1){
Tady to bude zase vždycky jedna. Navíc to není statická metoda, se singleton to nemá nic společného.

Ten kód je takové plácání páté přes deváté, ze kterého vyzařuje nepochopení OOP jak po technické stránce (viz chyby výše), tak po stránce filosofické (dědit uživatele od databáze).
Tvorba vlastní třídy pro databázi je obvyklou chybou začátečníků, kteří v domění, že cosi zjednodušují, jen přidají do programu pár logických rozporů. Ano, existují třídy pro práci s databází, ale jsou to spíš rozsáhlejší projekty jako třeba dibi nebo doctrine.

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: