В моем проекте у меня есть класс базы данных, который я использую для обработки всего материала MySQL. Он подключается к базе данных, запускает запросы, улавливает ошибки и закрывает соединение.
Теперь мне нужно создать область участников на моем сайте, и я собираюсь создать класс пользователей, который будет обрабатывать регистрацию, вход в систему, изменения / сброс пароля / имени пользователя, а также выход из системы. В этом классе пользователей мне нужно использовать MySQL по понятным причинам … для чего был создан класс базы данных.
Но я смущен тем, как я буду использовать свой класс базы данных в своем классе пользователей. Должен ли я создать новый объект базы данных для моего пользовательского класса, а затем закрыть его всякий раз, когда будет завершен метод в этом классе? Или я каким-то образом создаю «глобальный» класс базы данных, который можно использовать на всем моем скрипте (если это так, мне нужна помощь с этим, не знаю, что там делать).
Спасибо за любую обратную связь, которую вы можете мне дать.
Простой, трехэтапный процесс. 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 «Injection Dependency». Шаблон Singleton в php скоро исчезнет.
По его словам, поместите все свои функции в класс базы данных и используйте объект базы данных для доступа к этим функциям из вашего пользовательского класса. Это должно быть лучшим методом в вашем случае. Например:
global $database;
userclassvar = $database->doSomething();
Мне нравится делать класс базы данных с учетом шаблона Singleton . Таким образом, если у вас уже есть объект базы данных, он просто извлекает его, в противном случае создает новый. Например:
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(); } }
И теперь вы можете использовать свойство $_link
для выполнения функций базы данных, например $this->_link->query(...)
. Вам необязательно размещать Db::getLink()
в конструкторе, если вашему классу не нужно много взаимодействовать с базой данных.
Поскольку вы используете базу данных как объект, почему бы просто не добавить методы к объекту, который может использовать ваш «класс пользователей», чтобы заботиться о вещах, которые ему нужно делать. Класс users может содержать указатель на класс базы данных. Класс базы данных будет защищать вашу базу данных и гарантировать, что класс пользователей использует ее соответствующим образом.
Вот решение, использующее 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; } } ?>
Я думаю, что лучшим aproach будет создание класса базы данных, который немедленно установит самостоятельно на 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 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); } } ?>