Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pola kelas MySQLi untuk koneksi, tutup, biarkan terbuka?

Saya akan menganggapnya bukan praktik yang baik. Itu terutama karena satu alasan:masalah yang Anda jelaskan mengapa Anda merasa membutuhkannya:Hanya satu koneksi per permintaan.

Anda tidak perlu mengkodekan apa pun. mysqli memiliki fitur bawaan yang bagus, koneksi default. Ini mengambil parameter koneksi database dari pengaturan ini (konfigurasi) setiap kali Anda membuat instance baru:

$db = new mysqli;

Karena semua koneksi database ditutup ketika skrip selesai, tidak banyak yang perlu diperhatikan sama sekali. Satu-satunya hal yang perlu Anda lakukan adalah membuat instance koneksi sekali dan meneruskan variabel ke semua kode yang membutuhkan mysqli objek.

Praktik buruk lainnya adalah Anda memperkenalkan Lajang di sini, sesuatu seperti:

class MysqliSingleton extends mysqli
{
    private static $instance;
    /**
     * @return MysqliSingleton
     */
    public function getInstance()
    {
        if (NULL === self::$instance)
            self::$instance = new self();
        return self::$instance;
    }
    private function __construct()
    {
    }
    public function __clone()
    {
         throw new RuntimeException('Clone is not allowed.');
    }
    public function __wakeup()
    {
        throw new RuntimeException('Unserializing is not allowed.');
    }
}

Ini akan bekerja seperti ini:

$mysqli = MysqliSingleton::getInstance();

dan akan selalu mengembalikan satu instance mysqli itu, yang mungkin Anda cari. Namun Lajang dianggap berbahaya karena dapat menimbulkan banyak masalah, lihat pertanyaan terkait Siapa yang butuh lajang? .

Lebih mudah Anda membuat sendiri variabel yang Anda berikan berisi instance database. Anda juga dapat merangkum semacam pemuatan lambat jika aplikasi Anda tidak selalu membutuhkan koneksi mysqli, mis. dengan kelas konteks yang sangat sederhana:

interface ContextMysqli
{
    /**
     * @return mysqli
     */
    public function getMysqli();
}

class Context implements ContextMysqli
{
    private $mysqli;
    public function getMysqli()
    {
        $this->mysqli || $this->mysqli = new mysqli();
        return $this->mysqli;
    }
}

Saat skrip Anda mulai, buat instance konteks Anda dan teruskan ke setiap bagian kode Anda di tempat yang Anda butuhkan:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Saran ini mungkin sedikit picik juga, tetapi lebih baik daripada seorang lajang tanpa banyak basa-basi. Manfaatnya adalah Anda telah merangkum logika saat membuat mysqli objek tanpa kebutuhan seorang lajang. Kode Anda sekarang tidak tergantung pada konteks global atau statis.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menulis multi kolom dalam klausa dengan sqlalchemy

  2. MySql:Bandingkan 2 string yang merupakan angka?

  3. Bagaimana sprintf() melindungi dari injeksi SQL?

  4. Cara Menginstal MySQL 8 di Ubuntu 20.04 LTS

  5. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:di mysql