2010-04-05 2 views
7

내 프로젝트에는 모든 MySQL 항목을 처리하는 데 사용하는 데이터베이스 클래스가 있습니다. 데이터베이스에 연결하고, 쿼리를 실행하고, 오류를 포착하고 연결을 닫습니다.내 사용자 클래스에서 데이터베이스 클래스 사용

이제 내 사이트에 회원 영역을 만들어야하고 등록, 로그인, 비밀번호/사용자 이름 변경/재설정 및 로그 아웃을 처리 할 사용자 클래스를 만들려고했습니다. 이 사용자 클래스에서 나는 분명히 이유를 위해 MySQL을 사용해야합니다 ... 이것은 내 데이터베이스 클래스가 만들어진 것입니다.

하지만 사용자 클래스에서 데이터베이스 클래스를 사용하는 방법에 대해 혼란 스럽습니다. 내 사용자 클래스에 대해 새 데이터베이스 개체를 만든 다음 해당 클래스의 메서드가 끝날 때마다 닫을 수 있습니까? 아니면 어떻게 든 내 전체 스크립트에서 사용할 수있는 '글로벌'데이터베이스 클래스를 만듭니다 (이 경우 도움이 필요하면 무엇을해야할지 모릅니다.)

의견을 보내 주셔서 감사합니다. 나를.

답변

0

데이터베이스를 개체로 사용하고 있으므로 "사용자 클래스"가 수행해야하는 작업을 처리 할 수있는 개체에 메서드를 추가하는 것이 가장 좋습니다. users 클래스는 데이터베이스 클래스에 대한 포인터를 포함 할 수 있습니다. 데이터베이스 클래스는 데이터베이스를 보호하고 사용자 클래스가이를 적절히 사용하는지 확인합니다.

+1

두 클래스를 혼합하는 것처럼 들립니다. 내가 뭔가를 놓치지 않으면 클래스가 완전히 독립적 인 솔루션을 선호합니까? – Josh

+0

OO 디자인은 캡슐화에 관한 것입니다. 필자에게 데이터베이스를 독립적으로 캡슐화 한 다음 데이터베이스에 액세스하는 클래스를 가져서 데이터베이스 액세스 만 제어하도록하는 것이 좋습니다. 그러나 다른 디자인도 가능합니다. 데이터베이스에 직접 액세스하는 두 클래스를 가질 수 있지만, 제 생각에는 복잡성이 추가됩니다. – WhirlWind

+0

다른 방법은 데이터베이스에 연결하는 데이터베이스 클래스 인스턴스를 인스턴스화 한 다음 별도의 클래스를 사용하여 데이터베이스 클래스에서 검색 한 데이터베이스 핸들을 통해 "사용자"작업을 수행하는 것입니다. 그것을 선호하십시오. – WhirlWind

1

그는 말했듯이 모든 함수를 데이터베이스 클래스에 넣고 데이터베이스 개체를 사용하여 사용자 클래스에서 해당 함수에 액세스합니다. 이것은 귀하의 경우에 가장 좋은 방법이어야합니다. 예는 :
global $database;
userclassvar = $database->doSomething();

1

내가 뭘 좋아하는 마음에 Singleton pattern와 데이터베이스 클래스를 만들 수 있습니다. 그런 식으로, 이미 데이터베이스 객체를 가지고 있다면, 객체를 가져오고, 그렇지 않으면 새로운 객체를 생성합니다. 예를 들면 :

Database.class.php 

class Db 
{ 
    protected static $_link; 

    private function __construct() 
    { 
     // access your database here, establish link 
    } 

    public static function getLink() 
    { 
     if(self::_link === null) { 
      new Db(); 
     } 
     return self::_link; 
    } 

    // etc. 

} 


User.class.php 

class User 
{ 
    protected $_link; // This will be the database object 
    ... 

    public function __construct() 
    { 
     $this->_link = Db::getLink(); 
    } 

} 

그리고 지금 당신은 $this->_link->query(...)처럼 데이터베이스 기능을 수행하는 User$_link 속성을 사용할 수 있습니다. 클래스가 데이터베이스와 너무 많이 상호 작용할 필요가 없다면 반드시 생성자에 Db::getLink()을 넣을 필요는 없습니다.

+0

안녕하세요, 저는 유사한 개념을 구현하려고 시도해 왔습니다. 그런 링크를 구축하는 코드는 무엇이 될까요? 나는 self :: _ link =와 $ this -> _ link를 사용해 보았지만 둘 다 링크를 설정할 수는 없었다. – MichaelH

21

간단한 3 단계 프로세스. 1/데이터베이스 개체를 만듭니다. 2/사용자 클래스 생성자에게 제공하십시오. 3/사용자 방법에서 사용하십시오.

약간의 예.

파일 Database.class.php : User.class.php에서

<?php 
class Database{ 
    public function __construct(){ 
    // Connects to database for example. 
    } 

    public function query($sqlQuery){ 
    // Send a query to the database 
    } 
    [...] 
} 

:

<?php 

class User{ 
    private $_db; 
    public function __construct(Database $db){ 
    $this->_db = $db; 
    } 

    public function deleteUser(){ 
    $this->_db->query('DELETE FROM Users WHERE name = "Bobby"'); 
    } 
} 

이제 userManager.php 예를 들면 :

<?php 
$db = new Database(); 
$user = new User($db); 
// Say bye to Bobby : 
$user->deleteUser(); 

