Autor Zpráva
Jiří Ráb
Profil
Ahoj mám třádu uživatel a v ní funkce a potrebuji zda se dá nejak udělat aby funkce pokud chce dostat data z databaze nemuselo byt v kazdé funkci require_once('connect.php'); ale bylo to jak mám public proměné a mohu je využít v každé funkcí posílám kod
<?php

class Uzivatel
{
    public $id;
    public $username;
    public $pravo;
    public $id_adresa;

    public function __construct($id, $username, $pravo, $id_adresa)
    {
        $this->id=$id;
        $this->username=$username;
        $this->pravo=$pravo;
        $this->id_adresa=$id_adresa;
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getPravo()
    {
        return $this->pravo;
    }

    public function getAdresa()
    {
        require_once('connect.php');
        $adresa="SELECT ulice,cp,mesto,psc FROM adresa WHERE id_adresa=:id_adresa";
        $dotaz=$connect->prepare($adresa);
        $dotaz->bindParam(':id_adresa', $this->id_adresa);
        if ($dotaz->execute()) {
            $data=$dotaz->fetch(PDO::FETCH_ASSOC);
            echo '<p>Ulice a čp : <a>'.$data['ulice']." ".$data['cp'].'</a></p>';
            echo '<p>Město : <a>'.$data['mesto'].'</a></p>';
            echo '<p>Poštovní směrovací číslo : <a>'.$data['psc'].'</a></p>';
        } else {
            echo 'Neco se nepovedlo';
        }
    }

    public function vypis_User()
    {
    }
}
Keeehi
Profil
<?php
 
class Uzivatel
{
    public $id;
    public $username;
    public $pravo;
    public $id_adresa;
    public $connection;
 
    public function __construct($id, $username, $pravo, $id_adresa)
    {
        $this->id=$id;
        $this->username=$username;
        $this->pravo=$pravo;
        $this->id_adresa=$id_adresa;
        $this->connection=require('connect.php');
    }
 
    public function getUsername()
    {
        return $this->username;
    }
 
    public function getId()
    {
        return $this->id;
    }
 
    public function getPravo()
    {
        return $this->pravo;
    }
 
    public function getAdresa()
    {
        $adresa="SELECT ulice,cp,mesto,psc FROM adresa WHERE id_adresa=:id_adresa";
        $dotaz=$this->connection->prepare($adresa);
        $dotaz->bindParam(':id_adresa', $this->id_adresa);
        if ($dotaz->execute()) {
            $data=$dotaz->fetch(PDO::FETCH_ASSOC);
            echo '<p>Ulice a čp : <a>'.$data['ulice']." ".$data['cp'].'</a></p>';
            echo '<p>Město : <a>'.$data['mesto'].'</a></p>';
            echo '<p>Poštovní směrovací číslo : <a>'.$data['psc'].'</a></p>';
        } else {
            echo 'Neco se nepovedlo';
        }
    }
 
    public function vypis_User()
    {
    }
}

+ na konec connect.php přidat return $connect;

Ještě bych rád řekl, že toto je naprosto neefektivní a nevhodný způsob, jak to řešit (při každém vytvoření nového objektu se vytvoří nové připojení do databáze). Ovšem ta třída nemá hlavu ani patu, takže se těžko chytat nějaké filozofie. Každý jsme ale nějak začínal.
Jiří Ráb
Profil
Dík za pomoc
Jiří Ráb
Profil
ahoj předelal jsem connect na statickou funkci ve třídě a ted se snažím dostat data z databaze ale nejde mi píše mi to chybu pošlu kod dík za pomoc
<?php

 class DB
   {
   private $username="root";
   private $password="";
   private $server="localhost";
   private $dbname="vyhlidkove_lety";
   

   public static function connect(){
     $connect = NULL;
        if ($connect == NULL) {
            try {
                $connect = new PDO('mysql:host=' . $this->server. ';dbname=' . $this->dbname.';charset=utf8;port=3306',$this->username,$this->password);
                $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                echo 'PDO Error: ' . $e->getMessage();
            }
        }
        return $connect;
    }

   }


 




?>

<?php
require_once('connect.php');

$stm = DB::connect()->prepare('SELECT * FROM lety');
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_ASSOC);
var_dump($res);
?>

Píše chybu
Fatal error: Uncaught Error: Using $this when not in object context in C:\wamp64\www\projekty\connect.php on line 14
( ! ) Error: Using $this when not in object context in C:\wamp64\www\projekty\connect.php on line 14
pcmanik
Profil
Jiří Ráb:
V tomto prípade je vhodné využiť návrhový vzor Singleton. Nebudeš tak vytvárať viacero spojení.
Joker
Profil
Jiří Ráb:
Třída jménem Uzivatel by se v první řadě vůbec neměla připojovat k databázi.
Existuje sada pravidel pro dobrý objektový návrh, zvaná SOLID, kde každé písmeno reprezentuje jedno pravidlo.
Hned to první (S) je Single responsibility principle (princip jedné odpovědnosti): Každý objekt má být odpovědný za jednu konkrétní věc.
Připojování k databázi určitě není odpovědnost objektu Uzivatel.

Analogicky by každá metoda měla dělat jednu konkrétní věc.
Ukázkový příklad může být metoda getAdresa.
Ta dělá alespoň čtyři různé věci: Zařizuje připojení k databázi, čte data, vypisuje na výstup a ještě „řeší“ chyby.
Paradoxně ale nedělá tu jedinou věc, kterou bych od metody jménem getAdresa očekával: Že bude vracet adresu.

Pak je ještě otázka, proč dělat gettery (např. getUsername, getId), když ty atributy jsou stejně public.

Jedna cesta jak to trochu vylepšit by byla předávat závislost zvenku, tj. třídu DB předávat v konstruktoru. Což pořád není ideální, protože v té třídě nepotřebujete databázi, potřebuje to jen na získání adresy a stačilo by mu cokoliv, co umí vrátit adresu.

Pro adresu by měl taky existovat objekt (nevím proč je uživatel ještě objekt, ale u adresy se na to už rezignovalo), asi stačí nějaký přenosový objekt (data transfer object, DTO), který nemá žádnou funkčnost.
Čili bude třída pro adresu s atributy pro id, město, ulici, ČP a PSČ.
Pak tam potřebuji něco, co umí načíst adresu podle ID (a potenciálně možná i ukládat a měnit adresy), dejme tomu nějaké rozhraní IAddressRepository, které bude mít metodu GetById($id) a ta podle ID vrátí odpovídající přenosový objekt adresy.
To rozhraní IAddressRepository bude implementovat nějaký objekt, který může už mít závislost na databázi a vykonávat ty SQL dotazy (protože to je jeho odpovědnost).

Třída Uzivatel by pak měla závislost na tom IAddressRepository (omlouvám se za smíchané české a anglické pojmenování).

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:

0