如何访问在另一个PHP类中启动的数据库连接?

时间:2014-01-27 22:58:44

标签: php mysql

我是PHP的新手,我正在尝试为我的网站开发一个登录系统。我已成功登录到我的网站,但现在我正在尝试整理我的代码并将数据库连接代码放在一个类中,并让其他php类访问一个数据库连接类。目前,我似乎无法连接到我的数据库。我试图通过添加相关的错误报告代码来查找错误,但没有输出任何内容。

如果有人能查看我的代码,看看我哪里出错了,我将不胜感激!

这是我的php类,用于检查用户名和密码 - checklogin.php

<?php

require_once(__DIR__. "/DBConnection.php");

class checklogin {

    public $count=0;

    public function checklogin() {

        ob_start();

        $db = DBConnection()->get_connection();


        $myusername=$_POST['myusername'];
        $mypassword=$_POST['mypassword'];

        $myusername = stripslashes($myusername);
        $mypassword = stripslashes($mypassword);
        $myusername = mysql_real_escape_string($myusername);
        $mypassword = mysql_real_escape_string($mypassword);

        $encrypt_password=md5($mypassword);

        $sql="SELECT id FROM members WHERE username='$myusername' and password='$encrypt_password'";
        $result=mysql_query($sql);
        $row=mysql_fetch_row($result);

        $this->count=mysql_num_rows($result);

        if($this->count==1){
        session_start();
        $_SESSION['ID']=$row[0];
        header("location:login_success.php");
        } else {
            $this->error(); 
        }
        ob_end_flush();

    }
}

?>

我正在尝试实现数据库连接并设置实例的类 - DBConnection.php

<?php

class DBConnection{

    private static $instance;

    private function __construct(){
        $host=".....";
        $username="....";
        $password=".....";
        $db_name=".....";

        mysql_connect("$host", "$username", "$password")or die("cannot connect");
        mysql_select_db("$db_name")or die("cannot select DB");
    }

    public static function get_connection(){
        if(empty (self::$instance)) self::$instance = new DBConnection;
        return self::$instance;
    }
}

?>

2 个答案:

答案 0 :(得分:1)

您可以这样调用static method

$db = DBConnection::get_connection();

这将为您提供数据库连接的实例。

答案 1 :(得分:0)

正确的方法是在更高级别创建数据库连接对象,然后将其作为参数传递给您的类。这称为依赖注入 - 您的类依赖于另一个(数据库),并且它会注入该对象。

基本上有两种方法可以注入该对象:对于绝对必须存在的任何内容,将其作为参数传递给构造函数。对于任何可选项或可能在内部创建默认值的任何内容,请使用setter方法。

例如:

class checkLogin {
    private $db;
    public function __construct(DBConnection $db) {
        $this->db = $db;
    }

    public function checklogin() {
    ... do anything with $this->db ...
    }
}

您当前的代码有几个主要缺点:

  1. DBConnection类正在实现单例。单身人士是一种糟糕的设计模式,如果可能的话应该避免使用。
  2. 您的DBConnection类不提供任何便利。它创建一个全局连接,但它不提供任何执行数据库查询的方法。
  3. 您正在使用mysql扩展程序。此扩展已弃用,将很快从默认PHP中删除。如果您希望代码能够在几年内运行,请使用mysqli或PDO。
  4. $db = DBConnection()->get_connection();对我来说看起来像语法错误。可能没有定义“DBConnection()”函数。当前正确的调用必须是静态的:DBConnection::get_connection(); - 但静态调用只是另一种形式的全局状态。它有效,但你迟早会得出它会伤害你的结论。