Bài này mình sẽ giới thiệu với các bạn cách select data MySql bằng PHP. Thật ra thì cách này không còn quá lạ với các bạn nữa vì select nó cũng chỉ là chạy câu truy vấn MySql bằng PHP nhưng có trả về dữ liệu mà thôi. Câu lệnh select thường dùng để lấy dữ liệu và hiển thị lên website ở cả frontend lẫn backend, đây là câu lệnh thông dụng hay sử dụng nhất trong một website.

1. Select dữ liệu từ các bảng trong CSDL

Cho đến nay bạn đã học được cách tạo CSDL và tạo bảng CSDL cũng như chèn dữ liệu trong MySQL. Như vậy ta đã có sẵn dữ liệu và bây giờ ta lấy những dữ liệu đã chèn ở những bài trước ra sử dụng thôi.

Cú pháp:

SELECT column1_name, column2_name, columnN_name FROM table_name;

Bây giờ chúng ta sẽ tạo một truy vấn SQL bằng cách sử dụng câu lệnh SELECT, sau đó chúng ta sẽ thực hiện truy vấn SQL này thông qua việc chuyển nó đến hàm mysqli_query() để lấy dữ liệu bảng.

Ví dụ: CSDL của chúng ta có các bản ghi sau:

Id First_name Last_name Email
1 Thành Nguyễn thanh@gmail.com
2 Nam Chu nam@gmail.com
3 Sơn Phùng son@gmail.com

2. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với MySQLi hướng thủ tục

<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
$link = mysqli_connect("localhost", "root", "", "db_lttd");
// Kểm tra kết nối
if($link === false){
    die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
 
// Cố gắng thực hiện câu lệnh SELECT
$sql = "SELECT * FROM persons";
if($result = mysqli_query($link, $sql)){
    if(mysqli_num_rows($result) > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = mysqli_fetch_array($result)){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        mysqli_free_result($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>

Trong ví dụ trên, dữ liệu được trả về bởi hàm mysqli_query() được lưu trữ trong biến $result. Mỗi lần hàm mysqli_fetch_array() được gọi, nó sẽ trả về hàng tiếp theo từ tập kết quả dưới dạng một mảng. Vòng lặp while được sử dụng để lặp qua tất cả các hàng trong tập kết quả.

Cuối cùng, giá trị của từng trường có thể được truy cập từ hàng bằng cách chuyển chỉ mục trường hoặc tên trường cho biến $row như $row[‘id’] hoặc $row[0], $row[‘first_name’] hoặc $row[1], $row[‘last_name’] hoặc $row[2] và $row[’email’] hoặc $row[3].

Nếu bạn muốn sử dụng vòng lặp for, bạn có thể lấy giá trị bộ đếm vòng lặp hoặc số lượng hàng được truy vấn trả về bằng cách truyền biến $result cho hàm mysqli_num_rows(). Giá trị bộ đếm vòng lặp này xác định số lần vòng lặp sẽ chạy.

3. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với MySQLi hướng đối tượng

<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
$mysqli = new mysqli("localhost", "root", "", "db_lttd");
// Kiểm tra kết nối
if($mysqli === false){
    die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
} 
// Cố gắng thực hiện câu lệnh SELECT
$sql = "SELECT * FROM persons";
if($result = $mysqli->query($sql)){
    if($result->num_rows > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch_array()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        $result->free();
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi câu lệnh $sql. " . $mysqli->error;
} 
// Đóng kết nối
$mysqli->close();
?>

4. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với PDO

<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
try{
    $pdo = new PDO("mysql:host=localhost;dbname=db_lttd", "root", "");
    // Thiết lập chế độ PDO error thành Ngoại lệ
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Could not connect. " . $e->getMessage());
}
 
// Cố gắng thực hiện câu lệnh SELECT
try{
    $sql = "SELECT * FROM persons";   
    $result = $pdo->query($sql);
    if($result->rowCount() > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        unset($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} catch(PDOException $e){
    die("ERROR: Không thể thực thi câu lệnh $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>

5. Chọn dữ liệu từ CSDL MySQLi

MySQLi Hướng đối tượng:

// Kết nối CSDL
$conn = new mysqli('localhost', 'root', 'vertrigo', 'db_lttd');
// Kiểm tra kết nối
if ($conn->connect_error) {
    die("Kết nối thất bại: " . $conn->connect_error);
}  
// Câu SQL lấy danh sách
$sql = "SELECT id, title, content FROM News";
 
// Thực thi câu truy vấn và gán vào $result
$result = $conn->query($sql); 
// Kiểm tra số lượng record trả về có lơn hơn 0
// Nếu lớn hơn tức là có kết quả, ngược lại sẽ không có kết quả
if ($result->num_rows > 0) 
{
    // Sử dụng vòng lặp while để lặp kết quả
    while($row = $result->fetch_assoc()) {
        echo "title: " . $row["title"]. " - Content: " . $row["content"]."<br>";
    }
} 
else {
    echo "Không có record nào";
}
// ngắt kết nối
$conn->close();

Mình sẽ giải thích qua ví dụ trên:

Đầu tiên, chúng ta thiết lập một truy vấn SQL chọn các cột id, họ và tên từ bảng MyGuests. Dòng mã tiếp theo chạy truy vấn và đặt dữ liệu kết quả vào một biến được gọi là $result. Sau đó, function num_rows() kiểm tra nếu có nhiều hơn 0 hàng được trả về.

Nếu có nhiều hơn 0 hàng được trả về, hàm fetch_assoc() sẽ đặt tất cả kết quả vào một mảng kết hợp mà chúng ta có thể lặp lại. Các while() vòng lặp qua tập hợp kết quả và kết quả đầu ra dữ liệu từ các cột id, firstname và lastname.

MySQLi hướng thủ tục:

// khởi tạo kết nối
$connect = mysqli_connect('localhost', 'root', '', 'db_lttd');
//Kiểm tra kết nối
if (!$connect) {
    die('kết nối không thành công ' . mysqli_connect_error());
}
//khởi tạo biến $i để đếm;
$i = 1;
//câu truy vấn
$sql = "SELECT * FROM tbl_news";
//kiểm tra
if ($result = mysqli_query($connect, $sql)) {
    while ($row = mysqli_fetch_array($result)) {
        //hiển thị dữ liệu
        echo 'Dữ liệu thứ ' . $i . ' gồm: ' . $row['id'] . '-' . $row['title'] . '-' . $row['content'] . '<br/>';
        //tăng $i lên 1
        $i++;
    }
} else
    //Hiện thông báo khi không thành công
    echo 'Không thành công. Lỗi' . mysqli_error($connect);
//ngắt kết nối
mysqli_close($connect);

Sử dụng PDO:

Ví dụ sau sử dụng các câu lệnh đã chuẩn bị sẵn. Nó chọn các cột id, họ và tên từ bảng MyGuests và hiển thị nó trong bảng HTML:

<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";
class TableRows extends RecursiveIteratorIterator {
  function __construct($it) {
    parent::__construct($it, self::LEAVES_ONLY);
  }
  function current() {
    return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
  }
  function beginChildren() {
    echo "<tr>";
  }
  function endChildren() {
    echo "</tr>" . "\n";
  }
}
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "db_lttd";
try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
  $stmt->execute();
  $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
    echo $v;
  }
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>