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

Sự cố PDO bindParam

PDO liên kết dữ liệu giá trị chứ không phải tên bảng và cột.

Bạn đang hiểu sai về việc sử dụng các ràng buộc. Bạn không thể liên kết tên bảng và cột với PDO. Bạn liên kết dữ liệu để chèn VÀO các cột đó. Bạn cần xây dựng SQL để bao gồm tên bảng và cột bằng cách sử dụng các phép toán chuỗi.

Định dạng dữ liệu

Tôi đã đổi tên $ column và $ value của bạn thành $ column_array, $ value_array để làm rõ chúng là gì và giả định rằng mỗi cái là một mảng đơn giản:$column_array = array('column1', 'column2', ...) etc.

$placeholders = array_map(function($col) { return ":$col"; }, $column_array);

$bindvalues = array_combine($placeholders , $value_array);

$ trình giữ chỗ bây giờ trông giống như sau:

$placeholders = array(
        ':column1',
        ':column2',
         ...
    );

$ bindvalues ​​bây giờ trông giống như sau:

$bindvalues = array(
        ':column1'=>'value1',
        ':column2'=>'value2',
         ...
    );

Xây dựng, chuẩn bị, thực thi

$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";

Điều này sẽ cung cấp cho bạn một tuyên bố chuẩn bị sẵn của biểu mẫu:

$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)

Sau đó, bạn có thể thực hiện câu lệnh đã chuẩn bị và chuyển các giá trị $ làm đối số.

$sql->execute($bindValues);

Lưu ý:

  • Một lưu ý phải được đề cập. Đảm bảo rằng dữ liệu gốc của bạn đã được làm sạch bằng SQL Injection. PDO sẽ lo điều đó cho các giá trị ràng buộc, nhưng nếu bạn đang xây dựng các cột từ dữ liệu $ _POST, dữ liệu này rất dễ bị tấn công và cần được làm sạch.


  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ạo hàng trống cho hàng lặp lại

  2. Chặn thông báo cảnh báo bằng mysql từ bên trong Terminal, nhưng mật khẩu được viết bằng tập lệnh bash

  3. Tại sao giới hạn thời gian tối đa của MySQL là 838:59:59?

  4. Sử dụng Passport với Sequelize và MySQL

  5. PHP - Azure mySQL trong ứng dụng được thay đổi cổng ngẫu nhiên