Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ADODB i inna klasa ...
Luke
post 28.12.2003, 19:43:10
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>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
.dragonfly
post 28.12.2003, 20:57:53
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?
Go to the top of the page
+Quote Post
Luke
post 28.12.2003, 21:11:04
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>
Go to the top of the page
+Quote Post
.dragonfly
post 28.12.2003, 21:27:55
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
Go to the top of the page
+Quote Post
Nalfein][WR
post 28.12.2003, 22:40:03
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
Go to the top of the page
+Quote Post
Luke
post 28.12.2003, 22:51:50
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>
Go to the top of the page
+Quote Post
Nalfein][WR
post 28.12.2003, 23:05:44
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
Go to the top of the page
+Quote Post
Luke
post 28.12.2003, 23:21:13
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>
Go to the top of the page
+Quote Post
Cudi
post 28.12.2003, 23:41:37
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 smile.gif Licze że Nalfein wskarze nam droge winksmiley.jpg


--------------------
"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
Go to the top of the page
+Quote Post
spenalzo
post 29.12.2003, 01:21:57
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.


--------------------

Go to the top of the page
+Quote Post
Luke
post 29.12.2003, 10:11:21
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>
Go to the top of the page
+Quote Post
Seth
post 29.12.2003, 11:38:05
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 smile.gif

Moze tak: $this->db = DB::Instance; winksmiley.jpg

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.
Go to the top of the page
+Quote Post
cagrET
post 29.12.2003, 12:33:35
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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 02:32