2015-04-16 5 views
2

Мои ограниченные знания PHP довольно старые. Когда я создавал веб-сайты, у меня всегда был файл config.php, содержащий некоторые определения и глобальную переменную $_DB. Затем в каждом файле function_xyz.php я включил этот файл конфигурации.Правильный способ доступа к базе данных в PHP-классах

Теперь я хочу, чтобы наконец перейти и использовать классы. Но я не могу найти подходящий способ получить доступ к mysql в функциях моих классов без включения так называемого файла config.php поверх каждого файла.

Представьте меня есть класс с именем User.php:

class User { 

private $firstName; 
private $familyName; 
private $emailAddress; 


public function __construct($username, $password) { 
    //check if user with name and pass exist in DB 
    // stuff.... 


    //If user exist, populate member variables 
    $this->emailAddress = ... 

} 

public function getEmail(){ 
    return $this->emailAddress; 
} 
} 

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

Какова наилучшая практика в наши дни?

+10

Лучшая практика - [инъекция зависимостей] (http://stackoverflow.com/questions/130794/what-is-dependency-injection) – Machavity

+0

Если вы пытаетесь обойтись без рамки, вы должны создать класс базы данных, который вы можете позвонить, чтобы установить соединения с разными пользователями: $ db = new Database ('myuser'); или $ this-> db = Database :: connect ('myuser'); который может вернуть вам соединение. Вы можете сделать его частью конструктора: новый User (Database :: connect ('myuser')), и, как я понимаю, это будет инъекция зависимостей, такая как Machavity. – dgig

+0

@ceejayoz Почему это лучшая практика? .. – DarkBee

ответ

0

сделать глобальную Instance:

//db.php include once 
class DB { 
    #bind connenction in it 
} 
#make instance 
$db = new DB($config);#use for User Instances 

, а затем:

class User { 

private $db; 
private $firstName; 
private $familyName; 
private $emailAddress; 

public function __construct($db) { 
    $this->db=$db; 
} 

public function validate($username, $password,$db) { 
    //check if user with name and pass exist in DB 

    //If user exist, populate member variables 
    $this->emailAddress = ... 

} 

public function getEmail(){ 
    return $this->emailAddress; 
} 
} 
$user = new User($db); 

Есть один способ. Но вы говорите меньше о том, как вы хотите использовать классы.

+0

это не очень красиво, чем 'require (" ../ config.php ")' –

+0

Это путь. Хотя бы один вариант - использовать одноэлементный шаблон для извлечения соединения вместо 'DI' – DarkBee

+0

«говоря меньше о том, как вы хотите использовать классы», он использует только inde.php, поскольку он использует классы? автопогрузчик? auto.prepend? включить, где? –

1

Я пошел бы с учебником по регистрации/регистрации PHPAcademy. У него класс DB, который обрабатывает практически все, что вам нужно. Вот пример его кода, слегка измененный мной, но все кредиты Алексу Гарретту.

<?php 

class DB { 
    private static $_instance = null; 
    private $_pdo, 
      $_query, 
      $_error = false, 
      $_results, 
      $_count = 0; 

    private function __construct() { 
     try { 
      $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password')); 
     } catch(PDOException $e) { 
      die($e->getMessage()); 
     } 
    } 

    public static function getInstance() { 
     if(!isset(self::$_instance)) { 
      self::$_instance = new DB(); 
     } 
     return self::$_instance; 
    } 

    public function query($sql, $params = array()) { 
     $this->_error = false; 
     if($this->_query = $this->_pdo->prepare($sql)) { 
      $x = 1; 
      if(count($params)) { 
       foreach($params as $param) { 
        if (is_int($param)) { 
         $this->_query->bindValue($x, $param, PDO::PARAM_INT); 
        } else { 
         $this->_query->bindValue($x, $param); 
        } 

        $x++; 
       } 
      } 



      if($this->_query->execute()) { 
       $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
       $this->_count = $this->_query->rowCount(); 
      } 
      else { 
       $this->_error = true; 
       print_r($this->_query->errorInfo()); 
      } 
     } 

     return $this; 
    } 

    public function action($action, $table, $where = array()) { 
     if(count($where) === 3){ 
      $operators = array('=', '>', '<', '>=', '<=', '!='); 

      $field = $where[0]; 
      $operator = $where[1]; 
      $value = $where[2]; 

      if(in_array($operator, $operators)) { 
       $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; 

       if(!$this->query($sql, array($value))->error()) { 
        return $this; 
       } 
      } 
     } else if (count($where) === 0) { 

      $sql  = "{$action} FROM {$table}"; 

      if(!$this->query($sql)->error()) { 
        return $this; 
       } 

     } 



     return false; 
    } 

    public function get($table, $where) { 
     return $this->action('SELECT *', $table, $where); 
    } 

    public function delete($table, $where) { 
     return $this->action('DELETE', $table, $where); 
    } 

    public function getAll($table) { 
     return $this->action('SELECT *', $table); 
    } 

    public function first() { 
     return $this->results()[0]; 
    } 

    public function last() { 
     $i = count($this->results()) - 1; 

     return $this->results()[$i]; 
    } 

    public function insert($table, $fields = array()) { 
     if(count($fields)) { 
      $keys = array_keys($fields); 
      $values = ''; 
      $x = 1; 

      foreach ($fields as $field) { 
       $values .= '?'; 
       if($x < count($fields)) { 
        $values .= ', '; 
       } 
       $x++; 
      } 

      $sql = "INSERT INTO {$table} (`" . implode('` , `', $keys) . "`) VALUES({$values})"; 

      if (!$this->query($sql, $fields)->error()) { 
       return true; 
      } 
     } 

     return false; 
    } 

    public function update($table, $where, $parametar, $fields) { 
     $set = ''; 
     $x = 1; 

     foreach ($fields as $name => $value) { 
      $set .= "{$name} = ?"; 
      if ($x < count($fields)) { 
       $set .= ', '; 
      } 

      $x++; 
     } 
     if (is_int($parametar)) { 
      $sql = "UPDATE {$table} SET {$set} WHERE {$where} = {$parametar}"; 
     } else { 
      $sql = "UPDATE {$table} SET {$set} WHERE {$where} = '{$parametar}'"; 
     } 

     if (!$this->query($sql, $fields)->error()) { 
       return true; 
      } 

     return false; 

    } 

    public function results() { 
     return $this->_results; 
    } 

    public function error() { 
     return $this->_error; 
    } 

    public function count() { 
     return $this->_count; 
    } 

} 

Тогда вы можете запросить базу данных, такую ​​как DB::getInstance()->getAll('tableName')->results();. Изменить учетные данные БД в __construct или посмотреть его видео (что я рекомендую).

Смежные вопросы