Autor Zpráva
bestik_63
Profil
Ahoj mám menší problém.
Vytvořil jsem si třídu, která se připojí do databáze a obsahuje metodu na volání SQL příkazů. Jelikož se mi běžně stává, že potřebuji na stránce použít data z více SQL tabulek, které spolu nijak nesouvisí, chtěl jsem postupně volat metodu na volání sql příkazu a abych se neustále nemusel připojovat a odpojovat k databázi, myslel jsem si, že vytvořím jednu instanci třídy Database a pak pouze v případě potřeby budu volat její metodu dotaz(), kde bude SQL příkaz. Tato metoda by mi pak vracela výsledky SQL dotazu. Funguje to báječně, nicméně jsem narazil na problém. Pokud si vytvořím instanci třídy $database = new Database() a vyvolání metody dotaz() spustím v jiné funkci, které předám ukazatel na instanci třídy ($database) tak mi to zahlásí že nezná metodu dotaz() (Fatal error: Call to undefined method PDO::dotaz())
Nevíte co dělám špatně? Sice to vyřeším lehce tím, že SQL dotazy nebudu volat v další funkci, ale kdyby to šlo, tak by mi to usnadnilo život a zkrátilo kód :-)

Pro lepší pochopení ještě pošlu ořezaný kód

class Database {
    public $spojeni;
    public function __construct($ip = null){
        $user = "xxx";
        $password = "xxx";
        $database = "test";
        $this->spojeni = @new PDO("mysql:host=$ip;dbname=$database;charset=utf8",$user,$password);
        $this->spojeni->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->spojeni->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }    
    public function dotaz($dotaz, $parametry = array()) {
        $result = $this->spojeni->prepare($dotaz);
        $result->execute($parametry);            
        $data = $result->fetchAll(PDO::FETCH_NUM);
    }    
}
class DochazkaKontroler extends Kontroler
{
        public function vypis_tabulky($database)
        {
                $result = $database->dotaz('SQL dotaz'); //toto vyhodí chybu Fatal error: Call to undefined method PDO::dotaz()
        }
        public function zpracuj()
        {
                $database = new Database;
                $result = $database->dotaz('SQL dotaz');    //funguje báječně
                $this->vypis_tabulky($database);                  //nefunguje
        }
       
}
breeta
Profil
Zdar asi chceš vytvořit něco jako je NotORM mrkni tam do kodu jak je to řešeno

Nebo případně Nette/database
Keeehi
Profil
S referencí to funguje?
public function vypis_tabulky(Database &$database)

A jelikož je to v rámci jedné třídy, tak druhá možnost je to uložit třeba jako private atribut té třídy.
aDAm
Profil
Zřejmě si tam tu instaci předáš blbě když to volá na objektu PDO a né Database. Proč si v tom Kontroleru neuděláš konstruktor který bude vyžadovat instanci objektu Database ?

Předávat to referenci je pěkně fuj.
Alphard
Profil
Doplním, že kód v [#1] bestik_63 je v zásadě funkční, chybí třeba return v metodě dotaz(), ale reference na instanci Database se předává správně.
bestik_63
Profil
ahoj, všem se moc omlouvám, toto řešení je funkční pro oba způsoby použití třídy Database :-) . Jen jsem se tam původně upsal.

return je v metodě dotaz() použit, jen jsem kód ořezal, abyste nemuseli přelouskávát zbytečné kód, který není důležitý :-)

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: