Autor Zpráva
Radovan789
Profil *
Zdravím,
zkoušel jsem jsi udělat vlastní třídu (OOP) pro práci s databází, čerpal jsem podle různých zdrojů a nakonec mi stejně script nefunguje, respektive si myslím že chyba bude u var $global_link; ale nejsem si jistý, budu velmi rád za vaše rady.

class Db {
    var $global_link;

    public function connect($host, $user, $password, $database_name) {
        $link = mysql_connect($host,$user,$password) or die("<b>Nelze se připojit k MySQL:</b> " . mysql_error());
        mysql_select_db($database_name) or die("<b>Nelze vybrat databázi:</b> ". mysql_error());
        mysql_query("set names utf8");
        $this->global_link = $link;
    }

    public function close() {
        return mysql_close($this->global_link);
    }

    public function query($command) {
        return mysql_query($command, $this->global_link) or die('<b>MySQL chyba:</b> '.mysql_error());
    }

    public function fetch($command) {
        return mysql_fetch_array($command);
    }
    
    public function count($command) {
        return mysql_num_rows($command);
    }
}

$db = new Db;
$db->connect("localhost","root","root","remeslnici");
$obory = $db->query("SELECT * FROM remeslo_obory");
$obory_array = $db->fetch($obory);
echo $obory_array[0];
$db->close();


Chybová hláška:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in D:\www\remeslnici\include\connect.php on line 21

Podobná chybová hláška naskočí pokuď se snažím o mysql_num_rows

Chybové hlášce rozumím, jenom bych potřeboval vědět jak ten $global_link můžu "globalizovat" a použít ve funkcích ve třídě.

Díky za rady.
radvis
Profil
Globalizovat tak zkus global $global_link ?:)
Radovan789
Profil *
Ne, ve tříde lze použít jen var, public, protected a private.
ShiraNai7
Profil
Proste funkce mysql_fetch_array() dostala misto resource boolean, duvodu muze byt spousta.
A nepouzivej var - to je zastaralý PHP4 ekvivalent pro public.
Radovan789
Profil *
ShiraNai7:
Ano už jsem si to změnil, chceš tedy říct že nikdo nedokáže rospoznat chybu ?
panther
Profil
Radovan789:
chceš tedy říct že nikdo nedokáže rospoznat chybu ?
ale však je rozpoznána - „Proste funkce mysql_fetch_array() dostala misto resource boolean, duvodu muze byt spousta.“.

Hlavní důvody mohou být v podstatě dva:
- chyba v SQL dotazu
- chyba v připojení k DB

Více by napověděl mysql_error().
ShiraNai7
Profil
Už to mám.. problém je v této funkci:

    public function query($command) {
        return mysql_query($command, $this->global_link) or die('<b>MySQL chyba:</b> '.mysql_error());
    }


A to v tom, že nevracíš výsledek funkce mysql_query() nýbrž výsledek logické operace mysql_query() or die() .. což je true když mysql_query neselže.
Vypisování chyb tímto způsoben je podle mě hodně špatný a neprůhledný způsob. Takže to změň na toto:

    public function query($command) {
        $query = mysql_query($command, $this->global_link);
        if($query === false) die('<b>MySQL chyba:</b> '.mysql_error());
        return $query;
    }
Radovan789
Profil *
ShiraNai7:
Mockrát děkuji !

A měl bych dotaz ktomu jestli to moje OOP je správné nebo by to šlo nějakým spůsobem zjednodušit. Jenom stačí říct že to je vpohodě a jestli ne tak třeba napsat co by bylo lepší.
ShiraNai7
Profil
No tato třída prakticky jen zapouzdří resource připojení k mysql (ten $global_link by mohl být i private) a poskytuje přístup k základním funkcím.

1) asi bych předělal funkci connect na konkstruktor (__construct), aby se připojení vytvářelo už při tvorbě objektu - connect() voláš stejně jen jednou pro jeden objekt
2) $db->close() je celkem zbytečné, to by se mohlo opět implementovat jako destruktor (__destruct) ale spíš bych to úplně vypustil, záleží jestli to potřebuješ aktivně využívat
Radovan789
Profil *
Díky za rady, mě by to asi jen tak nenapadlo, fakt díky.

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