4

これはばかげた質問かもしれませんが、私はPDOに非常に慣れておらず、混乱しています。ある関数でPDOオブジェクトをインスタンス化して(server / dbへの接続を開いて)、別の関数で同じ接続を閉じることは可能ですか?オブジェクトを閉じるには、関数にオブジェクトを渡す必要がありますか?これを実行して、接続を開始し、非汎用SQLを実行してから、別のサイト全体の関数で閉じることができる、ユビキタスなサイト全体の関数を作成できるようにします。これどうやってするの?オブジェクトを引数としてこれらの関数に渡す必要がありますか?

4

3 に答える 3

12

はい、可能です。MySQL への接続を開始するコンストラクタと、それを無効にするデストラクタを使用することをお勧めします。そうすれば、接続を開いたり閉じたりするたびに手動で関数を呼び出す必要がなくなります。オブジェクトの新しいインスタンスが呼び出されるたびに接続が開かれ、オブジェクトへの参照がなくなると、接続は無効になります。

次のようになります。

    private $l; //MySQL Connection

    //Called automatically upon initiation
    function __construct() {
        try {
            $this->l = new PDO("mysql:host=".MYSQL_HOST.";dbname=".MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD); //Initiates connection
            $this->l->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // Sets error mode
        } catch (PDOException $e) {
            file_put_contents("log/dberror.log", "Date: " . date('M j Y - G:i:s') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND);
            die($e->getMessage()); // Log and display error in the event that there is an issue connecting
        } 
    }

    //Called automatically when there are no further references to object
    function __destruct() {
        try {
            $this->l = null; //Closes connection
        } catch (PDOException $e) {
            file_put_contents("log/dberror.log", "Date: " . date('M j Y - G:i:s') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND);
            die($e->getMessage());
        }
    }

コンストラクタとデストラクタに関する次のリファレンスが役に立つかもしれません: http://php.net/manual/en/language.oop5.decon.php

于 2012-11-21T16:41:51.220 に答える
2

私の理解では、データベースに接続する必要があるのは1回だけで、関数ごとに接続を開く必要はありません。データベース接続は自動的に閉じますが、PDOオブジェクトにnull値を割り当てることで手動で閉じることができます。

PDOオブジェクトをインスタンス化すると、接続が確立されます。

$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);

スクリプトの最後またはnull値を割り当てると自動的に閉じられます

$dbh = null;

ここで役立つガイド

于 2012-11-21T16:35:10.033 に答える
1

たとえば、そのクラスで DBRoutines オブジェクトをインスタンス化するメイン ワーカー クラスを php に持つことができます。オブジェクト参照はワーカー内に保護された var/object として存在しますが、DB クラス内のすべての DB ルーチンに対して -> 呼び出しを行います。ライフサイクルの後半で DB::Close 関数を呼び出します。確かに。

index.php:

class Xcrud
{   protected static $firephp;
    protected static $_instance = array();

...

...

$db = Xcrud_db::get_instance($this->connection);

$db->query("SELECT `{$field}` FROM `{$this->table}` WHERE `{$this->primary}` = " . $db->escape($this->primary_key) . " LIMIT 1");

xcrud_db.php:

class Xcrud_db
{   protected static $firephp;
private static $_instance = array();
private $connect;
private $result;
private $dbhost;
private $dbuser;
private $dbpass;
private $dbname;
private $dbencoding;

public static function get_instance($params = false)
{   some code
}
private function __construct($dbuser, $dbpass, $dbname, $dbhost, $dbencoding)
{
    $this->firephp = FirePHP::getInstance(true);
    $this->firephp->setEnabled(true);
    //$this->firephp->log('xcrud_db.php:__construct');
    if (strpos($dbhost, ':') !== false)
    {
        list($host, $port) = explode(':', $dbhost, 2);
        $this->connect = mysqli_connect($host, $dbuser, $dbpass, $dbname, $port);
    } else
        $this->connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
    if (!$this->connect)
        $this->error('Connection error. Can not connect to database');
    $this->connect->set_charset(str_replace('-', '', $dbencoding));
    if ($this->connect->error)
        $this->error($this->connect->error);
}
public function query($query = '')
{
    $this->firephp->log('xcrud_db.php:query='.$query);
    $this->result = $this->connect->query($query); //echo $query;
    if ($this->connect->error)
        $this->error($this->connect->error);
    return $this->connect->affected_rows;
}
etc
于 2012-11-21T16:22:36.627 に答える