PHP Object Constructor数据库连接

时间:2013-08-13 17:45:13

标签: php database class oop constructor

我真的刚刚开始使用MySQLi进行OOP,我想出了这个问题。

这是我的代码:

Class Database{


public $mysqli;
public function __construct($db_host, $db_user, $db_password, $db_name){

    $this->con = new mysqli($db_host, $db_user, $db_password, $db_name);
   }
}

上面的代码正在运行。 但是当我需要实例化这个类时,我需要在我的主页面中声明我的主机名,用户名和数据库名称,这不是安全的,而且非常容易受到攻击(我猜)。

     $db = new Database("HostOfDatabase", "DBRoot", "", "databaseOfMine");

我只想问一下将数据库连接放在类构造函数中的正确方法是什么。我不太了解我在这个论坛中发现的其他解决方案。我希望有人可以启发我一点。干杯!

2 个答案:

答案 0 :(得分:0)

使用构造函数创建连接是可以的,但您可以查看Singleton模式以避免创建多个连接。

关于值,您应该使用常量或仅使用配置参数数组将它们存储在单独目录中的config.php文件中。因此,您将包含类文件,配置文件并使用config参数实例化DB类。

答案 1 :(得分:0)

我会尝试详细说明您在论坛上找到的其他解决方案,因为您说您并不真正了解它们。

请记住(假设您的网络服务器配置正确),您的PHP源代码无法从外部访问(即访问者无法访问)。因此,在源代码中存储凭据实际上没有任何内在错误。主要问题是如果您与其他任何人共享源代码,例如在Bitbucket或Github上。此外,任何对您的服务器具有文件访问权限的人(例如,可以坐在计算机上的人,或者可以将远程shell放入其中的人)都能够阅读这些文件。

标准方法是只设置一个代码库的配置文件(即,它不受版本控制,如果没有其他人可能正在使用或开发码)。所以它看起来像这样:

<?php

$db_host = "localhost";
$db_username = "blahblahblah";
$db_password = "whatever";
$db_name = "dbname";

?>

依此类推您需要的任何其他配置值。您可以将其存储在config.php中,为了增加安全性,请将其放在网络服务器的文档根目录之外。这样就无法从网上访问它。您还希望确保它只能由执行您的脚本的用户帐户读取,通常是webwwwapache

现在,当您需要配置值时,您可以include("config.php")直接访问变量。例如,它可能看起来像这样:

<?php
class Database{

    public function __construct(){
        require("config.php");
        $this->con = new mysqli($db_host, $db_user, $db_password, $db_name);
   }
}
?>

注意我require是函数内部的配置文件:这只是一点安全性,以确保配置文件中的变量只有函数本地范围,并且一旦函数返回就不再可访问