Hàm query dữ liệu từ database bằng PDO

Chào các bác
Em đang dùng PDO để lấy dữ liệu từ database Mysql
Trước em dùng mysqli thì việc lấy khá dễ dàng

public function get_data($sql){
        //Kiem tra ket noi
        if($this->conn){
        //Thuc hien truy van
        mysqli_query($this->conn, $sql);
        }
        }

Giờ em chuyển qua PDO thì việc lấy dữ liệu khá nhiêu khê. Hướng dẫn toàn phải thêm code connect database vào.

//Ham select value tu db
    function get_data($sql)
    {
        try {
            $dsn = "mysql:host=$this->__host;dbname=$this->__db_name";

            $conn = new PDO($dsn, $this->__user, $this->__passwd);
            //Set che do loi
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            if ($conn) {
                $stmt = $conn->prepare($sql);
                $stmt->execute();
                //lay ket qua
                $result = $stmt->fetchAll();
                return $result;
            }
        } catch (PDOException $e) {
            echo "Err: " . $e->getMessage();
        }
    }

Có cách nào để viết gọn như mysqli không các bác. Hay bắt buộc phải viết đầy đủ ra?
Em cảm ơn

Thông thường, setting của phần $conn sẽ bỏ vào file config hay gì đó để include/call vào, chứ không cần khai báo lại mỗi khi xài. Với bạn đã cho nó vào thành function get_data rồi, thì đâu có vấn đề gì với việc viết dài hay ngắn đâu ta?

Cá nhân mình thì thích xài PDO hơn, do mình cảm thấy nó rõ ràng và dễ hiểu cho người mới.

Bạn có thể tham khảo thêm bài so sánh giữa mysqli và pdo ở đây:

nếu nói về cái nào phải viết nhiều code hơn cái nào, thì 2 ông này cũng không khác biệt nhau lắm

4 Likes

Điên nhất ở mấy cái công cụ cơ sở dữ liệu đó là có quá nhiều kiểu fetch để chi vậy không biết, cứ table thế nào thì fetch ra thế ấy chứ nào là object, mảng, số gì đó các kiểu => rách việc chẳng để làm gì. Tốt hơn hết là fetch = table, tham khảo tên column thì ta cứ dấu chấm cho gọn.
Ví dụ: $myTable = $db->fechTable(‘bang-cua-tui’); thì $myTable nó là mảng 2 chiều như cái table đi. Lúc này muốn tham khảo dòng và cột thì ta cứ:
$myTable.Stt.2 <= dòng 2 cột 1 cho dễ hiểu.
Không hiểu sao mấy gã tạo ra ngôn ngữ lập trình toàn chơi khó thiên hạ. Chắc vì thế mà mấy ông quân đội thì “thông minh cơ bắp” ăn đứt “thông minh chất xám” nên chả buồn chơi cơ sở dữ liệu quan hệ thế hệ mới, cứ FoxPro cổ lỗ sĩ mà chơi :smiley:

4 Likes

Ý em là mỗi khi mình thực hiện action cho table. Em đều phải thêm đoạn connect vào thì nó mới không bị lỗi. So với thằng mysqli thì bất tiện hơn hẳn.

Em đang xử lí bằng cách đặt return cho hàm connect(), mỗi khi làm gì thì gọi hàm đó ra. nhưng vẫn không thấy thoả mãn. Muốn làm sao để gọi hàm 1 lần thôi.

Ví dụ, trong file config.php mình sẽ khai báo thông tin connection như này:

<?php

	$host 		= "127.0.0.1";
	$db   		= "xxxxxxxx";
	$user 		= "root";
	$pass 		= "xxxxxxxx";
	$charset 	= "utf8mb4";

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";

    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    try {
         $pdo = new PDO($dsn, $user, $pass, $options);
    } catch (\PDOException $e) {
         throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }
?>

Và trong file my_profile.php, mình sẽ include file config.php và sau đó query vào sql chỉ với vài dòng như này:

<?php
$query = "SELECT ********";
$stmt = $pdo->prepare($query);
$stmt->execute();

while ($row = $stmt->fetch()){
xxxxx
}

?>

thấy tiện mà, đâu có dài hay phức tạp, bất tiện hơn mysqli gì đâu?

6 Likes

oke bác, em thông rồi
do em cứ để code connect đến database trong hàm, rồi gọi thôi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?