Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: php PDO wrzorzec projektowy dao
Forum PHP.pl > Forum > PHP > Object-oriented programming
fander
Witam
Mam do zrobienia projekt na zaliczenie z baz danych, muszę zaprojektować bazę danych np sklepu (co już zrobiłem) oraz przedstawienie systemu w php przy użyciu pdo jako powłoki dostępu do bazy oraz wzorzec programowy dao.
Poniżej przedstawię kawałek kodu na którym mam się oprzeć w projekcie, puźniejwyjaśnię o co chodzi:

klasa DaoTemplate do operacji na bazie

CODE
class DaoTemplate extends PDO {
protected $connection;
protected $logger;
protected $atributetypes = array ();
protected $selectsql;
protected $insertsql;
protected $updatesql;
protected $deletesql;

public function getKey() {
return 'id';
}
public function __construct($connection = null){
$this->connection = $DaoPdoConnection;
}

public function insert($data){
$sql = $this->bind($this->insertsql, $data);
return $this->query($sql);
}

public function update($data){
$sql = $this->bind($this->updatesql, $data);
return $this->query($sql);
}

public function delete($data){
$sql = $this->bind($this->deletesql, array($this->getKey() => $id));
return $this->query($sql);
}

public function select($data){
$sql = $this->bind($this->selectsql, array($this->getKey() => $id));
$ret = $this->query($sql);
if(!$ret){
return false;
}
if(count($ret) > 0)
return $this->mapping($ret[0]);
else
return null;
}
public function mapping(array $record){

}
public function bind($rozkaz,$data){

}
?>


klasa DaoAdmin
CODE

<?php
class DaoAdmin extends DaoTemplate {
private static $insert = 'INSERT INTO admin (imie, nazwisko, nik, login, haslo) VALUES (:imie, :nazwisko, :nik, :login, :haslo)';
private static $update = 'UPDATE admin SET imie=:imie, nazwisko=:nazwisko, nik=:nik, login=:login, haslo=:haslo WHERE login=:login';
private static $select = 'SELECT imie, nazwisko, nik, login, haslo FROM admin where login=:login';
private static $delete = 'DELETE * FROM admin WHERE login=:login';
protected $atributetypes = array(
'imie' => PDO::PARM_STR,
'nazwisko' => PDO::PARM_STR,
'nik' => PDO::PARM_STR,
'login' => PDO::PARM_STR,
'haslo' => PDO::PARM_STR,
);

public function __construct($connection = null){
parent::__construct($connection);
}
public function mapping(array $tab){
return Admin::createObjectFromArray($tab);
}
public function save(Admin $object){
$data = $object -> toArray();
if($this->select($object->getLogin()) == null){
$ret = $this->insert($data);
}
else $ret = $this->update($data);
return $ret;
}
public function get($data){
$ret = $this->select($data);
}
public function delete($data){
$ret = $this->delete($data);
}
}
?>


klasa Admin

CODE

<?php
class Admin{
protected $id;
protected $imie;
protected $nazwisko;
protected $login;
protected $haslo;

private function setId($data){
$this->id = $data;
}
private function setLogin($data){
$this->login = $data;
}
private function setHaslo($data){
$this->haslo = $data;
}
private function setImie($data){
$this->imie = $data;
}
private function setNazwisko($data){
$this->nazwisko = $data;
}

public function getLogin(){
return $this->login;
}
public function getId(){
return $this->id;
}
public function createObjectFromArray($tab){
$admin = new Admin();
$keys = array_keys($tab);
foreach ($keys as $el){
switch ($el){
case 'id':
$admin->setId($tab[$el]);
break;
case 'imie':
$admin->setImie($tab[$el]);
break;
case 'nazwisko':
$admin->setNazwisko($tab[$el]);
break;
case 'login':
$admin->setLogin($tab[$el]);
break;
case 'haslo':
$admin->setHaslo($tab[$el]);
break;
}
}
return $admin;
}
public function toArray(){
foreach ($this as $key => $value){
$tab[$key] = $value;
}
return $tab;
}
}
?>

Mój problem polega na tym ze nie wiem jak zrobić metodę bind w DaoTemplate, mógłbym tą metodę zrobić w każdej klasie z osobna ale nie wiem czy to dobry pomysł, pozatym jesli tak miłbym robić to bezużyteczną jest tablica atrybutetypes.
markac
Na początek...
1.
  1. <?php
  2. public function __construct($connection = null){
  3. $this->connection = $DaoPdoConnection;
  4. }
  5. ?>


Skąd się bierze
  1. <?php
  2. $DaoPdoConnection
  3. ?>
? smile.gif

2. Używaj execute() zamiast query(). Będziesz miał załatwione dodawania slashy do zapytań sql.
3. Nie wiem gdzie wywołujesz wspomniana funkcje bind(). Co oznacza pierwszy parametr? Operację dodaj, albo usuń? Drugi parametr to tablica z danymi? Jeśli tak to wykorzystaj zwykłą konstrukcję foreach:

  1. <?php
  2. function bind($rozkaz, $data = array()) {
  3.  if ($rozkaz == 'dodaj') {
  4.    $sth = $this->connection->prepare('INSERT INTO tabela (pole1, pole2) VALUES (?, ?)');
  5.    
  6.    foreach($data as $index => $field) {
  7.      $sth->bindValue($index + 1, $field, PDO::PARAM_STR); //domyślnie string
  8.    }
  9.  
  10.    $sth->execute();
  11.  }
  12. }
  13. ?>


Pisałem z palca, więc może coś nie działać. Jeśli chcesz rzutować dane na odpowiednie typy (trzeci parametr bindValue()), możesz dodać dodatkową informację np. do klucza w tabeli $data:

  1. <?php
  2. $data = array('imie:string' => 'Mariusz', 'wiek:int' =>20);
  3. ?>

Potem możesz użyć funkcji explode() dla klucza tabeli i wykorzystać zwracane wartości do wyboru odpowiedniego parametru, np. PARAM_STR i PARAM_INT, ale domyśla wartość PARAM_STR powinna działać dla większości typów. Możesz tez użyć równoległej do $data tablicy do trzymania tylko typów wartości.
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.