2
class dbConnection {
public $pdo;
public function __construct() {
    $this->dbConnect();
}
public function dbConnect() {
    if((count($_POST) == 6)&&($_GET['a'] == "connect")) {
        $host = $_POST['host'];
        $port = $_POST['port'];
        $username = $_POST['username'];
        $password = $_POST['password'];
        $database = $_POST['database']; 
        try{
                $this->pdo = new PDO('mysql:host='.$host.';dbname='.$database.';port='.$port, $username, $password );
                echo 'Connection successful!';
                return $pdo;
        }
        catch(PDOException $e){
                echo 'Error: ' . $e->getMessage();
        }   
    }
}
}

class Group extends dbConnection { //Class for group, for ex. employe and employers.
public $name;  // Name of group
public $pdo;

public function __construct ($_name, $conn) {
$this->pdo = $conn;
$this->name = $_name;

}

public function getGroupList() {
    if(isset($this->pdo)) {
        try
        {
            $conn = $this->pdo;
          $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //to catch exceptions

          $stmt = $pdo -> query('SELECT id, Name, Skills FROM '.$this->name); //sql query with group name
          $list = $stmt->fetchAll(PDO::FETCH_NUM); //fetch statement into array
          $stmt -> closeCursor();
          unset($stmt);
          return var_dump($list); //gives pure data
        }
        catch(PDOException $e) 
        {
          return 'There was some error: ' . $e->getMessage();
        }
    }
    else {
    $pdo;
    }
}

}

そして実行:

$conn = new dbConnection;
$workers = new Group("workers", $conn);
$workers->getGroupList();

エラーが発生します:

次の行で未定義のメソッドdbConnection::setAttribute()を呼び出します。

$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //to catch exceptions

私はそれを解決しようとしていますが、phpがPDOオブジェクトをメソッドとして扱う理由がわかりません。わからない。そして、私はもっと手紙を書かなければなりません。

4

2 に答える 2

0

$this->pdoそのコンテキストでは、dbConnectionオブジェクトを参照します。実際には、$this->connわかりやすくするために、名前をまたはそれに類似した名前に変更する必要があります。

これを修正するには、次のことを試してください。

$this->pdo->pdo->setAttribute();

または具体的には、コードのコンテキストで:

$conn->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

ただし、継承を誤って使用しているようにも見えます。

Groupクラスに接続を渡すのではなく、親コンストラクターを呼び出して、適切に初期化するようにし、定義ごとにpdoの値を設定する必要があります。

これを試して:

class Group extends dbConnection { //Class for group, for ex. employe and employers.
    public $name;  // Name of group

    public function __construct ($_name) {
        $this->name = $_name;
        parent::__construct();
    }

そこから$this->pdo、dbConnectionで定義されているとおりに参照できます

于 2012-12-02T00:09:43.400 に答える
0

何が起こっているのかというと、DBラッパークラスを渡して、そのクラスを実際のPDOオブジェクトとして使用しようとしているということです。もちろん、これは無効です。これはラッパーです。含まれているPDOオブジェクトが必要です。

一歩下がって、これらをどのように構成しているかを確認することをお勧めします。DBラッパーをサブクラス化または拡張する必要はありません。作成するときに、クラスに挿入するだけでよいと思います。(または、必要に応じてシングルトンクラスを作成します。これはよりクリーンであると思いますが、それは大きな議論を引き起こします)

編集:

そして、単純な「コードでこれを行う」ソリューションが必要な場合は、実際には次のようになります。

$conn=$this->pdo->pdo;
于 2012-12-02T00:09:56.217 に答える