$stmt trong php mysqli là gì?

Trước khi chạy bất kỳ truy vấn nào với mysqli, hãy đảm bảo rằng bạn đã có một biến kết nối mysqli được cấu hình phù hợp, cần thiết để chạy các truy vấn SQL và để thông báo cho bạn về các lỗi có thể xảy ra

Bạn phải luôn sử dụng

$sql = "SELECT * FROM users WHERE id=?";
2 cho bất kỳ truy vấn SQL nào có chứa biến PHP. Để làm như vậy, hãy luôn làm theo các bước dưới đây

  • Tạo một câu lệnh SQL SELECT chính xác. Kiểm tra nó trong bảng điều khiển mysql/phpmyadmin nếu cần
  • Thay thế tất cả các biến trong truy vấn bằng dấu chấm hỏi (được gọi là trình giữ chỗ hoặc tham số)
  • Chuẩn bị truy vấn kết quả
  • Liên kết tất cả các biến với câu lệnh đã chuẩn bị trước đó
  • Thực hiện tuyên bố
  • Lấy biến kết quả mysqli từ câu lệnh
  • Tìm nạp dữ liệu của bạn

Tóm lại, đây là mã

$sql = "SELECT * FROM users WHERE id=?"; // SQL with parameters
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$user = $result->fetch_assoc(); // fetch data   

Và để truy vấn CHỌN của bạn được thực thi mà không có một lỗi cú pháp hoặc SQL injection nào

Lời giải chi tiết

Hãy xem mỗi dòng mã này có ý nghĩa gì

$sql = "SELECT * FROM users WHERE id=?";

Giống như đã nói ở trên, đầu tiên chúng ta viết một truy vấn SQL trong đó tất cả các biến được thay thế bằng các dấu chấm hỏi

QUAN TRỌNG. không nên có dấu ngoặc kép xung quanh dấu chấm hỏi, bạn đang thêm trình giữ chỗ chứ không phải chuỗi

$stmt= $conn->prepare($sql);

Sau đó, truy vấn được chuẩn bị. Ý tưởng rất thông minh. Để tránh ngay cả khả năng tiêm SQL hoặc lỗi cú pháp do dữ liệu đầu vào gây ra, truy vấn và dữ liệu được gửi đến máy chủ cơ sở dữ liệu một cách riêng biệt. Vì vậy, nó tiếp tục ở đây. với

$sql = "SELECT * FROM users WHERE id=?";
3, chúng tôi sẽ gửi truy vấn đến máy chủ cơ sở dữ liệu trước. Một biến đặc biệt, một câu lệnh được tạo ra như một kết quả. Chúng tôi sẽ sử dụng biến này từ bây giờ

$stmt->bind_param("i", $id);

Sau đó, các biến phải được liên kết với câu lệnh. Cuộc gọi bao gồm hai phần - chuỗi với các loại và danh sách các biến. Với mysqli, bạn phải chỉ định loại cho từng biến bị ràng buộc. Nó được biểu thị bằng một chữ cái trong tham số đầu tiên. Số lượng chữ cái phải luôn bằng số lượng biến. Các loại có thể là

  • tôi cho số nguyên
  • d cho gấp đôi (phao)
  • s cho chuỗi
  • b cho đốm màu

MỘT GỢI Ý. bạn hầu như luôn có thể sử dụng "s" một cách an toàn cho bất kỳ biến nào

Vì vậy, bây giờ bạn có thể nói rằng "s" có nghĩa là "sẽ có 1 biến, kiểu chuỗi"

$stmt->execute();

Sau đó, truy vấn cuối cùng được thực hiện. Có nghĩa là các biến được gửi đến máy chủ cơ sở dữ liệu và truy vấn thực sự được thực thi

LƯU Ý rằng bạn không phải kiểm tra kết quả thực hiện. Nếu bạn có mã kết nối thích hợp được đề cập ở trên, trong trường hợp có lỗi, mysqli sẽ tự động báo lỗi

$result = $stmt->get_result(); // get the mysqli result

