Php 在我的用户类中使用数据库类
在我的项目中,我有一个数据库类,用于处理所有MySQL内容。它连接到数据库、运行查询、捕获错误并关闭连接 现在我需要在我的站点上创建一个成员区域,我要构建一个users类,该类将处理注册、登录、密码/用户名更改/重置和注销。在这个用户类中,我需要使用MySQL,原因很明显。。。这就是我的数据库类的用途 但是我不知道如何在我的用户类中使用我的数据库类。我是否希望为我的用户类创建一个新的数据库对象,然后在该类中的方法完成时将其关闭?或者我是否以某种方式创建了一个可以在整个脚本中使用的“全局”数据库类(如果是这种情况,我需要帮助,不知道该怎么做。)Php 在我的用户类中使用数据库类,php,database,class,object,Php,Database,Class,Object,在我的项目中,我有一个数据库类,用于处理所有MySQL内容。它连接到数据库、运行查询、捕获错误并关闭连接 现在我需要在我的站点上创建一个成员区域,我要构建一个users类,该类将处理注册、登录、密码/用户名更改/重置和注销。在这个用户类中,我需要使用MySQL,原因很明显。。。这就是我的数据库类的用途 但是我不知道如何在我的用户类中使用我的数据库类。我是否希望为我的用户类创建一个新的数据库对象,然后在该类中的方法完成时将其关闭?或者我是否以某种方式创建了一个可以在整个脚本中使用的“全局”数据库类
谢谢你能给我的任何反馈。既然你把数据库当作一个对象来使用,为什么不向这个对象添加一些方法,让你的“用户类”来处理它需要做的事情呢。users类可以包含指向数据库类的指针。database类将保护您的数据库,并确保users类正确使用它。正如他所说,将所有函数放在database类中,并使用database对象从user类访问这些函数。这应该是对你来说最好的方法。 如:
全球$数据库
userclassvar=$database->doSomething();
我喜欢做的是在脑海中创建数据库类。这样,如果您已经有一个数据库对象,它只会检索它,否则会创建一个新的数据库对象。例如:
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
的$\u link
属性执行数据库功能,如$this->\u link->query(…)
。如果您的类不必与数据库进行太多的交互,则不必将Db::getLink()放入构造函数中。简单的三步过程。
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
}
[...]
}
<?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"');
}
}
我认为更好的方法是创建一个数据库类,该类立即在database.php上自行建立,然后将其包含在user.php上。然后,每次创建需要数据库的函数时,都要全局化数据库对象
看看这个。
database.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);
}
}
?>
下面是一个使用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;
}
}
?>
这听起来很像将两个类混合在一起。我更喜欢类完全独立的解决方案,除非我遗漏了什么?OO设计是关于封装的。对我来说,独立封装数据库,然后让类访问它是有意义的,这样它就可以单独控制对数据库的访问。然而,其他设计也是可能的。有两个类都可以直接访问数据库,尽管我的观点是,这增加了额外的复杂性。我认为另一种方法是实例化一个连接到数据库的数据库类实例,然后使用一个单独的类通过从数据库类检索的数据库句柄来执行“用户”操作。。。如果你愿意的话,这应该行得通。也许是我所希望的最好的答案,我现在明白了。谢谢。。。虽然我似乎无法在不注册的情况下接受这个答案,但lolThis可能已经有几年了,但感谢您发布这篇文章——我花了两天时间四处寻找,试图弄清楚为什么我的一个类没有拉入我的DB类连接id,这导致$this->_链接没有启动,并将我的mysqli_uuu[blah blah]作为第一个参数。再次感谢。嘿,我一直在尝试实现一个类似的概念,建立这样一个链接的代码是什么?我尝试使用self::\u link=和$this->\u链接,但两者都不允许我设置链接。
<?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;
}
}
?>