我正在尝试为一个名为KobbyCloud的项目创建一个类,它将帮助我更轻松地选择用户数据。所以我所做的就是在类中创建一个函数,它在这个示例中基本上使用PDO来连接:
class KobbyCloud {
function connect($username, $password) {
return new PDO("mysql: host=localhost; dbname=kobbycloud; charset=utf8", $username, $password);
}
}
基本上,你要做的就是连接:
$kobbycloud = new KobbyCloud();
$kccn = $kobbycloud->("mysql-user", "mysql-pass");
这绝对没问题,事实上我甚至可以使用普通的PDO属性。就像prepare
...如果我要做$get_user = $kccn->prepare("...SQL...");
它会工作正常!
但是当我尝试在类中创建一个函数来获取用户数据时,问题仍然存在。在做SQL时我不知道选择器应该使用什么。
class KobbyCloud {
function connect($username, $password) {
return new PDO("mysql: host=localhost; dbname=kobbycloud; charset=utf8", $username, $password);
}
function user_data($sel) {
$get_user = ?????->prepare("SELECT * FROM `users` WHERE `uid`=1");
$get_user->execute();
return $get_user->fetch(PDO::FETCH_ASSOC);
}
}
你可以看到我把?????
放在哪里我遇到了麻烦......所以我认为解决办法是从function connect(...)
获得返回值,但我不知道如何去做。
我是PHP类的新手,所以感谢我提供的任何提示或说明。
答案 0 :(得分:1)
将连接存储在班级
中class KobbyCloud {
private $connection;
function connect($username, $password) {
if ($this->connection === null) {
$this->connection = new PDO("mysql: host=localhost; dbname=kobbycloud; charset=utf8", $username, $password);
}
return $this->connection;
}
function user_data($sel) {
$get_user = $this->connection->prepare("SELECT * FROM `users` WHERE `uid`=1");
$get_user->execute();
return $get_user->fetch(PDO::FETCH_ASSOC);
}
}
答案 1 :(得分:0)
问题是你几乎只是建造了一个工厂类。它可以帮助您创建PDO对象,但它不是数据库连接的模型。
有两种方法可以实现您的目标:
而不是返回PDO对象使您的类继承自PDO,然后您可以用您的新类替换应用程序中的任何PDO相关内容。这也允许您添加您可能需要的任何其他功能,然后通过$this
添加您可以访问PDO对象的那些功能。
public class KobbyCloud extends PDO { ... }
将您的班级用作实用程序。在这种情况下,它将完全无状态,并且您必须为PDO对象提供您执行的每个方法调用。
function user_data(PDO $pdo, $sel) { ... }
还有其他方法(如Mark所示),但这些方法是最直接的方法。总的来说,你似乎错过了OOP背后的想法,所以深入探讨这个话题可能是值得的。你选择的方法并不完全符合OOP的整体概念,这就是为什么你很难让它工作的原因。