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

Làm cách nào để phân tích cú pháp dữ liệu đối tượng từ cơ sở dữ liệu MySQL bằng PHP PDO?

Vấn đề với những video hướng dẫn này là tác giả của chúng không có manh mối nào về chủ đề này, khiến kết quả sẽ TỐT HƠN NHIỀU so với việc bạn hoàn toàn không sử dụng phân tinh thần của họ. Thiệt hại mà chúng gây ra tồi tệ đến mức tôi thậm chí đã phải viết một bài riêng giải thích tại sao tất cả các "wrappers" bất lực này hoàn toàn không sử dụng được cho bất kỳ ứng dụng thực tế nào, Các bệnh thời thơ ấu của trình bao bọc cơ sở dữ liệu đầu tiên của bạn .

Ví dụ:lấy trình bao bọc này từ video:

  • Báo cáo lỗi hoàn toàn thiếu sót
  • Một chức năng vô dụng cho các CHỌN.
  • Tính tuyên bố
  • Phiên bản PDO được bảo vệ

Vì vậy, về bản chất, bạn sẽ không thể lấy được từ "trình bao bọc" này ngay cả một thứ ngớ ngẩn như Chèn Id. Và không có báo cáo lỗi nào có thể giúp bạn nhận ra vấn đề.

Đối với mã của bạn, chỉ cần không mặc cả để tiết kiệm cho mình việc nhập một từ khóa SQL. Thật là ngớ ngẩn. SQL là một thứ quý giá, đừng bỏ qua nó để ủng hộ một số phím tắt vô nghĩa. Bạn cũng không nên giảm PDO đến trạng thái không hợp lệ tê liệt, loại bỏ các tính năng tuyệt vời nhất của nó.

Trình bao bọc của bạn phải làm cho tất cả các tính năng PDO và SQL có thể truy cập được thay vì loại bỏ chúng. Vì vậy, nó đi:

class DB
{
    protected static $instance;
    protected $pdo;

    protected function __construct() {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_EMULATE_PREPARES   => FALSE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            $this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);

    }

    // a classical static method to make it universally available
    public static function instance()
    {
        if (self::$instance === null)
        {
            self::$instance = new self;
        }
        return self::$instance;
    }

    // a proxy to native PDO methods
    public function __call($method, $args)
    {
        return call_user_func_array(array($this->pdo, $method), $args);
    }

    // a helper function to run prepared statements smoothly
    public function run($sql, $args = [])
    {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

trình bao bọc này đơn giản hơn mười lần và đồng thời mạnh hơn mười lần so với trình bao bọc từ video.

Và bây giờ là lớp của bạn

Lịch biểu lớp
class Schedule
{
    private $_db;

    public function __construct()
    {
        $this->_db = DB::instance();
    }

    public function listGames()
    {
        $data = $this->_db->query('SELECT * FROM games')->fetchAll();
        var_dump($data);
        echo '<br>';
    }
}

Bí mật ở đây là PDO đã có thể cung cấp cho bạn dữ liệu đối tượng mà không cần thêm một dòng mã nào.

Mặc dù ví dụ đơn giản này không ấn tượng lắm, nhưng bí mật ở đây là trình bao bọc này cũng sẽ phục vụ bạn cho bất kỳ ví dụ nào khác, khi điều đó từ video sẽ bị nghẹt thở. Hãy thử nghĩ đến bất kỳ ví dụ nào khác và tôi sẽ cho bạn thấy trình bao bọc này đơn giản nhưng mạnh mẽ như thế nào.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django views.py Phiên bản SQL Tham gia với Truy vấn Nhiều Bảng

  2. nhận Mất kết nối với mysql khi sử dụng mysqldump ngay cả với tham số max_allowed_packet

  3. HAProxy:Tất cả các tài nguyên của Somenines

  4. gọi một hàm mysql trả về varchar trong chế độ ngủ đông

  5. Đầu ra Python zlib, làm thế nào để khôi phục khỏi bảng mysql utf-8?