在我的项目中,我有一个数据库类,用于处理所有MySQL的东西。它连接到数据库,运行查询,捕获错误并关闭连接。
现在我需要在我的网站上创建一个成员区域,我打算构建一个用户类来处理注册,登录,密码/用户名更改/重置和注销。在这个用户类中,我需要使用MySQL,原因很明显......这就是我的数据库类。
但是我对如何在用户类中使用我的数据库类感到困惑。我是否想为我的用户类创建一个新的数据库对象,然后只要该类中的方法完成就关闭它?或者我以某种方式创建一个可以在整个脚本中使用的“全局”数据库类(如果是这种情况我需要帮助,不知道该怎么做。)
感谢您提供给我的任何反馈。
答案 0 :(得分:22)
简单,3步骤。 1 /创建数据库对象。 2 /将它提供给用户类构造函数。 3 /在用户方法中使用它。
很少的例子。
File 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();
如果你想要这个旧技术的当前流行名称,谷歌“依赖注入”。 php中的Singleton模式很快就会消失。
答案 1 :(得分:1)
正如他所说,将所有函数放在数据库类中,并使用数据库对象从您的用户类访问这些函数。这应该是您的最佳方法。
例如:
global $database;
userclassvar = $database->doSomething();
答案 2 :(得分: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();
}
}
现在您可以使用User
的{{1}}属性来执行数据库功能,例如$_link
。如果您的类不必与数据库交互那么多,那么您不必将$this->_link->query(...)
放在构造函数中。
答案 3 :(得分:0)
由于您使用数据库作为对象,为什么不只是向“用户类”可以使用的对象添加方法来处理它需要做的事情。 users类可以包含指向数据库类的指针。数据库类将保护您的数据库,并确保用户类正在正确使用它。
答案 4 :(得分:0)
我认为更好的方法是创建一个数据库类,它在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();
?>
这是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);
}
}
?>
答案 5 :(得分: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;
}
}
?>