![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Przyjaciele php.pl Postów: 215 Pomógł: 0 Dołączył: 28.10.2003 Skąd: - Ostrzeżenie: (0%) ![]() ![]() |
[php:1:f3d8be1558]<?php
class usersAuthenticate { var $login; var $password; var $db; function loginUser() { if(empty($this->login) || empty($this->password)) { return(false); } else { $row = $this->db->GetRow("SELECT password, date, userName FROM users WHERE login='".$this->login."'"); } if($row[0] != md5($this->password)) { return(false); } else { $this->db->Execute("UPDATE users SET session='".session_id()."', ip='".$_SERVER['REMOTE_ADDR']."', date=NOW() WHERE login='".$this->login."'"); } if(!$this->db->Affected_Rows()) { return(false); } else { $_SESSION['date'] = $row[1]; $_SESSION['pelnaNazwa'] = $row[2]; return(true); } } ?>[/php:1:f3d8be1558] Czy odwolanie sie do ADODB (po przez $db) w tym fragmencie klasy to jedyny sposob? Czy jest to optymalne rozwiazanie? Czy mozna zrobic to w inny sposob np. przez "extends"? Jakie są Wasze rozwiązania i doświadczenia? -------------------- <span style="font-weight: bold;">Open Source Enterprise Content Management</span>
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 0 Dołączył: 5.10.2003 Skąd: Londyn / UK Ostrzeżenie: (0%) ![]() ![]() |
Rozszerzenie klasy ADOdb raczej nie wchodzi w grę. Zwykłym extends niczego tutaj nie wkurasz. Z tego co zdążyłem przejżeć ADOdb tworzy inna klase dla kazdej z baz danych. Wymagaloby to od ciebie napisania kodu dla kazdej z nich. Oczywiscie mozesz sie o to pokusic, ale czy jest to warte zachodu?
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 215 Pomógł: 0 Dołączył: 28.10.2003 Skąd: - Ostrzeżenie: (0%) ![]() ![]() |
Wiec najlepiej zdefiniowac zmienna $db jako globalna i uzywac jej dla kazdej z funkcji? Czy to bedzie najlepsze rozwiazanie?
-------------------- <span style="font-weight: bold;">Open Source Enterprise Content Management</span>
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 217 Pomógł: 0 Dołączył: 5.10.2003 Skąd: Londyn / UK Ostrzeżenie: (0%) ![]() ![]() |
Wstepnie przygladajac sie temu ja bym tak zrobil
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 22.04.2003 Skąd: Żory / K-ce Ostrzeżenie: (0%) ![]() ![]() |
Luca: a o co Ci chodzi? O to, że nie chce Ci się odwoływywać przez właściwość? Jeśli tak, to napisz na początku każdej takiej metody:
Kod $db = &$this->db;
i używaj $db tak jakbybyś używał go po global. Używanie zmiennych globalnych to nieelegancki nawyk - wytrych, powinno się go unikać jak ognia. -------------------- Gadu-Gadu: 3909164
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 215 Pomógł: 0 Dołączył: 28.10.2003 Skąd: - Ostrzeżenie: (0%) ![]() ![]() |
Wszystko dziala prawidlowo. Chcialem tylko zasignac opini ktory ze sposobow implementacji ADODB lepszy. Nalfein][WR: Czy Twoj sposob nie jest identyczny z tym ktorego ja teraz uzywam? Czy mozna to zrobic w jeszcze jakis inny sposob?
-------------------- <span style="font-weight: bold;">Open Source Enterprise Content Management</span>
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 22.04.2003 Skąd: Żory / K-ce Ostrzeżenie: (0%) ![]() ![]() |
Po prostu: nie słuchaj kAzu^ i nie używaj zmiennych globalnych. Jeśli "$this->db" jest za długie do pisania za każdym razem to piszesz "$db = &$this->db", zamiast globalizowania. To co masz jest napisane dobrze, choć $login i $password przekazywałbym przekazywałbym jako argumenty metody loginUser() jeśli nie będzie potrzeby odwoływać się do nich nich w innych metodach. Napisz co dokładnie Cię nurtuje, a może coś wymyśli.
Pozdro. -------------------- Gadu-Gadu: 3909164
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 215 Pomógł: 0 Dołączył: 28.10.2003 Skąd: - Ostrzeżenie: (0%) ![]() ![]() |
Inaczej: aplikacja wykorzystuje ADODB i Smarty. Chciałem się dowiedzieć w jaki sposób Wy łączycie te klasy ze swoimi. Jeden z wniosków już mam: bez zmiennych globalnych. A może napisać osobną metodę która będzie obsługiwać ADODB?
-------------------- <span style="font-weight: bold;">Open Source Enterprise Content Management</span>
|
|
|
![]()
Post
#9
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Cieżko jest sie tutaj bawić bez zmiennych globalnych, bo zazwyczaj nie chcemy tworzyć więcej niż jednej instancji tych klas, a musimy je wykorzystać w kilku innych. Można zrobić jednen głowny obiekt, który tworzy instancje AdoDB i Smartych, a potem inne są klasy ktore będą z nich korzystać są rozszerzane o niego. Gorzej jeśli któryś z obiektów tworzonych w rodzicu potrzebuje innego obiektu tego typu. I tutaj zazwyczaj przychodzą z pomocą zmienne globalne ( $this->db = &$GLOBALS[DB_INSTANCE] i po sprawie ). Jest to może nieeleganckie, ale ja jak do tej pory nie wpadłem na lepsze rozwiązanie
![]() ![]() -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 2 064 Pomógł: 1 Dołączył: 22.01.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Ja robie tak:
[php:1:f8c164cc93]<?php class jakasklasa { var $db; // zasob do adodb var $tpl; // zasob do smarty function jakasklasa() // konstruktor klasy { require_once("adodb/adodb.inc.php"); $this->db=&NewADOConnection("mysql"); $this->db->SetFetchMode(ADODB_FETCH_ASSOC); require_once($this->cfg["smarty_dir"]."Smarty.class.php"); $this->tpl=new Smarty; } ... ... } ?>[/php:1:f8c164cc93] [php:1:f8c164cc93]<?php $t=new jakasklasa; ... $t->db->Execute("jakis sql"); ... $t->tpl->Assign("zmienna",$wartosc); ?>[/php:1:f8c164cc93] Sprawuje się to bardzo ładnie. -------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Przyjaciele php.pl Postów: 215 Pomógł: 0 Dołączył: 28.10.2003 Skąd: - Ostrzeżenie: (0%) ![]() ![]() |
Sposób zaprezentowany przez spenalza jest zbliżony do tego który ja zaprezentowałem z tą różnica ze trzymam instrukcje konfiguracyjne w osobnym pliku, poza klasami, działa bardzo dobrze. Czy jest to dobry, bezpieczny sposób? Czy ktoś z Was praktykował jakieś inne rozwiązania?
-------------------- <span style="font-weight: bold;">Open Source Enterprise Content Management</span>
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%) ![]() ![]() |
Cytat I tutaj zazwyczaj przychodzą z pomocą zmienne globalne ( $this->db = &$GLOBALS[DB_INSTANCE] i po sprawie ). Jest to może nieeleganckie, ale ja jak do tej pory nie wpadłem na lepsze rozwiązanie
![]() Moze tak: $this->db = DB::Instance; ![]() Co do tematu to IMHO jest ok. Jezeli chcesz miec mozliwosc dostepu do $db w calej klasie to najlepiej to zrobic tak jak Ty czyli pzez $this>db. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 90 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Cytat Moze tak: $this->db = DB::Instance;
to jest to samo co uzywanie zmiennej globalnej :) U siebie rozwiazuje to w ten sposob, ze tworze obiekt REJESTR, ktorego zadaniem jest przetrzymywanie danych globalnych. (Zawsze lepiej miec 1 zmienna globalna niz 10) [php:1:e66b336cd5] <?php /** * Provides a central store for global data and objects. * Method load() is for loading objects/data into the registry. * @access public * @package System */ class Registry { var $_dir; var $_loaded = array(); /** * @param string $dir (with trailing slash at the end) method load() will look for files to include in this directory * @access public */ function Registry($dir = null) { if (isset($dir)) { if (!file_exists($dir) || !is_dir($dir)) { return trigger_error("Registry::__contruct() failed, directory does not exist `$dir`", E_USER_ERROR); } $this->_dir = $dir; } } /** * Load file/files * @return void * @throws trigger_error() * @access public */ function load() { foreach (func_get_args() as $v) { if (in_array($v, $this->_loaded)) { continue; } $file = $this->_dir . $v . '.php'; if (!file_exists($file) || !is_file($file)) { return trigger_error("Registry::load('$v') failed, file does not exist", E_USER_ERROR); } require $file; $this->_loaded[] = $v; } } } ?> [/php:1:e66b336cd5] W pliku "includes/prepend.php" inicjalizowany jest Rejestr i obsluga bledow - includuje go w kazdym pliku. W katalogu "includes/registry-load/" sa pliki ktore odpowiadaja za wgrywanie tych obiektow. np: Db, Config, Unique, User Przykladowy plik "includes/registry-load/Db.php" [php:1:e66b336cd5] <?php import('system.Db'); global $Registry; $Registry->load('Config'); $Registry->Config->load(ROOT . 'config/db.ini'); $Registry->Db =& Db::factory($Registry->Config->get('db.driver')); ?> [/php:1:e66b336cd5] W skrypcie w szybki sposob mozna zaladowac obiekty/dane ktorych w danym momencie potrzebujesz: [php:1:e66b336cd5] <?php require 'includes/prepend.php'; $Registry->load('Db', 'Smarty', 'User'); ?> [/php:1:e66b336cd5] czy w klasie [php:1:e66b336cd5] cass Costam { function Costam() { global $Registry; $this->Db = $Registry->Db; $this->Smarty = $Registry->Smarty; } } [/php:1:e66b336cd5] -------------------- code.gosu.pl
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 02:32 |