我是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;
}
}
?>
答案 0 :(得分:1)
答案 1 :(得分:0)
正确的方法是在更高级别创建数据库连接对象,然后将其作为参数传递给您的类。这称为依赖注入 - 您的类依赖于另一个(数据库),并且它会注入该对象。
基本上有两种方法可以注入该对象:对于绝对必须存在的任何内容,将其作为参数传递给构造函数。对于任何可选项或可能在内部创建默认值的任何内容,请使用setter方法。
例如:
class checkLogin {
private $db;
public function __construct(DBConnection $db) {
$this->db = $db;
}
public function checklogin() {
... do anything with $this->db ...
}
}
您当前的代码有几个主要缺点:
$db = DBConnection()->get_connection();
对我来说看起来像语法错误。可能没有定义“DBConnection()”函数。当前正确的调用必须是静态的:DBConnection::get_connection();
- 但静态调用只是另一种形式的全局状态。它有效,但你迟早会得出它会伤害你的结论。