0

これは、pdo ext を使用してデータベースに接続するための私の db クラスです。

class db
{
    private $host;
    private $dbname;
    private $username;
    private $password;

    public function __construct($host,$db,$name,$pass)
    {
         $this->host=$host;
         $this->dbname=$db;
         $this->username=$name;
         $this->password=$pass;
         $dsn = 'mysql:'.$this->dbname.';'.$this->host;
         try 
         {
            $conn = new PDO($dsn, $this->username, $this->password);


            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         } 
         catch(PDOException $e) 
         {
              echo 'ERROR: ' . $e->getMessage();
         }
 }
}

このようにログインクラスでdbクラスを呼び出します...

$host='localhost';
        $db='techy_issue_tracker';
        $name='root';
        $pass='';
        $base= new db($host,$db,$name,$pass);

ここに問題があります.loginクラス(拡張dbクラス)内でpdoクエリを作成するには、次の行を使用します...

$stmnt = $conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');

という 2 つのエラーが生成されます.. 注意: 未定義の変数: conn... と 致命的なエラー: 非オブジェクトでのメンバー関数 prepare() の呼び出し...

すべての pdo を login クラス内に配置するだけでこれを修正できますが、まだ興味があります...どうやってオブジェクト (pdo クラスのインスタンスですか?) を別のクラスから呼び出しますか?

PDO を使用した PHP クラス ベースのユーザー システム - 非オブジェクトでメンバー関数 prepare() を呼び出すこの質問は興味深いですが、あまり理解していません :/

OOPをあまり練習しなかったので、良い説明をいただければ幸いです! ありがとう。

4

3 に答える 3

3

$connクラスのパブリック プロパティとして初期化する必要がありますdb

クラスのプライベート プロパティの後に、dbこれを追加します。

public $conn;

次に、try catch 内で次のように変更$conn$this->connます。

$this->conn = new PDO($dsn, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

次に、クラスを正しく拡張したと仮定すると、次の方法でdbアクセスできます。conn

$stmt = $db->conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');

于 2012-12-27T23:47:18.030 に答える
0

SQL文字列を取り込んでオブジェクトの配列を返すメソッドをdbクラスに追加してみませんか。そのメソッドですべてのステートメントを実行するだけです。その後、ログイン クラスはこのメソッドを呼び出すだけで、任意のクエリを実行できます。データベース接続がどのように実装されているかを知る必要はありません。将来、基礎となる実装を変更したい場合は、このようにします。db クラスにのみ影響します。すべてのデータベース アクセスは db クラスを経由するため、ログイン クラスに大きな変更を加える必要はありません。

于 2012-12-28T00:55:49.257 に答える