Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ADODB i inna klasa ...
Forum PHP.pl > Forum > PHP
Luke
[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?
.dragonfly
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?
Luke
Wiec najlepiej zdefiniowac zmienna $db jako globalna i uzywac jej dla kazdej z funkcji? Czy to bedzie najlepsze rozwiazanie?
.dragonfly
Wstepnie przygladajac sie temu ja bym tak zrobil
Nalfein][WR
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.
Luke
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?
Nalfein][WR
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.
Luke
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?
Cudi
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
spenalzo
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.
Luke
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?
Seth
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.
cagrET
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]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.