Ở đây chúng tôi đang gọi một chức năng rất thông minh. Theo mặc định, vì lý do nào đó, không thể tìm nạp một mảng quen thuộc (như chúng tôi đã làm với

$sql = "SELECT * FROM users WHERE id=?";
4) từ câu lệnh mysqli. Vì vậy, chức năng này ở đây để trợ giúp, nhận kết quả mysqli từ câu lệnh mysqli

$user = $result->fetch_assoc(); // fetch data   

Cuối cùng, tìm nạp một hàng bằng phương pháp

$sql = "SELECT * FROM users WHERE id=?";
5 quen thuộc

Bắt nhiều hàng vào mảng

Nói chung, việc nhận nhiều hàng sẽ liên quan đến vòng lặp while quen thuộc

$sql = "SELECT * FROM users WHERE id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row['name'];
}

Tuy nhiên, trong một ứng dụng web hiện đại, tương tác cơ sở dữ liệu được tách ra khỏi đầu ra HTML. Nó làm cho mã sạch hơn và linh hoạt hơn. Điều đó có nghĩa là chúng ta không bao giờ nên in dữ liệu của mình bằng vòng lặp while mà nên thu thập dữ liệu đó vào mảng và sau đó sử dụng mảng này cho đầu ra

Và mysqli có một chức năng tiện dụng trả về ngay một mảng từ kết quả truy vấn.

$sql = "SELECT * FROM users WHERE id=?";
6. Vì vậy, thay vì bốn dòng

$data = [];
while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}

nó có thể chỉ là một dòng duy nhất

$data = $result->fetch_all(MYSQLI_ASSOC);

sau đó bạn có thể sử dụng

$sql = "SELECT * FROM users WHERE id=?";
7 cho đầu ra

$sql = "SELECT * FROM users WHERE id=?";
0

Theo mặc định, hàm này trả về các mảng được liệt kê, do đó, để có được các mảng kết hợp, chế độ

$sql = "SELECT * FROM users WHERE id=?";
8 phải được đặt rõ ràng

CHỌN truy vấn với chức năng trợ giúp

Như bạn có thể lưu ý, mã cho câu lệnh chuẩn bị khá dài dòng. Nếu bạn muốn xây dựng một mã giống như hình Lego, với hàng ngũ người vận hành sáng chói, bạn có thể giữ nguyên mã đó. Nếu bạn, giống như tôi, ghét sự lặp lại vô ích và thích viết mã ngắn gọn và có ý nghĩa, thì có một hàm trợ giúp đơn giản. Với nó, mã sẽ trở nên ngắn hơn hai lần

$stmt nghĩa là gì trong PHP?

" $stmt " rõ ràng (tôi nghĩ) là viết tắt của "câu lệnh" . Đặt tên biến là tùy ý, bạn muốn đặt tên biến gì cũng được. $stmt chỉ là thành ngữ. Một tuyên bố chuẩn bị như vậy là một tính năng cơ sở dữ liệu.

stmt trong MySQL là gì?

Câu lệnh PREPARE chuẩn bị một câu lệnh SQL và gán cho nó một tên stmt_name , để tham chiếu đến câu lệnh sau này . Câu lệnh đã chuẩn bị được thực thi với EXECUTE và được giải phóng với DEALLOCATE PREPARE. Ví dụ, xem Phần 13. 5, “Các tuyên bố được chuẩn bị sẵn”. Tên câu lệnh không phân biệt chữ hoa chữ thường.

Truy vấn MySQLi trả về cái gì?

Giá trị trả về ¶ . Đối với các truy vấn thành công khác, mysqli_query() sẽ trả về true. a mysqli_result object. For other successful queries, mysqli_query() will return true .

Làm cách nào để kiểm tra xem câu lệnh đã chuẩn bị có rỗng trong PHP không?

Hàm is_null() kiểm tra xem một biến có phải là NULL hay không. Hàm này trả về true (1) nếu biến là NULL, ngược lại trả về false/nothing.