Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa rejestracji, optymalizacja kodu
Forum PHP.pl > Inne > Oceny
nmts
Poniżej jest moja pierwsza klasa. Chciałbym żebyście zaproponowali rozwiązania dążące to zoptymalizowania tego kawałka kodu aby był wydajniejszy. Jak widać są 3 połączenia z bazą, może macie pomysł na zrobienie z dwóch ostatnich jedną, próbowałem ale miałem pewien problem. Jeśli macie jakiekolwiek inne odczucia, propozycje, pomysły czy epitety skierowane w moją stronę, to również ich wysłucham.
  1. <?php
  2. class register {      
  3.      public $nickname;
  4.      public $password;
  5.      public $password2;
  6.      public $email;
  7.      public $answer=array(); // przechowuje odpowiedzi na otrzymane dane
  8.      public $sended=array(); // przechowuje poprawne dane, uzupelnia formularz    
  9.      function check($nickname,$email,$password,$password2){ // sprawdza czy wszystko ok
  10.            $this->sended['nickname']=$this->nickname=$nickname;
  11.            $this->sended['email']=$this->email=$email;
  12.            $this->sended['password']=$this->password=$password;
  13.            $this->sended['password2']=$this->password2=$password2;  
  14.            try
  15.            {
  16.                  $pdo = new PDO('mysql:host=xxx;dbname=xxx_stmn;port=3306', 'xxx_stmn', 'xxx');
  17.                   $query = $pdo->prepare('SELECT COUNT(id) FROM forum_users WHERE  email=:email || nickname=:nickname');      
  18.                  $query -> bindValue(':nickname', $this->nickname, PDO::PARAM_STR);
  19.                  $query -> bindValue(':email', $this->email, PDO::PARAM_STR);        
  20.                  $query -> closeCursor();
  21.                  $query -> execute();        
  22.                  $counted = $query -> fetch();  
  23.                   ($counted[0]>0 || $this->password!=$this->password2 ||  $this->nickname=="" || $this->password=="" ||  $this->email=="") ? $this->whatswrong($counted) :  $this->createaccount();
  24.            }
  25.            catch(PDOException $e)
  26.            {
  27.                   array_push($this->answer, "Error: ".$e->getMessage());
  28.            }
  29.      }        
  30.      function createaccount(){ // tworzy konto jesli wszystko ok
  31.            array_push($this->answer,"zrobilbym Ci konto ale jeszcze nie dokonczylem funkcji");    
  32.      }            
  33.      function whatswrong($counted){ // informuje co jest zle
  34.            if($this->nickname==""){
  35.                  array_push($this->answer, "Uzupelnij nick.");
  36.            }
  37.            if($this->password==""){
  38.                  array_push($this->answer, "Uzupelnij haslo.");
  39.            }
  40.            if($this->email==""){
  41.                  array_push($this->answer, "Uzupelnij e-mail.");
  42.            }
  43.            if($this->password!=$this->password2){
  44.                  array_push($this->answer, "Twoje hasla nie sa identyczne.");
  45.                  unset($this->sended['password']);
  46.                  unset($this->sended['password2']);
  47.            }
  48.            if($counted[0]>0) {  
  49.                  $pdo = new PDO('mysql:host=xxx;dbname=xxx_stmn;port=3306', 'xxx_stmn', 'xxx');
  50.                  $query = $pdo->prepare('SELECT nickname FROM forum_users WHERE nickname=:nickname');      
  51.                  $query -> bindValue(':nickname', $this->nickname, PDO::PARAM_STR);    
  52.                  $query -> closeCursor();
  53.                  $query -> execute();      
  54.                  $data = $query -> fetch();  
  55.                  if($data['nickname']==$this->nickname && $this->nickname!=""){
  56.                        array_push($this->answer, "Nick jest zajety.");
  57.                        unset($this->sended['nickname']);
  58.                  }
  59.                  $query = $pdo->prepare('SELECT email FROM forum_users WHERE email=:email');      
  60.                  $query -> bindValue(':email', $this->email, PDO::PARAM_STR);        
  61.                  $query -> closeCursor();
  62.                  $query -> execute();  
  63.                  $data = $query -> fetch();
  64.                  if($data['email']==$this->email && $this->email!=""){
  65.                        array_push($this->answer, "Email jest zajety.");
  66.                        unset($this->sended['email']);
  67.                  }
  68.            }
  69.      }
  70.    
  71.    }
  72.    
  73.    if($_SERVER['REQUEST_METHOD'] == 'POST')
  74.    {    
  75.     $register = new register();
  76.     $register->check($_POST['nickname'],$_POST['email'],$_POST['password'],$_POST['password2']);
  77.     $smarty->assign("answer",$register->answer); // wysyla odpowiedzi
  78.     $smarty->assign("fillform",$register->sended); // wysylam do formularza dane ktore byly poprawne
  79.    }
  80.    $smarty->display("index.tpl");
  81. ?>
