SelectQuerythực hiện SelectQuery::__toString(), được gọi trong bối cảnh yêu cầu một chuỗi.
Hãy xem xét các mã sau đây.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Đầu ra của nó là một trong những sau đây.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Để có được các mảng đối số được sử dụng cho truy vấn, bạn có thể gọi SelectQuery::arguments().
Đoạn mã sau in ra truy vấn và các đối số của nó bằng cách sử dụng các hàm có sẵn từ mô-đun Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());

Tuy nhiên, mô-đun Devel không cần thiết và bạn có thể drupal_set_message()hiển thị đầu ra. Ví dụ: bạn có thể sử dụng hàm sau để lấy chuỗi có trình giữ chỗ được thay thế bằng giá trị thực của chúng.
function _get_query_string(SelectQueryInterface $query) {
$string = (string) $query;
$arguments = $query->arguments();
if (!empty($arguments) && is_array($arguments)) {
foreach ($arguments as $placeholder => &$value) {
if (is_string($value)) {
$value = "'$value'";
}
}
$string = strtr($string, $arguments);
}
return $string;
}
Mã ví dụ trước tôi đã hiển thị sẽ trở thành mã sau.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
drupal_set_message(format_string('Query: %query', array('%query' => _get_query_string($query))));
function _get_query_string(SelectQueryInterface $query) {
$string = (string) $query;
$arguments = $query->arguments();
if (!empty($arguments) && is_array($arguments)) {
foreach ($arguments as $placeholder => &$value) {
if (is_string($value)) {
$value = "'$value'";
}
}
$string = strtr($string, $arguments);
}
return $string;
}
Chú ý rằng SelectQuery::arguments()trả về mảng các đối số truy vấn chỉ khi nó được gọi sau SelectQuery::__toString(), SelectQuery::compile()hoặc SelectQuery::execute(); nếu không, SelectQuery::arguments()trả lại NULL.
Bạn có thể sử dụng một hàm tương tự như hàm sau để lấy truy vấn chuỗi, với các phần giữ chỗ được thay thế bằng các đối số.
_get_query_string()lẽ ra phải là một phần củaSelectQuerygiao diện.