如何在此类中使用受保护的变量而不是"全局"?



我有下面的数据库查询,它运行良好,但在前面的另一个问题中,我注意到我使用的是全局查询,而不是必需的。原因是我试图使用受保护的变量,但作为OOP的新手,无法使其工作。

也许有人可以告诉我应该怎么做?

<?
class DB {
  public function __construct() {
    global $dbh;
    try {
      $dbh  = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass');
      $dbh  ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }
    catch(PDOException $e) {
      echo $e->getMessage();
    }
  }
  public function getFAQCats2Array() {
    global $dbh;
    try {
      $q = '
            SELECT
                `id`        AS ci,
                `name`      AS n
            FROM
                `faqcat`;
      ';
      $s = $dbh->query($q);
      // initialise an array for the results
      $A = array();
      while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
          $A[] = $r;
      }
      $s = null;
      return $A;
    }
    catch(PDOException $e) {
      echo  "Something went wrong fetching the list of FAQ categories from the database.n";
      file_put_contents(
          $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
          "nnnn".$e->__toString(), FILE_APPEND);
    }
  }
  public function getFAQ($i, $f) {
      global $dbh;
       try {
        $q = '
            SELECT
                '.$f.'
            FROM
                faq
            WHERE
                id = ?
        ';
        $s = $dbh->prepare($q);
        $s->execute(array($i));
        //$s->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $r = $s->fetch();
        return $r[$f];
      }
      catch(PDOException $e) {
        echo  "Something went wrong fetching the FAQ answer from the database.n";
        file_put_contents(
            $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
            "nnnn".$e->__toString(), FILE_APPEND);
      }
  }
}

(该类中还有其他函数在$dbh中使用相同的连接字符串,但为了简化起见,我删除了它们)

您可以简单地敲击global $dbh!全局变量通常是一个非常糟糕的主意,会使您的代码更难维护。

在这种情况下,我建议使用类属性(它有点全局,但仅在此类中):

class DB
{
    protected $dbh;
    public function __construct()
    {
        $this->dbh = new PDO();
    }
    public function query()
    {
        return $this->dbh->query();
    }
}

我在这里精简了很多代码,但这应该让您了解类属性的一般工作方式。你也可以在PHP.net手册上读到很多关于这方面的内容。

不要使用global $dbh

只需在DB类中添加一个属性,例如protected $db,然后将PDO实例放在$this->db中,因为您只能在对象中使用$db var。这是使用某种"数据库模型"的基本方法,在那里你可以通过网络找到大量教程:)

例如:

public __construct($db_type = 'mysql', $host = 'my_server', $database = 'db_name', $user = 'my_user', $pwd = 'password') {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $dsn = $db_type.':host=' . $host . ';dbname=' . $database . '';
    try {
        $this->db = new PDO($dsn, $user, $pwd, $pdo_options);
    } catch (Exception $e) {
        'Unable to connect to database';
    }
}

然后在全局范围内创建对象的实例,脚本在其中使用它:

$db_manager = new DB('mysql','localhost','my_db','root','password');

然后您的$db_manager将能够使用DB类的公共方法

好了。。

class DB {
  protected $dbh;
  public function __construct() {   
    try {
      $this->dbh  = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass');
      $this->dbh  ->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }
    catch(PDOException $e) {
      echo $e->getMessage();
    }
  }
  public function getFAQCats2Array() {  
    try {
      $q = '
            SELECT
                `id`        AS ci,
                `name`      AS n
            FROM
                `faqcat`;
      ';
      $s = $this->dbh->query($q);
      // initialise an array for the results
      $A = array();
      while ($r = $s->fetch(PDO::FETCH_ASSOC)) {
          $A[] = $r;
      }
      $s = null;
      return $A;
    }
    catch(PDOException $e) {
      echo  "Something went wrong fetching the list of FAQ categories from the database.n";
      file_put_contents(
          $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt",
          "nnnn".$e->__toString(), FILE_APPEND);
    }
  }
}

相关内容

  • 没有找到相关文章

最新更新