Hướng dẫn php prepared statement in clause - câu lệnh chuẩn bị php trong mệnh đề

Tôi đã chuyển một số mã cũ sang giao diện MSQLI mới bằng cách sử dụng các câu lệnh đã chuẩn bị, tôi đã gặp sự cố với các câu lệnh SQL có chứa mệnh đề trong. Tôi thường chỉ làm điều này:

$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN [$ids]";
$res = mysql_query[$sql];

Chuyển đổi điều này sang MySQLI và các câu lệnh được chuẩn bị Tôi đã thử một số giải pháp:

$ids = '123,535,345,567,878'
$ids = implode[$ids,','];
$result = $msqli->prepare["SELECT foo,blar FROM table WHERE id IN [?]];
$result->bind_param["i", $ids];
$result->execute[];

Các trên không và tính toán số lượng phần tử trong mảng và thay đổi số lượng câu hỏi trong chuỗi SQL và gọi BIND_PARM cho mỗi phần tử trong mảng cũng không thành công. Chỉ cần sử dụng chuỗi phân tách dấu phẩy cũng không thành công.

Tôi không thể tìm thấy tài liệu tốt trong Google về điều này, vậy bạn đã giải quyết vấn đề như thế nào?

  1. Nhận xét [3]

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 chính xác để 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.

Hãy tưởng tượng bạn có một loạt các giá trị mà bạn muốn sử dụng trong Điều khoản IN[] trong truy vấn SQL của bạn.

Có một số thủ thuật sẽ giúp chúng tôi trong thử thách này.

  • Trước hết, chúng tôi sẽ cần tạo một chuỗi có nhiều điểm ? như nhiều yếu tố nằm trong mảng của bạn. Đối với điều này, chúng tôi sẽ sử dụng chức năng str_repeat[] rất tiện dụng cho mục đích này.
  • Sau đó, chuỗi này với dấu hiệu phân tách dấu phẩy phải được thêm vào truy vấn. Mặc dù đó là một biến, nhưng trong trường hợp này là an toàn vì nội dung của nó chỉ chứa các giá trị không đổi
  • Sau đó, truy vấn này phải được chuẩn bị giống như bất kỳ truy vấn nào khác
  • Sau đó, chúng ta sẽ cần tạo một chuỗi với các loại sẽ được sử dụng với bind_param []. Lưu ý rằng thường không có lý do gì để sử dụng các loại khác nhau cho các biến bị ràng buộc - MySQL sẽ vui vẻ chấp nhận tất cả chúng dưới dạng chuỗi. Có trường hợp cạnh, nhưng cực kỳ hiếm. Đối với việc sử dụng hàng ngày, bạn luôn có thể giữ cho nó đơn giản và sử dụng "S" cho mọi thứ.
  • Sau đó, chúng ta cần liên kết các giá trị mảng của chúng ta với câu lệnh. Thật không may, bạn không thể chỉ viết nó như một biến duy nhất, như $stmt->bind_param["s", $array] này, chỉ các biến vô hướng được cho phép trong bind_param[]. May mắn thay, có một nhà điều hành giải nén đối số thực hiện chính xác những gì chúng ta cần - gửi một mảng các giá trị vào một hàm như thể đó là một tập hợp các biến riêng biệt!
  • Phần còn lại như bình thường - thực hiện truy vấn, nhận kết quả và lấy dữ liệu của bạn!

Đây là mã:

$array = [1,2,3]; // our array
$in  str_repeat['?,'count[$array] - 1] . '?';
$sql "SELECT * FROM table WHERE column IN [$in]";
$stmt  $mysqli->prepare[$sql];
$types str_repeat['s'count[$array]];
$stmt->bind_param[$types, ...$array];
$stmt->execute[];
$result $stmt->get_result[]; // get the mysqli result
$data $result->fetch_all[MYSQLI_ASSOC]; // fetch data   
Bài viết liên quan:

Related articles:

  • MySQLI chọn truy vấn với các câu lệnh đã chuẩn bị
  • Cách chạy truy vấn chèn bằng mysqli
  • Cách chạy truy vấn chọn bằng MySQLI
  • Cách chạy truy vấn cập nhật bằng MySQLI
  • Sử dụng các câu lệnh đã chuẩn bị MySQLI với toán tử giống như trong SQL
  • Ví dụ mysqli
  • Cách gọi các thủ tục được lưu trữ với MySQLI
  • Cách tạo bộ lọc tìm kiếm cho mysqli
  • Làm thế nào để chạy các truy vấn chèn 1000s với MySQLI?



Bài Viết Liên Quan

Chủ Đề