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

Chuyển các biến C vào lệnh SQL

Có hai cách để xử lý điều này. Đầu tiên là chuẩn bị chuỗi với các giá trị được chèn vào đó. Thứ hai là sử dụng các tham số truy vấn mà bạn có thể thay thế các giá trị một cách riêng biệt.

Đối với phương pháp đầu tiên, bạn có thể sử dụng một hàm như snprintf để chuẩn bị lệnh bạn sẽ gửi đến máy chủ. Ví dụ:

char buffer[512];

int num=snprintf(buffer, sizeof(buffer), 
    "SELECT name FROM MYTABLE WHERE id=%d", id);

if (num>sizeof(buffer)) {
    /* error: buffer was too small */
}

Sau bộ đệm này sẽ chứa truy vấn SQL bao gồm giá trị thực của id biến.

Lưu ý rằng cần phải kiểm tra giá trị trả về từ snprintf để xem bộ đệm có bị tràn hay không.

Cũng lưu ý rằng khi một chuỗi đang được đặt trong lệnh, bạn cần đảm bảo rằng chuỗi đó không chứa bất kỳ dấu ngoặc kép hoặc ký tự đặc biệt nào khác. Nếu chuỗi đến từ bên ngoài chương trình của bạn, ví dụ:Từ đầu vào của người dùng, sau đó việc không trích dẫn nó một cách chính xác sẽ để lại một lỗ hổng lớn mà qua đó ai đó có thể đưa vào một số SQL độc hại. libpq cung cấp PQescapeLiteral chức năng này.

Phương pháp khác, được ưu tiên hơn trong hầu hết các trường hợp, là chuyển lệnh SQL và các tham số đến máy chủ một cách riêng biệt. Ví dụ:bạn có thể thực hiện việc này bằng cách sử dụng PQexecParams libpq functoin. Chuỗi SQL của bạn sẽ giống như sau:

PGresult r = PQexecParams(conn, /* Connection to database */
    "SELECT name FROM mytable WHERE id=$1",
    1,             /* Number of parameters */
    NULL,          /* NULL means server should figure out the parameter types */
    params,        /* Pointer to array of strings containing parameters */
    NULL,          /* Not needed unless binary format used */
    NULL,          /* Not needed unless binary format used */
    0              /* Result to come back in text format */
);

Chức năng này cho phép bạn cung cấp các tham số và / hoặc lấy kết quả ở định dạng văn bản hoặc nhị phân. Để đơn giản, ví dụ của tôi ở trên giả định định dạng văn bản cho cả hai.

Một biến thể của điều này là sử dụng các câu lệnh đã chuẩn bị sẵn. Trong trường hợp này, bạn thực hiện hai lệnh gọi riêng biệt tới libpq:

  1. Gọi PQprepare, mà bạn chuyển câu lệnh SQL của mình với các giá trị tham số $ 1, $ 2, v.v., theo ví dụ của tôi ở trên. Điều này sẽ trả về một xử lý câu lệnh.

  2. Gọi PQexecPrepared, mà bạn chuyển đến xử lý câu lệnh và cả các tham số, được chỉ định theo kiểu tương tự như PQexecParams.

Lợi thế của việc sử dụng hai bước như thế này là bạn có thể chuẩn bị trạng thái một lần và thực thi nó nhiều lần, điều này làm giảm chi phí máy chủ liên quan đến việc phân tích cú pháp nó và lập kế hoạch truy vấn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - làm thế nào để chạy VACUUM từ mã bên ngoài khối giao dịch?

  2. Postgresql - Làm cách nào để trích xuất lần xuất hiện đầu tiên của một chuỗi con trong một chuỗi bằng cách sử dụng mẫu biểu thức chính quy?

  3. Không thể chỉ sử dụng tên bảng PostgreSQL (quan hệ không tồn tại)

  4. psql:lệnh không tìm thấy Mac

  5. Đặt SQLAlchemy để sử dụng PostgreSQL SERIAL để tạo danh tính