【问题标题】:How do I pass a database connection into a method PHP如何将数据库连接传递给 PHP 方法
【发布时间】:2021-03-03 13:21:15
【问题描述】:

我在 PHP 中有一个类,其中一种方法需要访问数据库。如何正确地将数据库连接变量传递给方法?它是否通过构造函数或方法作为参数传递?还是完全不同?

【问题讨论】:

  • 是的,有可能,请参阅我提供的答案

标签: php class dbconnection


【解决方案1】:

检查以下更新的答案。经过测试并且可以正常工作。

  <?php

class SomeClass
{


    function setDb($servername, $username, $password, $database)
    {
        // Create the database connection and use this connection in your methods as $this->conn
        $this->conn = new mysqli($servername, $username, $password, $database);
        if ($this->conn->connect_error) {
            die("Connection failed: " . $this->conn->connect_error);
        }
        echo "New successful connection to myDb  \n";
    }

    public function createTable()
    {
        // sql to create table
        $sql = "CREATE TABLE MyGuests (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    firstname VARCHAR(30) NOT NULL,
    lastname VARCHAR(30) NOT NULL,
    email VARCHAR(50),
    reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )";

        if ($this->conn->query($sql) === TRUE) {
            echo "New table created successfully \n";
        } else {
            echo "Error: " . $sql . "<br>" . $this->conn->error;
        }
    }
    public function normalInsertDb()
    {
        // sql to insert record using normal query
        $sql = "INSERT INTO MyGuests (firstname, lastname, email)
        VALUES ('John', 'Doe', 'john@example.com')";

        if ($this->conn->query($sql) === TRUE) {
            echo "New record inserted successfully using normal sql statement \n";
        } else {
            echo "Error: " . $sql . "<br>" . $this->conn->error;
        }
    }
    public function preparedInsertDb()
    {
        // prepare and bind
        $stmt = $this->conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $firstname, $lastname, $email);
        // set parameters and execute
        $firstname = "John";
        $lastname = "Doe";
        $email = "john@example.com";
        $stmt->execute();

        $firstname = "Mary";
        $lastname = "Moe";
        $email = "mary@example.com";
        $stmt->execute();

        $firstname = "Julie";
        $lastname = "Dooley";
        $email = "julie@example.com";
        $stmt->execute();

        echo "New records inserted successfully using PREPARED STATEMENTS \n";

        $stmt->close();
        $this->conn->close();
    }
}

$obj = new SomeClass();
$obj->setDb('localhost', 'homestead', 'secret', 'myDb'); //we assume the database myDb exists
$obj->createTable();
$obj->normalInsertDb();
$obj->preparedInsertDb();

我的结果:

【讨论】:

  • 这是在方法内部运行的吗?
  • 这绝对不能回答问题
  • @Benni,当然,我已经编辑了我的答案,现在它绝对回答了这个问题。经过测试。虽然它看起来不是一个很好的方法
  • @Alex,请测试并确认它确实有效。或者,您可以通过构造函数传递连接变量。如果您需要更多帮助,请告诉我。
  • @Lawrence Njenga 我可能执行不正确,但我正在使用准备好的语句,并且我不断收到多个错误,以 --Warning: mysqli_stmt_bind_param() 期望参数 1 为 mysqli_stmt,给定对象。我传递的只是连接变量、将要传入的数据类型以及要传入的变量。
【解决方案2】:

如果数据库连接仅由对象的一种方法使用,则将其作为参数传递给该方法没有任何问题。

但是,大多数情况下并非如此。因此,当您在较早阶段(在脚本之上)建立数据库连接,然后将其作为构造函数参数传递给所有需要它的对象时,您会更好。然后,各种对象也可以为各种方法和内部私有方法使用相同的连接。

如果您想进一步优化,请将连接包装到专用类中,并使用依赖注入将其放入消费者对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2012-08-02
    • 1970-01-01
    • 2021-01-01
    • 2013-05-19
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多