0

したがって、php im では、クラスの作成時にデータベースに接続するデータベース クラスでパブリック変数を取得しようとしています。そのようです -

<?php

class database {    

    public $_link;


    public function __construct (){
       $this->_link = new PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "");
    }


}

と...

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

ユーザーでデータベースを拡張した場合、_link をプライベートにすれば明らかに参照でき、それは機能しますが、そのようなものを取得するためだけに継承する必要はないと思います..

私が取得しようとするたびに: Fatal error: Call to a member function prepare() on a non-object in /home/swinkidc/public_html/studentreach/core/authentication/user.php on line 18

前述のように、継承の方法を試してみると、それがこのようなことを行う素晴らしい方法だとは思えません。

何か提案はありますか?

ありがとう!

4

4 に答える 4

1

linkは実際には のプロパティであり、 のプロパティでは databaseありませんuser。したがって、次を使用します。

$query =  $this->db->_link->...
于 2013-05-14T15:25:10.040 に答える
0

依存関係を反転して $db をラップすることをお勧めします。

class database {

    private $_link;

    public function __construct(\PDO $pdo) {
        $this->_link = $pdo;
    }

    public function getLink() {
        return $this->_link;
    }

    //other useful stuff

}

class user {

    private $_db;

    public function __construct(\database $db) {
        $this->_db = $db;
    }

    public function getDB() {
        return $this->_db;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user) {
        $query = $this->getDB()->getLink()->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id'];
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user) {

    }

}

使用法

$user = new \user(new \database(new \PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "")));

これで、クラスの外部で db 接続を構成できるようになりました。

于 2013-05-14T15:38:23.307 に答える
0

あなたはちょうど$this->db->前に欠けています:

$query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");

これで動作するはずです。直接アクセスしようとしています。最初に を介してデータベース リンク保持オブジェクト$this->dbにアクセスし、次に プロパティ にアクセスします$_link

$_link短いために変数として必要な場合は、オブジェクト$this->db->_link$_link次のように割り当てます。

$_link = $this->db->_link;

getUserID 関数の開始時に、それも機能します。

于 2013-05-14T15:25:17.197 に答える
0

User クラスで、次のようなものを試してください。

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

_linkはUserの属性ではなく、 databaseの属性であるため、これは機能します。クラスデータベースを拡張すると、リンクのメソッドからアクセスできます (少なくとも Java では、PHP で同じ方法が機能するかどうかはわかりません)。ただし、インスタンス化するだけの場合はそうではありません。それは単なる基本的な OOP です。

幸運を。

于 2013-05-14T15:25:33.553 に答える