Autor | Zpráva | ||
---|---|---|---|
Mufna Profil |
#1 · Zasláno: 26. 8. 2009, 16:06:05
Zdravím Vás. Mám třídu pro práci s databází, její součástí je:
public function query($query) { $conn = $this->getConnection(); return mysql_query($query, $conn); } Pak mám PHP soubor s login formulářem a dotaz na DB s vrácením výsledku: $res = Database::getInstance()->query("SELECT * FROM ".$tbl_prefix."login WHERE passwd=MD5('".addslashes(addslashes($_POST["heslo"]))."')"); 22. if (mysql_num_rows($res)>0) { $row=mysql_fetch_array($res); Hází mi to chybu: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/admin/login.php on line 22 |
||
Aichi Profil |
#2 · Zasláno: 26. 8. 2009, 16:08:41
co ti na to mame odpovedet, proste 4res neni uz odkazem na vysledek. Bud nejsi prihlasen, nebo nemas vybranou databazi, nebo si to nekde pred tim vymazes, hlaska je jasna.
|
||
Mufna Profil |
#3 · Zasláno: 26. 8. 2009, 16:22:53
Aichi
nemas vybranou databazi Je to tímhle (i když ji samozřejmě vybranou mám, ale je tam chyba - mám problém s prefixem, který se definuje v třídě pro databázi, ale dotaz už si ten prefix nevezme, tudíž to skončí chybou, protože název tabulky je tím pádem špatně) Poradíte mi, jak tam mám ten prefix dostat ? Mám konfiguraci definovanou uvnitř třídy pro databázi: protected $_config = array ( 'hostname' => '', 'username' => '', 'password' => '', 'database' => '', 'prefix' => 'tbl_' ); |
||
joe Profil |
#4 · Zasláno: 26. 8. 2009, 16:45:40
Do třídy Database si přidej statickou metodu getPrefix() { return $this->_config['prefix']; }
Dotaz pak bude "SELECT * FROM " . Database::getPrefix() . "... |
||
Mufna Profil |
#5 · Zasláno: 26. 8. 2009, 16:53:48
joe
Díky |
||
Mufna Profil |
#6 · Zasláno: 26. 8. 2009, 17:39:51
Tak ještě mi to hází chybu:
Fatal error: Using $this when not in object context on line 23 class Database { protected static $_instance = null; protected $_conn = null; protected $_config = array( 'hostname' => '', 'username' => '', 'password' => '', 'database' => '', 'prefix' => 'wr_' ); public static function getTablePrefix() { 23. return $this->_config['prefix']; } |
||
fandaa Profil |
#7 · Zasláno: 26. 8. 2009, 17:47:46
Mufna
public static function getTablePrefix() { return self::$_config['prefix']; } |
||
Mufna Profil |
#8 · Zasláno: 26. 8. 2009, 18:02:58
fandaa
Bohužel, zas mi to hodí chybu Fatal error: Access to undeclared static property: Database::$_config on line 23 class Database { protected static $_instance = null; protected $_conn = null; protected $_config = array( 'hostname' => '', 'username' => '', 'password' => '', 'database' => '', 'prefix' => 'wr_' ); protected function __construct() { } public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } public static function getTablePrefix() { 23. return self::$_config['prefix']; } + funkce pro navázání spojení s DB + funkce query() - ty v tom už nehrají roli } |
||
fandaa Profil |
#9 · Zasláno: 26. 8. 2009, 18:42:54
Mufna
protected static $_config = ... |
||
Alphard Profil |
#10 · Zasláno: 26. 8. 2009, 19:35:32 · Upravil/a: Alphard
„Dotaz pak bude "SELECT * FROM " . Database::getPrefix() . "...“
Psát před každou tabulku tuhle šílenost vám připadá normální? Mně rozhodně ne. Upravoval bych přímo metodu query() tak, aby by bylo možné napsat jednodušší a přehlednější dotaz, např. nějak takhle. select * from :pref:login where ... WHERE passwd=MD5('".addslashes(addslashes($_POST["heslo"]))."') Co je proboha tohle? Kromě toho, že nechápu do zdvojení a proč není využito mysql_real_escape_string() (i když do md5() to není nutné), tak snad každý normální databázový layer dokáže escapovat automaticky. Za takovou třídu pěkně děkuji, ruce pryč, nic neulehčuje, právě naopak. |
||
Mufna Profil |
#11 · Zasláno: 26. 8. 2009, 20:18:38 · Upravil/a: Mufna
Alphard
WHERE passwd=MD5('".addslashes(addslashes($_POST["heslo"]))."') To jsem jen zkopíroval starý a jiným autorem napsaný dotaz :-) O něj mi nešlo, ten si pak upravím tak jak píšete. Nejdřív musím zprovoznit tu databázovou třídu (zatím mi to pořád dělá problémy, hlavně mi to téměř všude hlásí chybu: Using $this when not in object context Takže to mám všude nahradit $this výrazem self:: ? public static function getConnection() { if (is_null($this->_conn)) { $db = $this->_config; $this->_conn = mysql_connect($db['hostname'], $db['username'], $db['password']); if(!$this->_conn) { die("Nelze se připojit k databázi"); } if(!mysql_select_db($db['database'])) { die("Nelze vybrat databázi"); } } return $this->_conn; } |
||
Alphard Profil |
#12 · Zasláno: 26. 8. 2009, 20:33:04
Mufna:
„Takže to mám všude nahradit $this výrazem self:: ?“ Ve statických metodách nelze používat $this, to je základní vlastnost OOP. Nejsem si ale jist, jestli je self:: univerzální lék. Metoda by měla být navržena již s tím, že bude statická a měla by se tomu celkově přizpůsobit. Jste si jist, že nechcete použít něco hotového a funkčního? |
||
Mufna Profil |
#13 · Zasláno: 26. 8. 2009, 20:43:29
Alphard
Jste si jist, že nechcete použít něco hotového a funkčního? No klidně ano. Někdo (tuším že Vy) mi dal odkaz na dibi. No, je to asi docela vymakaný, no na mě je to příliš složitý. Rád bych nějakou funkční databázovou třídu, ale něco jednoduššího (hledám, hledám a gůglím), t.j. něco, v čem se někdo, kdo začíná s OOP, ale zároveň potřebuje kus něčeho funkčního (t.j. já), alespoň dokáže po nějakém tom dnu studia trochu zorientovat. |
||
Alphard Profil |
#14 · Zasláno: 26. 8. 2009, 21:42:45
Je možné, že jsem vám doporučil dibi. Ještě je možnost používat přímo v PHP MySQLi nebo třeba PDO. Ale myslím si, že dibi je možná i nejpřístupnější, zvlášť pokud někdo preferuje české návody.
„No, je to asi docela vymakaný, no na mě je to příliš složitý.“ Ta složitost je relativní, složité věci většinou jednoduše udělat nejde, ale běžné úkony jsou jednoduché. Váš původní dotaz by vypadal třeba takhle: $data = dibi::fetch("select * from [:pref:login] where [passwd] = md5(%s)", $_POST['heslo']); Podle mě jednoduché, funkční, přehledné. Escapování je zajištěné, nemusím mít strach z sql injection, klidně mohu mít dotaz v tomto stylu a dibi vše ošetří. $data = dibi::fetchAll("select * from [:pref:tabulka] where [id_neco] = %i and [sloupec] = %s", $_POST['id'], $_POST['hledej']); |
||
Časová prodleva: 15 let
|
0