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

Sự cố khi liên kết một mảng đã nổ vào một câu lệnh được chuẩn bị sẵn mysql

Hãy để tôi cứu bạn một số rắc rối và cho bạn biết những gì bạn đang cố gắng thực hiện sẽ không hiệu quả. Bạn chỉ ràng buộc một tham số với IN() của mình chức năng gọi. Bạn nghĩ rằng bạn đang chuyển một danh sách được phân tách bằng dấu phẩy nhưng thực tế bạn chỉ đang chuyển một chuỗi được phân tách bằng dấu phẩy được coi là một giá trị . Điều này có nghĩa là bạn sẽ tìm kiếm một bản ghi với giá trị là "' [email protected] ',' [email protected] '"thay vì các bản ghi khớp với" [email protected] "hoặc" [email protected] ".

Để khắc phục điều này, bạn cần:

  1. Tự động tạo chuỗi loại của bạn
  2. Sử dụng call_user_func_array() để ràng buộc các thông số của bạn

Bạn có thể tạo chuỗi loại như sau:

$types = str_repeat('s', count($selected));

Tất cả những việc này là tạo một chuỗi s Đó là số lượng ký tự bằng số phần tử trong mảng.

Sau đó, bạn sẽ liên kết các tham số của mình bằng cách sử dụng call_user_func_array() như thế này (lưu ý rằng tôi đã đặt lại dấu ngoặc đơn cho IN() chức năng):

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));

Nhưng nếu bạn thử điều này, bạn sẽ gặp lỗi về mysqli_stmt::bind_param() mong muốn tham số hai được chuyển bằng tham chiếu:

Đây là loại khó chịu nhưng đủ dễ dàng để giải quyết. Để khắc phục điều đó, bạn có thể sử dụng chức năng sau:

function refValues($arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
        $refs[$key] = &$arr[$key]; 
    return $refs; 
} 

Nó chỉ tạo ra một mảng các giá trị tham chiếu đến các giá trị trong $selected mảng. Điều này đủ để tạo ra mysqli_stmt::bind_param() hạnh phúc:

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, refValues($selected)));

Chỉnh sửa

Kể từ PHP 5.6, bây giờ bạn có thể sử dụng ... toán tử để làm cho việc này trở nên đơn giản hơn:

$stmt->bind_param($types, ...$selected);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm khoảng trống ngày với mysql

  2. cách thêm ngày và giờ với tên tệp sao lưu bằng cách sử dụng mysqldump từ dấu nhắc lệnh và xác định đường dẫn của tệp sao lưu

  3. Phương pháp tốt nhất để sử dụng / lưu trữ khóa mã hóa trong MySQL là gì

  4. MySQL:Làm thế nào để sao chép các hàng, nhưng thay đổi một vài trường?

  5. Truy vấn tổng MYSQL với điều kiện IF