Bạn có thể làm điều đó với sprintf
, nhưng không phải một mình (an toàn). Trên một hệ thống lành mạnh, sử dụng snprintf
hai lần, một lần để tìm ra kích thước để sử dụng và lần thứ hai để thực sự làm điều đó. Điều này tùy thuộc vào số snprintf
trả về số lượng ký tự cần thiết khi hết phòng. Các hệ thống tương thích với Linux, BSD và C99 thực hiện điều này; Windows thường không. Trong trường hợp thứ hai, bạn sẽ cần phải cấp phát một bộ đệm ban đầu và cấp phát một bộ đệm lớn hơn nếu snprintf
không thành công (trong vòng lặp cho đến khi snprintf
thành công). Nhưng trên C99, sau đây sẽ làm việc:
char *buf;
size_t sz;
sz = snprintf(NULL, 0, "select key from answer WHERE key = %s LIMIT 5;", tmp);
buf = (char *)malloc(sz + 1); /* make sure you check for != NULL in real code */
snprintf(buf, sz+1, "select key from answer WHERE key = %s LIMIT 5;", tmp);
Tuy nhiên, để xây dựng SQL, nó là tốt hơn để sử dụng prepared statements. Chúng tránh các lỗ hổng SQL injection (và thường xuyên cần đến sprintf
). Với chúng, bạn sẽ chuẩn bị câu lệnh "select key from answer where key =? Limit 5;", và sau đó thực thi nó với tham số tmp
. Các công cụ SQL đặt trong chuỗi và loại bỏ sự cần thiết để đảm bảo nó được thoát đúng cách đầu tiên.
Nguồn
2009-11-17 00:13:51
Một trong những lý do tại sao tốt hơn là ràng buộc tham số – eckes