Làm cách nào để chọn một bảng bằng cách sử dụng một biến với db_query ()?


7

Tôi đang cố gắng tìm các bản ghi từ một bảng dựa trên một biến được lấy từ trình của người dùng. Đây là truy vấn của tôi:

$field = t('field_data_' . variable_get('tabbed_content_field'));
$fieldValue = t(variable_get('tabbed_content_field') . '_value');
$query = db_query('SELECT :fieldValue FROM {:field}', array(':field' => $field, ':fieldValue' => $fieldValue));

Tuy nhiên, bất cứ khi nào tôi chạy truy vấn này, tôi gặp lỗi sau:

PDOException: SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm truy cập: 1064 Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp đúng để sử dụng gần '' field_data_field_news_release_date '' ở dòng 2: SELECT: fieldValue TỪ {: field}; Mảng ([: trường] => field_data_field_news_release_date [: fieldValue] => field_news_release_date_value)

Tôi có thể truy xuất hồ sơ thành công với:

$query = db_query('SELECT ' . $fieldValue . ' FROM { ' . $field . '}');

Tuy nhiên, theo tôi hiểu thì điều này sẽ không an toàn.

Có ai biết tại sao truy vấn đầu tiên sẽ không hoạt động?


2
Là một lưu ý phụ, bạn không sử dụng t()cho các chuỗi không cần dịch. Tên của bảng cơ sở dữ liệu hoặc trường cơ sở dữ liệu không phải là thứ cần dịch; bảng "nút" luôn là bảng "nút", độc lập với ngôn ngữ hiện được bật cho trang web.
kiamlaluno

@kiamlaluno ah đúng thks cho điều đó.
Stephen Young

Câu trả lời:


6

Đây là một trong những lý do trình tạo truy vấn mới tồn tại trong Drupal 7, vì vậy bạn có thể tự động thay thế các phần của truy vấn:

$table_name = 'the_table';
$field_name = 'a_field';
$query = db_select($table_name)->fields($table_name, array($field_name));

Sử dụng db_query()bạn chỉ nhận được thay thế tham số, mà sẽ chỉ áp dụng cho thay thế trong WHEREđiều kiện. Điều này có nghĩa là bạn không thể sử dụng db_query()để thay thế tên bảng, tên của các trường được chọn, v.v., chỉ WHEREđiều kiện.

Có một cái nhìn về các db_select()tài liệu cho các ví dụ sâu hơn, bao gồm cả cách thêm điều kiện vào truy vấn động.


Cảm ơn rất nhiều Clive - điều đó đã làm việc cho tôi. Hàm db_select có tự động vệ sinh mục nhập dữ liệu độc hại không?
Stephen Young

1
@StephenYoung Nó cũng vậy, lớp cơ sở dữ liệu Drupal về cơ bản là một trình bao bọc xung quanh PDO để bạn có được tất cả các ưu điểm truy vấn được tham số hóa được xây dựng ngay. Cách duy nhất để sử dụng nó một cách không an toàn giống như ví dụ thứ hai trong câu hỏi của bạn, như bạn nói đúng có khả năng mở để khai thác.
Clive

@StephenYoung Dữ liệu được chuyển đến API cơ sở dữ liệu được khử trùng.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.