gpt4 book ai didi

PHP 面向对象 : Duplicate Code in a Class

转载 作者:行者123 更新时间:2023-12-01 00:52:07 25 4
gpt4 key购买 nike

我有一个带有两种方法的 PHP 类。一个连接到 MySQL 数据库进行输出,另一个连接到 MySQL 数据库进行输入。

我的问题是,对于这两个函数,我都重复了连接数据库的代码。有什么更好的方法可以让类中的第三个函数连接到数据库并让另外两个函数调用该函数来建立连接,而不是重复代码两次?我是 PHP n00b,试图改进我的 OOP 编码。请注意我是如何连接到数据库两次的——使用完全相同的代码:

class output_mysql {
var $db_name = 'database';
var $db_username = 'name';
var $db_password = 'mypassword';

function print_table_cell($tbl_name, $colm_name, $array_index_num) {
try {
$pdo = new PDO("mysql:host=localhost;dbname=$this->db_name", $this->db_username, $this->db_password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
$error = 'Unable to connect to the database server.';
include 'output_mysql_error.php';
exit();
}
try {
$sql = "SELECT $colm_name FROM $tbl_name";
$result = $pdo->query($sql);
}
catch (PDOException $e) {
$error = 'Error fetching content: ' . $e->getMessage();
include 'output_mysql_error.php';
exit();
}
while ($row = $result->fetch()) {
$all_content[] = $row["$colm_name"];
}
echo $all_content[$array_index_num];
}

function update_content($tbl_name, $colm_name, $error_message_text, $id_num) {
try {
$pdo = new PDO("mysql:host=localhost;dbname=$this->db_name", $this->db_username, $this->db_password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
$error = 'Unable to connect to the database server.';
include 'output_mysql_error.php';
exit();
}
try {
$sql = 'UPDATE website_content SET
content = :content,
date_added = CURDATE()
WHERE id = :id';
$s = $pdo->prepare($sql);
$s->bindValue(':content', $error_message_text);
$s->bindValue(':id', $id_num);
$s->execute();
}
catch (PDOException $e) {
$error = 'Error: ' . $e->getMessage();
include 'output_mysql_error.php';
exit();
}
}
}

最佳答案

这个问题被标记为[oop],但其中的代码与OOP 相去甚远。

您的方法做得太多了。你应该做的是将数据库连接注入(inject) output_mysql 类的构造函数(顺便说一句,这是一个糟糕的名字)。

namespace App\Page;

class Content
{
private $dbConnection;

public function __construct(\PDO $dbConnection)
{
$this->dbConnection = $dbConnection
}

public update($id, $content)
{
$stmt = $this->dbConnection->prepare('UPDATE website_content SET content = :content, date_added = CURDATE() WHERE id = :id');
$stmt->execute([
'id' => $id,
'content' => $content,
]);
}

}

$dbConnection = new \PDO("mysql:host=localhost;dbname=$this->db_name", $this->db_username, $this->db_password);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$pageContent = new \App\Page\Content($dbConnection);
$pageContent->update(1, 'new content');

如果您有一个名为 print_table_cell 的方法,您可能在 OOP 上做错了,因为这可能意味着您的代码做的太多并且可能违反了 Single Responsibility Principle .我的意思是,几乎在所有情况下,一个类都不需要能够访问任何表的任何列。

关于PHP 面向对象 : Duplicate Code in a Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14522831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com