8

これを理解するのに問題があります。古い MySQL 関数コード PDO の書き直しを開始したいと思います。それが設定された方法は、この行を含む外部ファイルです(とりわけ):

// db.php file   

$DB = new dbConnect(SERVER,DB,USER,PASSWORD,3306);

function my_autoloader($class)
{
    require_once ($_SERVER['DOCUMENT_ROOT']."/includes/".'class.' . $class . '.php' );
}

spl_autoload_register('my_autoloader');

これにより、データベースへの接続が作成されます。これは私のページの一番上に含まれており、すべてのクラスもロードします。ここで、PDO を使用して新しい接続を作成する場合は、次のようにします。

$conn = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);

ただし、このコード行を別のファイルに配置して、次のようなクラス内から PDO を呼び出すことはできません。

require_once 'db.php';
class info
{

    protected $ID;

    public function __construct($id)
    {
        $this->ID = $id; // 
    }

    public function getName()
    {
        $query = "SELECT * FROM job";
        $q = $conn->query($query);
        $data = $q->fetch(PDO::FETCH_ASSOC);
            //do something with $data

    }
}

これは、次のような集約によってコンストラクターで接続を確立する必要があるということですか?

require_once 'db.php';
class info
{
    protected $ID;
    protected $pdo;

    public function __construct($id)
    {
        $this->ID = $id; // 
        $this->pdo = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
    }

    public function getName()
    {
        $query = "SELECT * FROM job";
        $q = $this->pdo->query($query);
        $data = $q->fetch(PDO::FETCH_ASSOC);
        // do something
    }
}

または、私が気付いていないこれを行う別の方法があります。これを組み込むためにすべてのクラスを書き直そうとするのは面倒です。

4

3 に答える 3

0

データベースへの接続を作成するときは、シングルトン クラスで行う必要があります。データベースへの接続を 1 つだけ開きたい場合。例えば:

public class database
{
    static $instance;

    public static function getInstance()
    {
          if($self::$instance == null)
          {
                $self::$instance = new PDO(); // string value here.
          }
          return $instance;
    }
}

その後、クラスのどこからでもメソッドを呼び出すことができdatabase::getInstance()、接続コードを何度も書き直す必要はありません。

PS: このシングルトンがスレッドセーフでないことは承知しています。OPのコンセプトを強調したかっただけです。

于 2013-05-29T19:24:37.927 に答える