【发布时间】:2021-03-03 13:21:15
【问题描述】:
我在 PHP 中有一个类,其中一种方法需要访问数据库。如何正确地将数据库连接变量传递给方法?它是否通过构造函数或方法作为参数传递?还是完全不同?
【问题讨论】:
-
是的,有可能,请参阅我提供的答案
标签: php class dbconnection
我在 PHP 中有一个类,其中一种方法需要访问数据库。如何正确地将数据库连接变量传递给方法?它是否通过构造函数或方法作为参数传递?还是完全不同?
【问题讨论】:
标签: php class dbconnection
检查以下更新的答案。经过测试并且可以正常工作。
<?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();
我的结果:
【讨论】:
如果数据库连接仅由对象的一种方法使用,则将其作为参数传递给该方法没有任何问题。
但是,大多数情况下并非如此。因此,当您在较早阶段(在脚本之上)建立数据库连接,然后将其作为构造函数参数传递给所有需要它的对象时,您会更好。然后,各种对象也可以为各种方法和内部私有方法使用相同的连接。
如果您想进一步优化,请将连接包装到专用类中,并使用依赖注入将其放入消费者对象中。
【讨论】: