4

私は MYSQL を使用した PDO を初めて使用します。ここに私の 2 つのファイルがあります。

データベースへの接続に使用する接続クラスがあります。

class connection{

private $host = 'localhost';
private $dbname = 'devac';
private $username = 'root';
private $password ='';  

public $con = '';

function __construct(){

    $this->connect();   

}

function connect(){

    try{

        $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password);
        $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);


    }catch(PDOException $e){

        echo 'We\'re sorry but there was an error while trying to connect to the database';
        file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND);

    }
}   
}

データベースからデータをクエリするために使用する account_info クラスがあります。

class account_info{


function getAccountInfo(){

    $acc_info = $this->con->prepare("SELECT * FROM account_info");
    $acc_info->execute();

    $results = $acc_info->fetchAll(PDO::FETCH_OBJ);

    foreach ($results as $key) {
        $results->owner_firstname;

    }
}       


}

これらのファイルの両方を index.php ページに含めます。

include_once 'classes/connection.class.php';
include_once 'classes/accountinfo.class.php';

$con = new connection();
$info = new account_info();
$info->getAccountInfo();

出力が得られません。スコープと関係があると思いますが、この PDO と OOP は初めてなので、修正する正しい理由がわかりません。前もって感謝します。

4

2 に答える 2

10

解決策 1

class account_info {と置き換えますclass account_info extends connection {

交換

$con = new connection();
$info = new account_info();

$info = new account_info();

そしてそれはうまくいくはずです。

解決策 2 (推奨)

この場合、依存性注入で問題を解決することを強くお勧めします。アカウント クラスを次のように置き換えるだけです。

class account_info {

    private $con;

    public function __construct(connection $con) {
        $this->con = $con->con;
    }

    public function getAccountInfo(){

        $acc_info = $this->con->prepare("SELECT * FROM account_info");
        $acc_info->execute();

        $results = $acc_info->fetchAll(PDO::FETCH_OBJ);

        foreach ($results as $key) {
            $results->owner_firstname;
        }
    }       

}

次のように index.php で使用します。

include_once 'classes/connection.class.php';
include_once 'classes/accountinfo.class.php';

$con = new connection();
$info = new account_info($con);
$info->getAccountInfo();

説明

一般的なルールとして、関数 (public、protected、または private) には常にスコープ キーワードを指定します。

最初の解決策は継承と呼ばれ、接続クラスからすべてのメソッドとプロパティを継承し、それらを簡単に使用できるようにするために、基本的に接続クラスでアカウント クラスを拡張しました。この場合、名前の競合に注意する必要があります。PHP マニュアルのクラス継承を参照することをお勧めします。

2 番目の解決策は依存性注入と呼ばれ、クラスの依存関係ツリーを明示的に定義するために、クラスがコンストラクターで他のクラスを受け入れるようにする、非常に推奨される設計パターンです (この場合、アカウントは接続に依存し、接続がなければ接続できません)。アカウントを機能させます)。

何千もの可能な解決策のもう1つは、誰かが下に投稿したもので、Singletonと呼ばれるデザインパターンです。ただし、そのパターンは最近アンチパターンとして再評価されており、使用すべきではありません。

于 2012-07-16T23:46:46.757 に答える
7

一般的な方法はsingleton、データベース クラスでパターンを使用することです。

このようなもの:

class connection {

   private static $hInstance;

   public static function getInstance() {
     if (!(self::$hInstance instanceof self)) {
         self::$hInstance = new self();
     }

     return self::$hInstance;
   }

   /* your code */
}

次に、単に使用できます

$database = connection::getInstance(); 
$database->con->prepare(....)

于 2012-07-16T23:44:47.693 に答える