Использование класса базы данных в моем пользовательском классе - PullRequest
7 голосов
/ 05 апреля 2010

В моем проекте у меня есть класс базы данных, который я использую для обработки всех вещей MySQL.Он подключается к базе данных, выполняет запросы, ловит ошибки и закрывает соединение.

Теперь мне нужно создать область членов на моем сайте, и я собирался создать класс пользователей, который будет обрабатывать регистрацию, вход в систему, пароль / имя пользователя изменяет / сбрасывает и выходит из системы.В этом классе пользователей мне нужно использовать MySQL по очевидным причинам ... для этого и был создан класс моей базы данных.

Но я не совсем понимаю, как использовать класс базы данных в своем классе пользователей.Хотел бы я создать новый объект базы данных для моего пользовательского класса, а затем закрыть его всякий раз, когда метод в этом классе будет завершен?Или я каким-то образом создаю «глобальный» класс базы данных, который можно использовать во всем моем сценарии (если это так, мне нужна помощь в этом, не знаю, что там делать).

Спасибо за любые ваши отзывыможете дать мне.

Ответы [ 6 ]

22 голосов
/ 07 апреля 2010

Простой трехэтапный процесс. 1 / Создать объект базы данных. 2 / Дайте это вашему конструктору класса пользователя. 3 / Используйте его в пользовательских методах.

Маленький пример.

Файл Database.class.php:

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

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

В User.class.php:

<?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 скоро исчезнет.

1 голос
/ 06 апреля 2010

Что мне нравится делать, так это создавать класс базы данных с учетом 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();
    }

}

А теперь вы можете использовать свойство User $_link для выполнения функций базы данных, например $this->_link->query(...). Вам не обязательно указывать Db::getLink() в конструкторе, если ваш класс не должен так сильно взаимодействовать с базой данных.

1 голос
/ 05 апреля 2010

Как он сказал, поместите все свои функции в класс базы данных и используйте объект базы данных для доступа к этим функциям из вашего пользовательского класса. Это должен быть лучший метод в вашем случае. Например:
global $database;<br/> userclassvar = $database->doSomething();

0 голосов
/ 13 апреля 2013

Вот решение с использованием 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;
        }
    }
?>
0 голосов
/ 22 декабря 2012

Я думаю, что лучшим подходом было бы создать класс базы данных, который сразу установил бы себя в файле database.php, а затем включить его в файл 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();

?>

вот пользователь.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 голосов
/ 05 апреля 2010

Поскольку вы используете базу данных в качестве объекта, почему бы просто не добавить методы к объекту, которые ваш «класс пользователей» может использовать, чтобы позаботиться о том, что ему нужно делать. Класс users может содержать указатель на класс базы данных. Класс базы данных защитит вашу базу данных и гарантирует, что класс пользователей использует ее надлежащим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...