Autor Zpráva
Mufna
Profil
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
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
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
Do třídy Database si přidej statickou metodu getPrefix() { return $this->_config['prefix']; }

Dotaz pak bude "SELECT * FROM " . Database::getPrefix() . "...
Mufna
Profil
joe

Díky
Mufna
Profil
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
Mufna
    public static function getTablePrefix() {
     return self::$_config['prefix'];
    }
Mufna
Profil
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
Mufna
protected static $_config = ...
Alphard
Profil
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
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
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
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
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']);

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: