Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

सिंगलटन पीडीओ मॉडल - पदानुक्रम

अपने उदाहरण को कारगर बनाने के लिए, आप इसे आजमा सकते हैं।

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);

यह परीक्षण नहीं किया जाता है। लेकिन यह आपको एक विचार देना चाहिए कि समस्या को कैसे हल किया जाए। इस दृष्टिकोण को आजमाएं।

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. MySQL तालिका से मान खींचकर एक नया चर बनाया गया

  2. एसक्यूएल:मैं केवल कॉलम पर मान कैसे अपडेट कर सकता हूं यदि वह मान शून्य है?

  3. Mysql latin1_swedish_ci को utf8_bin में बदलें

  4. विदेशी कुंजी संदर्भों को अद्यतन किए बिना एक InnoDB तालिका का नाम बदलना?

  5. क्या एक पृष्ठ के माध्यम से MySQL कनेक्शन को खुला छोड़ना पूरी तरह से लापरवाह है?