2012-12-02 2 views
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; 
    } 
} 

} 

et exécution:Appel à la méthode non définie PDO :: setAttribute()

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

J'obtiens l'erreur:

Call to undefined method dbConnection::setAttribute() on line:

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

J'essaie de résoudre ce, Je ne sais pas pourquoi php traite l'objet PDO comme une méthode. Je n'ai aucune idée. Et je dois écrire plus de lettres. Dans ce contexte, un objet dbConnection est référencé par un objet dbConnection. Dans ce contexte,

Répondre

0

. Vraiment, vous devriez changer le nom à $this->conn ou quelque chose de similaire pour plus de clarté.

Pour résoudre ce problème, essayez:

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

ou plus précisément, dans le contexte de votre code:

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

Cependant, il semble également que vous utilisez l'héritage de manière incorrecte. Plutôt que de passer une connexion à la classe Group, vous devriez appeler le constructeur parent pour qu'il s'initialise correctement, en définissant la valeur de pdo pour sa définition.

Essayez ceci:

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(); 
    } 

À partir de là, vous pouvez faire référence $this->pdo comme il est défini dans dbConnection

+0

J'ai utilisé celui-ci. Mais merci à la fois pour la clarification, j'apprendrai la classe singleton l'autre jour. – maszynka

0

Ce qui se passe est que vous passez dans votre classe wrapper DB, puis essayer d'utiliser cette class comme l'objet PDO réel. Ce qui, bien sûr, n'est pas valide. C'est un wrapper - vous voulez l'objet PDO qu'il contient.

Je vous recommande de prendre du recul et de voir comment vous les composez. Vous ne voulez pas sous-classer ou étendre votre encapsuleur DB, je pense que vous devriez juste l'injecter dans les classes comme vous les faites. (Ou écrire une classe singleton, si vous préférez - je trouve que pour être plus propre, mais qui déclenche un argument énorme)

Edit:

Et si vous voulez un simple « faire cela avec votre code 'solution, c'est en fait:

$conn=$this->pdo->pdo; 
Questions connexes