당신이 만약 Google의 "Dependency Injection"이라는 최신 유행 기술의 최신 기술을 원합니다. PHP의 싱글 톤 패턴은 곧 사라질 것입니다.

+0

아마 내가 바라는 가장 좋은 대답은 분명히 지금 나와 있습니다. 고맙습니다. :) – Josh

+0

... 등록하지 않고이 대답을 수락 할 수는 없지만, lol – Josh

+4

그래서 ... 등록 하시겠습니까? –

0

더 나은 aproach는 database.php에서 즉시 instathiate하는 데이터베이스 클래스를 작성한 다음 user.php에 포함시키는 것이 더 효과적이라고 생각합니다. 그런 다음 데이터베이스가 필요한 함수를 작성할 때마다 데이터베이스 오브젝트를 전역 화합니다.

확인하십시오. databse.php 여기

<?php 
require_once ('includes/config.php'); 

class MysqlDb{ 
public $connection; 
private $last_query; 
private $magic_quotes_active; 
private $real_escape_string_exists; 


public function __construct() { 
    $this->open_connection(); 
    $this->magic_quotes_active = get_magic_quotes_gpc(); 
$this->real_escape_string_exists = function_exists("mysql_real_escape_string"); 
} 

public function open_connection() { 
    $this->connection = mysql_connect(DBHOST,DBUSER,DBPASS); 
    if(!$this->connection){ 
     die("Could not Connect ".mysql_error()); 
    }else{ 
     $db = mysql_select_db(DB, $this->connection); 
    } 
} 

public function close_connection(){ 
    if(isset($this->connection)){ 
     mysql_close($this->connection); 
     unset($this->connection); 
    } 
} 

public function query($sql){ 
    $this->last_query = $sql; 
    $results   = mysql_query($sql, $this->connection); 
    $this->comfirm_query($results); 
    return $results; 
} 

private function comfirm_query($results){ 
    if(!$results){ 
     $output  = "Query Failed " .mysql_error()."<br />"; 
     $output .= "Last Query: " . $this->last_query; 
     die($output); 
    } 
} 

public function escape_value($value){ 

if($this->real_escape_string_exists) { 
    if($this->magic_quotes_active) { $value = stripslashes($value); } 
    $value = mysql_real_escape_string($value); 
} else { 
    if(!$this->magic_quotes_active) { $value = addslashes($value); } 
} 
return $value; 
} 

public function fetch_array($results){ 
    return mysql_fetch_array($results);   
} 

public function num_row($results){ 
    return mysql_num_rows($results); 
} 

public function insert_id(){ 
    return mysql_insert_id($this->connection); 
} 

public function affected_row(){ 
    return mysql_affected_rows(); 
} 
} 
$database = new MysqlDb(); 

?> 

여기에 user.php

<?php 
require_once ('includes/database.php'); 

class User { 

public $id; 
public $fName; 
public $lName; 
Public $userName; 
public $password; 
public $email; 
public $acess; 

public static function find_all(){ 
    global $database; 
    return self::find_by_sql("SELECT * FROM users");  
} 

public static function find_by_id($id=0){ 
    global $database; 
    $results_array = self::find_by_sql("SELECT * FROM users where id={$id}"); 
    return !empty($results_array)? array_shift($results_array) : false; 
} 

public static function find_by_sql($sql){ 
    global $database; 
    $results = $database -> query($sql); 
    $object_array = array(); 
    while($row = $database -> fetch_array($results)){ 
     $object_array[] = self::instantiate($row); 
    } 
    return $object_array; 
} 

public static function instantiate($row){ 
    $user = new self; 
    foreach($row as $attribute => $value){ 
     if($user -> has_attribute($attribute)){ 
      $user -> $attribute = $value; 
     } 
    } 
    return $user; 
} 

private function has_attribute($attribute){ 
    $object_vars = get_object_vars($this); 
    return array_key_exists($attribute, $object_vars); 

} 
} 

?> 
0

이다 PDO를 이용한 용액이다.

<?php 
    class Database { 
     private static $dbh; 

     public static function connect() { 
      $host = "mysql:dbname=YOUR_DB_NAME;host=YOUR_DB_SERVER"; 
      $username = "YOUR_USERNAME"; 
      $password = "YOUR_PASSWORD"; 
      try { 
       self::$dbh = new PDO($host, $username, $password); 
       self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); 
       self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
       self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      } catch(PDOException $e){ 
       $error_message = $e->getMessage(); 
       exit(); 
      } 
      return self::$dbh; 
     } 
    } 

    class MYObject { 
     public static $dbh = null; 

     public function __construct(PDO $db = null) { 
      if($db === null){ 
       $this->dbh = Database::connect(); 
      } else { 
       $this->dbh = $db; 
      } 
     } 
    } 

    class User extends myObject { 
     public function __construct($id = null, PDO $db = null) { 
      if($db === null){ 
       parent::__construct(); 
      } else { 
       parent::__construct($db); 
      } 

      if($id !== null){ 
       return $this->select($id); 
      } 
     } 

     public function select($id) { 
      $retVal =false; 
      try { 
       $stmt = $this->dbh->prepare("SELECT..."); 
       $stmt->execute(); 

       if($stmt->rowCount()==1){ 
        $row = $stmt->fetchAll(PDO::FETCH_ASSOC); 
        $retVal =json_encode($row); 
       } 
      } catch (PDOException $e) { 
       $error_message = $e->getMessage(); 
       exit(); 
      } 
      return $retVal; 
     } 
    } 
?> 
관련 문제