2017-03-02 8 views
1

私はPHPで新しく、最近エラーが発生しています。以下の私のコードを見てください。要約PDOリポジトリファイルエラー

オブジェクトコンテキストでない場合は$ thisを使用しています

この

は私がこのsetting.php私はそのクラスのPDORepositoryにアクセスするために何をすべき

<?php 
    abstract class PDORepository{ 
     const USERNAME="xxxx"; 
     const PASSWORD=""; 
     const HOST="xxxxxx"; 
     const DB="xxxxx"; 

     private function getConnection(){ 
      $username = self::USERNAME; 
      $password = self::PASSWORD; 
      $host = self::HOST; 
      $db = self::DB; 
      $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password); 
      return $connection; 
     } 

     protected function queryList($sql, $args){ 
      $connection = $this->getConnection(); 
      $stmt = $connection->prepare($sql); 
      $stmt->execute($args); 
      return $stmt; 
     } 

    } 

?> 

に名前を付けるのindex.php

<?php 
     require_once ('setting.php'); 


     try{ 

      $sql = "CREATE TABLE users (
       user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
       account VARCHAR(30) NOT NULL, 
       password VARCHAR(30) NOT NULL, 
       )"; 

      $result = $this->db->getConnection()->execute($sql); 

     }catch(Exception $e){ 
      echo " " . $e->message(); 
     } 

    ?> 

です。私は抽象クラスを使うことについて話しているところがあります。しかしこれはこれに似ていません。ご協力ありがとうございました!初心者ここ!

+0

私はこのクラスが抽象である理由を実際には知りません。さらに、[あなたの最初のデータベースラッパーの子供の病気](https://phpdelusions.net/pdo/common_mistakes) –

+0

^。他のノート '$ this'はあなたが現在使っているオブジェクトを指します。index.phpではあなたはオブジェクトコンテキストにいないので、$ thisは定義されていません。抽象クラスは、クラス内で期待される機能を完成させるために拡張する必要がある基本クラスを作成する方法として使用されます。あなたのクラスは通常の(または最終的な)クラスでなければなりません。 '$ db = new PDORepository;'でインスタンス化する必要があります。次に、getConnectionメソッドがprivate(オブジェクト内でのみアクセス可能)であるといういくつかの問題が発生します。私は簡単に始めて、コードを頻繁にテストすることをお勧めします。 – JimL

+2

全体として、このコードは単なる演算子の山であり、ランダムに一緒に叩かれています。しばらくの間、バニラPDOで練習することをお勧めします。それはあなたに頭痛の多くを保存します。レコードのためだけに:$ thisの問題はこちらの唯一の問題ではありません –

答えて

1

最初の問題は、抽象クラスをインスタンス化できないため、抽象クラスを継承する「具体的な」クラスが必要です。だから私はPDORepositoryを拡張するクラスUserRepositoryを作成します。

<?php //pdorepository.php 
    abstract class PDORepository{ 
     const USERNAME="xxxx"; 
     const PASSWORD=""; 
     const HOST="xxxxxx"; 
     const DB="xxxxx"; 
     private $conn; 
     private function getConnection(){ 
      if (!$this->conn) { 
       $username = self::USERNAME; 
       $password = self::PASSWORD; 
       $host = self::HOST; 
       $db = self::DB; 
       $this->conn = new PDO("mysql:dbname=$db;host=$host", $username, $password); 
      } 
      return $this->connection; 
     } 

     protected function execute($sql, $args = null) { 
      return $this->getConnection()->prepare($sql)->execute($args); 
     } 
    } 

?> 

今、あなたのuserrepositoryに、私たちはindex.phpのからあなたのコードを配置します、とあなたは今、オブジェクトの内側に物事をやっているので、これら二つのCLAで、今

<?php //userrepository.php 
    require_once 'pdorepository.php'; 
    class UserRepository extends PDORepository{ 
     public function init() { 
      $sql = "CREATE TABLE users (
         user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
         account VARCHAR(30) NOT NULL, 
         password VARCHAR(30) NOT NULL, 
        )"; 
      try { 
       $this->execute($sql); 
      } catch(Exception $e){ 
       echo " " . $e->message(); 
      } 
     } 

?> 

:、あなたがエラーを取得せずに$thisを使用することができますSSESは、あなたがUserRepositoryのインスタンスをインスタンス化することができ、そして、あなたはそれにメソッドを呼び出すことができます。

<?php //index.php 

require_once 'userrepository.php' 
$repository = new UserRepository(); 
$repository->init(); 
+0

ユーザーはデータベースAPIではないため、後者を拡張しないでください。 –

+0

@YourCommonSenseまずは、まったく新しいプログラマーなので、ソフトウェアアーキテクチャーの答えはあなたのところには役立つかもしれませんが、この質問に賛同すれば意味がありません。第二に、ユーザーは私が書いたクラスではない、私はuserrepositoryを書いた。リポジトリは、「データが格納および管理される中心的な場所」として定義されています。私はデータベースがその定義を満たしていると思います。 – dave

+0

あなたはそうです。私はそれを見落とした、私は残念です。 –

-1

私は一般的に、適切なアーキテクチャを説明する正しいDaveの答えに感謝、残念ながら、特定のコードは、むしろ非ですそれはOPから多くの問題を残しているからです。

<?php 
abstract class PDORepository 
{ 
    protected $pdo; 

    public function __construct(\PDO $pdo) 
    { 
     $this->pdo = $pdo; 
    } 
    protected function _sql($sql, $args = null) 
    { 
     if (!$args) { 
      return $this->pdo->query($sql); 
     } 
     $stmt = $this->pdo->prepare($sql); 
     $stmt->execute($args); 
     return $stmt; 
    } 
} 
pdorepository.php

<?php 
$user = 'root'; 
$pass = ''; 
$dsn = "mysql:dbname=test;host=localhost;charset=utf8"; 
$opt = array(
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    PDO::ATTR_EMULATE_PREPARES => FALSE, 
); 
$pdo = new PDO($dsn, $user, $pass, $opt); 

:我々はPDOクラスのインスタンスを作成します

pdo.php

それが適切にするために、我々は3つのファイルが必要になります

ユーザーリポジトリ.php

<?php 
require_once 'pdorepository.php'; 
class UserRepository extends PDORepository 
{ 
    public function init() 
    { 
     $sql = "CREATE TABLE users (
        user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        account VARCHAR(30) NOT NULL, 
        password VARCHAR(30) NOT NULL 
       )"; 
     $this->_sql($sql); 
    } 
} 

、最終的に我々のアプリケーションのファイル:ここで

<?php 
require_once 'pdo.php'; 
require_once 'userrepository.php'; 

$repository = new UserRepository($pdo); 
$repository->init(); 

非常に重要であるだけたら、データベース接続が行われます。また、マイナーな問題も多数修正されています。これは実用的なコードです。