Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mô hình Singleton PDO - Hệ thống phân cấp

Để làm cho ví dụ của bạn hoạt động, bạn có thể thử cách này.

define('DB_CONN','mysql:dbname=;host=');
define('DB_USER', '');
define('DB_PASS', '');

interface iMySQL
{

    public
    function query( $string );

    public
    function select();

    public
    function selectAll();

    public
    function insert();

    public
    function update();

    public
    function delete();

    public
    function load();

}



class DataBase
{

    /**
     * @var object PDO
     */
    private static $instance = null;


    /**
     * Cria uma instância do PDO representando a conexão ao banco de dados e torna a instância disponível como "singleton"
     *
     * @param string $dsn            O DSN completo, ex.: mysql:host=localhost;dbname=testdb
     * @param string $username       O nome de usuário para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
     * @param string $password       A senha para a string DSN. Esse parâmetro é opcional para alguns drivers do PDO.
     * @param array  $driver_options Um array key => value de opções de conexão específicas do driver
     *
     */
    private function __construct() {

    }

    public static function getInstance()
    {
        if ( self::$instance === null )
        {
            self::$instance = new PDO(DB_CONN, DB_USER, DB_PASS);
        }
        return self::$instance;
    }

}

class Model
{
    protected $TABLE_NAME;
    protected $TABLE_PREFIX;
    protected $clausula;

    private $storage;

    /**
     * Recupera um registro utilizando sua chave
     *
     * @param string $key
     *
     * @return mixed O valor armazenado
     * @throws RuntimeException Se não houver um registro para a chave especificada
     */
    public
    function __get( $key )
    {

    }

    /**
     * Registra um valor à uma chave
     *
     * @param string $key   A chave que será utilizada no registro
     * @param mixed  $value O valor que será registrado
     *
     * @throws LogicException Se a chave já estiver registrada
     */
    public
    function __set( $key , $value )
    {
        //echo $key;
    }


    public static
    function __callStatic( $method , $args )
    {

        $database = DataBase::getInstance();
        $callback = array( $database , $method );
        return call_user_func_array( $callback , $args );

    }

    public
    function __call( $method , $args )
    {

        $database = DataBase::getInstance();
        $callback = array( $database , $method );
        return call_user_func_array( $callback , $args );

    }

    public function __construct( $table_name = null , $id = null )
    {

        $this->TABLE_PREFIX = $this->config['database']['table_prefix'];
        $this->TABLE_NAME   = $this->TABLE_PREFIX . $table_name;

        $this->storage = new ArrayObject();

        if ( !is_null( $table_name ) )
        {
            $array = $this->query( "SHOW COLUMNS FROM `$this->TABLE_NAME`" )->fetchAll();

            $colunas      = array();
            $obrigatorias = array();

            foreach ( $array as $value )
            {
                $colunas[] = $value[0];
                if ( $value['Null'] === 'NO' )
                {
                    $obrigatorias[] = $value['Field'];
                }
            }

            $this->colunas       = $colunas;
            $this->obrigatorias  = $obrigatorias;
            $this->total_colunas = count( $this->colunas );

            // Se passou um id por parâmetro, salva nas propriedades do objeto
            if ( !is_null( $id ) AND is_numeric( $id ) )
            {
                $this->id = $id;

                // E já carrega o objeto
                $select = $this->query( 'SELECT * FROM {tabela_nome} WHERE `id` = ' . $id )->fetchObject();
                $this->load( $select );
            }
        }

    }

    public
    function insert()
    {
    }

    public
    function update()
    {
    }

    public
    function delete()
    {
    }

    public
    function select( $clausula = NULL , $is_array = FALSE )
    {
        // Caso seja passado uma cláusula diretamente para a função, executa ela
        if ( !is_null( $clausula ) )
        {
            $this->clausula = $clausula;
        }

        // Troca uma possível variável pelo nome da tabela do Model
        $this->clausula = ( str_replace( '{TABLE_NAME}' , $this->TABLE_NAME , $this->clausula ) );
        $this->clausula = ( str_replace( '{TABLE_PREFIX}' , $this->TABLE_PREFIX , $this->clausula ) );

        // Executa o SELECT no banco de dados
        $query = $this->query( $this->clausula );

        if ( $query AND $query->rowCount() > 0 )
        {

            if ( $query->rowCount() == 1 AND !$is_array )
            {
                return $query->fetchObject( get_class( $this ) );
            }
            else
            {
                $objetos = array();
                while ( $linha = $query->fetchObject( get_class( $this ) ) )
                {
                    $objetos[] = $linha;
                }
                return ( count( $objetos ) > 0 ) ? $objetos : FALSE;
            }
        }
        else
        {
            return FALSE;
        }
    }

    public
    function selectAll()
    {
    }

    public
    function load()
    {
    }
}



$model = new Model();
$stmt = $model->query();
$fetch = $stmt->fetchAll();
var_dump($fetch);

Điều này không được thử nghiệm. Nhưng nó sẽ cung cấp cho bạn ý tưởng về cách giải quyết vấn đề. Hãy thử cách tiếp cận này.

define('DB_TYPE', 'DB_Class_One');


class DB_Class_One extends PDO {
    public function getData() {
        print 'Class One';
    }
}

class DB_Class_Two extends PDO {
   public function getData() {
        print 'Class Two';
    }
}

class DB_Class_Three extends PDO {
   public function getData() {
        print 'Class Three';
    }
}

class DataBase {

    private static $instance = null;

    private function __construct() {

    }

    private function __clone() {

    }

    public static function getInstance() {
        $class = DB_TYPE;

        if (self::$instance === null) {
            self::$instance = new $class("mysql:host=;dbname=", '', '');
        }
        return self::$instance;
    }


}




$db = DataBase::getInstance();

$stmt = $db->query();

$result = $stmt->fetch();

$db->getData();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sắp xếp trường varchar theo số trong MySQL

  2. Cách chèn thời gian JS thời điểm vào MySQL

  3. Chuyển đổi ngày mySQL thành ngày Javascript

  4. Mysql:Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' ngay sau khi cài đặt trên macOS

  5. Không thể tìm nạp dữ liệu từ cơ sở dữ liệu vào thẻ tập lệnh trong khi sử dụng biểu đồ