PHP数据库连接类问题

l3zydbqr  于 2022-12-21  发布在  PHP
关注(0)|答案(3)|浏览(105)

我正在为我的一个客户端编写一个Web应用程序,我决定将数据库连接保存在一个类中。下面的代码是我所拥有的:

class databaseConnection {
    private $hostname = 'hn.app.dev';
    private $username = 'root';
    private $password = '';
    private $database = 'hn_app_dev';
    public function connect() {
        $host = mysqli_connect($this->hostname, $this->username, $this->password);
        if ($host) {
            $connection = mysqli_select_db($host, $this->database);
            if (!$connection) {
                die('An error occured while trying to connect to the database.');
            }
            return $connection;
        }
    }
}

我使用mysqli_query的标准PHP函数向数据库发送查询。我使用以下代码向数据库发送查询:

function fetch_from_db($query) {
    $connection = new databaseConnection();
    $query = mysqli_query($connection->$connection, 'QUERY');
}

我刚开始在代码中使用类。我还在学习,就像我们大家一样。我已经检查了,但没有找到解决我的问题的方法。我知道问题是什么:这是一个类作为对象的问题,并且与从它获取返回的$connection变量有关。
我如何解决这个问题,以便我可以正确地连接到我的数据库?另外,谁能告诉我一些文档的方向,我可以学习修复,以便我可以在未来解决这个问题。
谢谢大家!

8ftvxx2r

8ftvxx2r1#

有许多不同的方法可以编写对象来处理数据库的连接和查询。
最重要的是你想达到什么目标。
我想这些会是你想拥有的一些功能。

  • 单一连接
  • 运行SQL并返回mysqli结果。
  • 对转义值的连接的访问。
  • 看起来您希望将凭据存储在对象本身中(我建议将它们作为__construct()中的值传入

这是一些基本的功能,可以很容易地扩展apon.

class databaseConnection {
    //private $hostname = 'hn.app.dev';
    //private $username = 'root';
    //private $password = '';
    //private $database = 'hn_app_dev';

    private $connection; // this is where the object will store the connection for other methods to access it
    
    public function __construct($host, $username, $password, $database)
    //public function connect() {
        $this->connection = mysqli_connect($host, $username, $password);
        if ($host) {
            $this->connection->select_db($database); 
            if (!$this->connection) {
                die('An error occured while trying to connect to the database.');
            }
            return $connection;
        }
    }

    // this is so databaseConnection $db can access the connection for escaping MySQLi SQL
    public function connection(){
         return $this->connection;
    }

    function fetch_from_db($query) {
        //$connection = new databaseConnection(); // I don't believe you really want to create a instance of this object inside of itself
        //$query = mysqli_query($connection->$connection, 'QUERY');
        $query = $this->connection->query($query); // we will use the object oriented style instead of the above procedural line
        return $query; // return the results to the $results var in the bottom example
    }

    // this is a magic function that is called when the object is destroyed, so we will close the connection to avoid to many connections
    function __destruct(){
      $this->connection()->close();
    }
}

// make a new datbaseConnection class with specific credentials
$db = new databaseConnection('localhost', 'someuser', 'somepass', 'somedb');
$sql = 'SELECT * FROM tableName LIMIT 100';

// call the fetch_from_db function from the new databaseConnection $db
$results = $db->fetch_from_db($sql);

// print the results
while($result = $results->fetch_assoc()){
  print_r($result); // print_r on each row selected from db
}

您可以在手册中学习更多关于OOP和PHP对象的知识,并且在线上有许多教程专门介绍管理数据库连接和查询的类。

希望这有帮助!

omqzjyyz

omqzjyyz2#

如果你想把它保存在一个类中,你永远不要调用connect()函数,但是如果你想在初始化类时连接它,把connect()函数改为__construct(),并删除return,把它赋给一个公共变量。

class databaseConnection {
    private $hostname = 'hn.app.dev';
    private $username = 'root';
    private $password = '';
    private $database = 'hn_app_dev';
    public $connection;
    public function __construct() {
        $host = mysqli_connect($this->hostname, $this->username, $this->password);
        if ($host) {
            $connection = mysqli_select_db($host, $this->database);
            if (!$connection) {
                die('An error occured while trying to connect to the database.');
            }
            $this->connection = $host;
        }
    }
}

之后,您可以在函数中获取数据库连接,如下所示:

function fetch_from_db($query) {
    $connection = new databaseConnection();
    $query = mysqli_query($connection->connection, 'QUERY');
}

现在,在说了所有这些之后,你不想在每个函数中创建一个新的示例来访问数据库,所以可以使它成为静态的,并创建一个init()函数,这样它在整个应用程序中占用更少的内存。
对于类文档,PHP的Classes/Objects页面会有帮助。特别是“示例”链接。

ttcibm8c

ttcibm8c3#

<?php

class databaseConnection {
    private $hostname = 'localhost';
    private $username = 'root';
    private $password = '';
    private $database = 'onlinylh_sggsfaculty';
    public function connect() {
        $host = mysqli_connect($this->hostname, $this->username, $this->password,$this->database);
        if ($host) {
            return $host;
        }
        else{
            echo "Error";
        }
    }
}
function fetch_from_db($query) {
    $conn = new databaseConnection();
    $r = mysqli_query($conn->connect(), $query);
}
fetch_from_db()
?>

这对我很有效。

相关问题