skowron-line
  1. <?php
  2. class A extends PDO
  3. {
  4.    public function __construct()
  5.    {
  6.         try{
  7.      
  8.            parent::__construct( 'polaczenie z baza przez pdo' );
  9.      
  10.        }catch( PDOException $e ){
  11.          
  12.            throw new MysqlException( 'Błąd połączenia z bazą danych' );
  13.            
  14.        }
  15.    }
  16.    
  17.    public function doSmth()
  18.    {
  19.        $this->query();
  20.    }
  21. }
  22. ?>


lub przekazywanie uchwytu do klasy w konstruktorze.
LBO
Nie twórz połączenia w każdej metodzie potrzebującej dostępu do bazy danych. Utwórz je w innej części kodu, a potem przekaż wszystkim klasom, które go wymagają.

  1. <?php
  2. class register {
  3.  protected $pdo;
  4.  
  5.  public function setConnection(PDO $pdo)
  6.  {
  7.    // Od teraz masz jedno połączenie w całym obiekcie.
  8.    $this->pdo = $pdo;
  9.  }
  10.  
  11.  // rest of the code
  12.  
  13. }
  14. ?>
alegorn
ja, na twoim miejscu, od samego poczatku uczyl bym sie rozdzielac logike od widoku...

owszem wiecej klepania w klawisze, ale o roznicach miedzy programowaniem strukturalnym a oop mozna by ksiazki pisac (by byc scislym - to i napisano... winksmiley.jpg )

tutaj masz projekt MVC (nie czepiajcie sie, wiem ze prosty, by nie zec prymitywny :] )
dzieki takiemu podejsciu zyskujesz wiele mozliwosci, np jesli chcesz zmieniac wersje jezykowe, inne komunikaty, inny wyglad, inna baza, etc..

ucz sie od poczatku oddzielac to co jest widokiem, co jest logika aplikacji, oraz jej model...

to jest jedynie szkic
przyznaje ze w zasadzie nie do konca to przemyslalem, pewnie przy kodowaniu zmienilbym pare spraw, tym niemniej jednak glowny pomysl jest moim zdaniem sluszny



  1. <?php
  2. //tutaj wyswietlasz wszystkie widoki (komunikaty, etc)
  3. class vievRegister{
  4.    private $_myController
  5.    public function __construct(){
  6.        $this->$_myController = new Controller;
  7.    }
  8.    public function loguj(){
  9.        if($this->$_myController->login($login,$pass) )
  10.            echo "jest ok";
  11.        else
  12.            echo"nie jest dobrze";
  13.    }
  14.    
  15.    public function wyloguj(){
  16.        if($this->$_myController->logout($login,$pass) )
  17.            echo "jest ok";
  18.        else
  19.            echo"nie jest dobrze";
  20.    }
  21.    public function etc(){}
  22. }#class vievRegister
  23.  
  24. //tutaj pracujesz nad logika aplikacji
  25. class Controller{
  26.    
  27.    protected $_MyModel;
  28.  
  29.    public function __construct(){
  30.    //zainicjuj odpowiedni model
  31.    }
  32.  
  33.    //logujemy, @return bool
  34.    public function login($login=null, $pass=null) {}
  35.    // wylogujemy @return bool
  36.    public function logout() {}
  37.    
  38.  
  39.  
  40.    //rejestrujemy @return mixed (bool gdy udany, w przeciwnym razie kod bledu)
  41.    public function register($login=null, $pass=null, $etc=array()) {}
  42.    
  43.    //wywalamy @return bool
  44.    public function remove() {
  45. }#class Controller
  46.  
  47. // tutaj wykonujesz wszystkie zapytanie do bazy danych
  48. class Model{
  49.    protected static $_uchwytDoDB;
  50.  
  51.    public function __construct() {}
  52.    protected function login() {}
  53.    protected function searchLogin() {}
  54.    protected function searchEmail() {}
  55.    protected function coTamJeszczeTza(){}
  56.    public function __destruct(){}
  57. }#class Model
  58.  
  59. // wyjatki
  60. class MyException {
  61. //tutaj obslugujesz bledy
  62. }
  63. ?>
phpion
Jak poprzednicy + co mi się rzuciło w oczy to $sended zamiast $sent smile.gif
nmts
Cytat(phpion @ 25.06.2009, 21:38:17 ) *
+ co mi się rzuciło w oczy to $sended zamiast $sent smile.gif


Racja, muszę przypomnieć sobie czasowniki nieregularne. biggrin.gif
Oczywiście dzięki za wszystkie odpowiedzi, na pewno będą miały znaczenie dla mojej przyszłości. winksmiley.jpg
bim2
Może miast
  1. <?php
  2. array_push($this->answer, "Uzupelnij nick.");
  3. ?>

daj
  1. <?php
  2. private function debug($sMessage)
  3. {
  4.   array_push($this->answer, $sMessage);
  5. }
  6. ?>

Chyba będzie wygodniej smile.gif
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-2024 Invision Power Services, Inc.