在php中从类内的数据库获取数据

qxsslcnc  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(425)

如何从类内的数据库中获取数据?
我有一个 users 我希望以面向对象的方式访问这些数据。这意味着我不想一直在我的代码中编写查询,相反,我想通过let say获取这些数据 $Users->getUserById(2)->getName(); 但问题是我无法在这些类中建立数据库连接。

  1. $pdo = new PDO("mysql:host=ipofdatabase;dbname=nameofdatabase", "username", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
  2. class Users {
  3. public function usersList() {
  4. $db_users = $pdo->query("SELECT id, username, mail FROM users");
  5. $users = array();
  6. foreach ($db_users as $u) {
  7. $users[] = array(
  8. 'id' => $u['id'],
  9. 'username' => $u['username'],
  10. 'mail' => $u['mail']
  11. );
  12. }
  13. }
  14. public function getUserById($id) {
  15. return new User($id);
  16. }
  17. }

我想要那个 $Users->usersList() 输出一个包含所有数据的数组,但是我得到一个错误,即第3行中的变量$pdo未定义。
注意:第6行的c:\apache\docs\users.php中的未定义变量:pdo
我应该在每个类中建立数据库连接吗?这不是一个性能的打击吗?

vatpfxk5

vatpfxk51#

我会这样做。创建一个模型来存储“用户”数据。然后userhandler可以加载并跟踪这些模型。
此外,对dh的引用可以传递给userhandler构造,以保留来自脚本另一部分的连接。

  1. <?php
  2. class User{
  3. public $id;
  4. public $username;
  5. public $mail;
  6. public function __construct( $sArg_Id = "", $sArg_UserName = "", $sArg_Mail = "" ) {
  7. $this->id = (int)$sArg_Id;
  8. $this->username = $sArg_UserName;
  9. $this->mail = $sArg_Mail;
  10. }
  11. }
  12. class UserHandler {
  13. // hold references to our user objects
  14. public $aUsers = array();
  15. // hold a ref to DataHandler
  16. public $oDH = null;
  17. private $bDHInit = false;
  18. public function __construct( &$oArg_DH = null ) {
  19. // if reference passed, and if not already init
  20. if($oArg_DH && !$this->bDHInit){
  21. $this->oDH = $oArg_DH;
  22. $this->bDHInit = true;
  23. }
  24. }
  25. public function usersList() {
  26. $this->InitDH();
  27. $db_users = $this->oDH->query("SELECT id, username, mail FROM users");
  28. // add a new user object to aUsers array
  29. foreach ($db_users as $u) {
  30. $this->aUsers[$u['id']] = new User($u['id'], $u['username'], $u['mail']);
  31. }
  32. }
  33. public function getUserById($id) {
  34. if(isset($this->aUsers[$id])){
  35. return $this->aUsers[$id];
  36. }else{
  37. // load user id, or return new user object with id
  38. // return new User($id);
  39. }
  40. return false;
  41. }
  42. public function InitDH(){
  43. // I would also create a DataHandler class to wrap some of the PDO methods
  44. if(!$this->bDHInit){
  45. $this->oDH = new PDO(
  46. "mysql:host=ipofdatabase;dbname=nameofdatabase",
  47. "username",
  48. "password",
  49. array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
  50. $this->bDHInit = true;
  51. }
  52. }
  53. }
展开查看全部
ruyhziif

ruyhziif2#

你需要创建一个 __construct 函数以到达pdo。你宣布 $pdo 类外的变量。类可以访问其中的内容。

  1. class Foo
  2. {
  3. protected $pdo; # here we define PDO as part of the class scope.
  4. public function __construct()
  5. {
  6. # we then assign $pdo to be a PDO instance
  7. $this->pdo = new \PDO('mysql:hostname=localhost;dbname=foobar', 'user', 'pass');
  8. }
  9. public function doSomething()
  10. {
  11. # we then use the $pdo var using $this->pdo
  12. $this->pdo->prepare('SELECT * FROM `table`');
  13. # etc.
  14. }
  15. }
展开查看全部

相关问题