0

次のデータベースクエリは問題なく動作しますが、以前の別の質問で、必要のないときにグローバルを使用していることに気付きました。その理由は、保護された変数を使用しようとしましたが、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",
          "\n\n\n\n".$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",
            "\n\n\n\n".$e->__toString(), FILE_APPEND);

      }

  }

}

(クラスには で同じ接続文字列を使用する他の関数がありましたが$dbh、簡単にするためにそれらを削除しました)

4

3 に答える 3

1

global $dbh!を打つだけです。グローバルは通常、非常に悪い考えであり、コードの管理が難しくなります。

この場合、クラス プロパティを使用することをお勧めします (これはグローバルですが、このクラスでのみ使用できます)。

class DB
{
    protected $dbh;

    public function __construct()
    {
        $this->dbh = new PDO();
    }

    public function query()
    {
        return $this->dbh->query();
    }
}

ここでは多くのコードを削除して単純化しましたが、これにより、クラス プロパティが一般的にどのように機能するかがわかります。これについては、PHP.net マニュアルでも詳しく読むことができます。

于 2013-07-26T07:22:08.877 に答える
0

使用しないでくださいglobal $dbh

たとえば、DB クラスにプロパティを追加してから、protected $dbPDO インスタンスを内部に配置するだけで、オブジェクト内でのみ var$this->dbを使用できます。$dbこれは、ある種の「データベース モデル」を使用するための基本的な方法であり、Web から多くのチュートリアルを見つけることができます :)

例えば ​​:

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

于 2013-07-26T07:16:16.403 に答える
0

ほら..

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",
          "\n\n\n\n".$e->__toString(), FILE_APPEND);
    }
  }
}
于 2013-07-26T07:20:34.723 に答える