0

私が持っているさまざまなクラスで使用できる、より優れた PDO db 接続を探しています。たとえば、私の現在のコードは次のようになります。

core.php

//Connecting to Database
        try {
        $db = new PDO("mysql:host=localhost;dbname=mydb", "project", "project123");
        } 
        catch(PDOException $e) {  
        echo $e->getMessage();  
        }  

クラスコア{

protected $db;
    public function __construct(PDO $db) {
    $this->db = $db;
    }

function redirectTo($page,$mode = 'response',$message = '') {
        if($message != '') {
        header('Location: '.SITEURL.'/'.$page.'?'.$mode.'='.urlencode($message));
        } else {
        header('Location: '.SITEURL.'/'.$page);         
        }
        exit();
}

}

これとは別に、wall.php と ticker.php の 2 つのクラスがあります。

class Wall {

protected $db;
    public function __construct(PDO $db) {
    $this->db = $db;
    }
function addComment($uid, $fid, $comment) {
$time = time();
$ip = $_SERVER['REMOTE_ADDR'];

$query = $this->db->prepare('INSERT INTO wall_comments (comment, uid_fk, msg_id_fk, ip, created) VALUES (:comment, :uid, :fid, :ip, :time)');
$query->execute(array(':comment' => $comment, ':uid' => $uid, ':fid' => $fid, ':ip' => $ip, ':time' => $time));

$nofity_msg = "User commented on the post";
$setTicker = Ticker::addTicker($uid,$nofity_msg,'comment');                 

    if($setTicker) {
    Core::redirectTo('wall/view-'.$fid.'/','error','Oops, You have already posted it!');        
    } else {
    Core::redirectTo('wall/view-'.$fid.'/','error','Oops, Error Occured');  
    }
}

}

そして ticker.php は次のとおりです。

class Ticker {  
    protected $db;
    public function __construct(PDO $db) {
    $this->db = $db;
    }


function addTicker($uid,$msg,$type) {
        $time = time();

        $query = $this->db->prepare('INSERT INTO tickers (uid_fk, message, type, created) VALUES (:uid, :message, :type, :time)');

        try {
                $query->execute(array(':uid' => $uid, ':message' => $msg, ':type' => $type, ':time' => $time));
                return $this->db->lastInsertId();
        }
        catch(PDOException $e) {  
                return 0;
        }  

}

}

ここで私の問題は、関数 addComment() を呼び出す必要があり、その関数内でクラス Ticker に存在する関数 addTicker() をさらに呼び出す必要があることです。以前のクラスなどで作成された db インスタンスが既に存在するため、これにより DB 接続の問題が発生しています。これを整理する方法がわかりません。

これは、メインのインデックス ファイルで使用しているコードです。

$core = new Core($db);
$ticker = new Ticker($db);
$wall = new Wall($db);

$wall->addComment($uid, $fid, $add_comment); // This statement is not working.. :(

私の意図は、共通のメイン DB 接続を持ち、その接続を他のクラスでさらに使用することです。それを行うより良い方法はありますか..?

4

1 に答える 1

0

以前のクラスで作成された db インスタンスが既に存在する

これは実際には単一のインスタンスですが、2 つの変数にコピーされます。

これにより、データベース接続の問題が発生しています

そのような問題についてもう少し確信を持ってもらえますか? 特にどのような問題がありますか?

于 2013-01-10T09:44:15.407 に答える