4

この関数を使用して、必要に応じて MySQL データベースに接続し、同じ php スクリプトで必要になる可能性のあるクエリに同じ接続オブジェクトを再利用しています。

function cnn() {
    static $pdo;
    if(!isset($pdo)) {
        try {
            $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
            $pdo->setAttribute(PDO::ATTR_TIMEOUT, 30);
            $pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
            return $pdo;
        } catch(PDOException $e) {
            http_response_code(503);
            echo $e->getCode.': '.$e->getMessage();
            die(); //or whatever error handler you use
        }
    } else {
        return $pdo;
    }
}

最初のクエリ (オブジェクトが作成されます)

echo cnn()->query('SELECT firstname FROM user WHERE id=4;')->fetch(PDO::FETCH_COLUMN)

2 番目のクエリ (オブジェクトは再利用されます)

echo cnn()->query('SELECT title FROM news WHERE id=516;')->fetch(PDO::FETCH_COLUMN)

このアプローチに同意しますか?最適化できると思いますか?ご意見ありがとうございます。

4

1 に答える 1

3

多くの人がこの「シングルトン」アプローチは悪い、悪いと言うでしょうが、私はその方法に同意します。

ただし、私はあなたの実装に同意しません。そのはず:

function cnn() {
    static $pdo;
    if(!$pdo) {
        $conf = array(PDO::ATTR_TIMEOUT => 30,
                  PDO::ATTR_PERSISTENT => true,
                  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            );
        $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME;
        $pdo = new PDO($dsn, DB_USER, DB_PASS, $conf);
    } 
    return $pdo;
}

また、ハンドラー コードをハンドラーに移動することは賢明に見えます(もちろん、無条件にエラーをエコーすることはありません)。

function my_exceptionHandler($exception) {
    http_response_code(503);
    if (ini_get('display_errors')) {
        echo $e->getMessage().$e->getTrace();
    } else {
        log_error($e->getMessage().$e->getTrace());
    }
    die(); //or whatever error handler you use
}
set_exception_handler("my_exceptionHandler");

また、複数の接続を可能にするパラメーターを受け入れるように拡張します。

于 2013-06-03T04:01:15.427 に答える