SelectQuery
thự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ủaSelectQuery
giao diện.