Autor | Zpráva | ||
---|---|---|---|
Radovan789 Profil * |
#1 · Zasláno: 11. 10. 2010, 16:38:30
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 |
#2 · Zasláno: 11. 10. 2010, 16:43:26
Globalizovat tak zkus global $global_link ?:)
|
||
Radovan789 Profil * |
#3 · Zasláno: 11. 10. 2010, 16:51:18
Ne, ve tříde lze použít jen var, public, protected a private.
|
||
ShiraNai7 Profil |
#4 · Zasláno: 11. 10. 2010, 17:08:54
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 * |
#5 · Zasláno: 11. 10. 2010, 17:10:42
ShiraNai7:
Ano už jsem si to změnil, chceš tedy říct že nikdo nedokáže rospoznat chybu ? |
||
panther Profil |
#6 · Zasláno: 11. 10. 2010, 17:15:00
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 |
#7 · Zasláno: 11. 10. 2010, 17:17:19
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 * |
#8 · Zasláno: 11. 10. 2010, 17:21:05
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 |
#9 · Zasláno: 11. 10. 2010, 17:27:30
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 * |
#10 · Zasláno: 11. 10. 2010, 17:29:26
Díky za rady, mě by to asi jen tak nenapadlo, fakt díky.
|
||
Časová prodleva: 14 let
|
0