SelectQuery
implementiert SelectQuery::__toString()
, was in den Kontexten aufgerufen wird, in denen ein String erforderlich ist.
Betrachten Sie den folgenden Code.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Seine Ausgabe ist die folgende.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Um das Array der für die Abfrage verwendeten Argumente abzurufen, können Sie Folgendes aufrufen SelectQuery::arguments()
.
Der folgende Code druckt die Abfrage und ihre Argumente mit den im Modul Devel verfügbaren Funktionen.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
Das Devel-Modul ist jedoch nicht erforderlich, und Sie können drupal_set_message()
die Ausgabe anzeigen . Sie können beispielsweise die folgende Funktion verwenden, um eine Zeichenfolge abzurufen, bei der die Platzhalter durch ihre tatsächlichen Werte ersetzt werden.
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;
}
Der vorherige Beispielcode, den ich gezeigt habe, würde der folgende sein.
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;
}
Beachten Sie, dass SelectQuery::arguments()
die Anordnung der Abfrage Argumente nur zurückgibt , wenn es nach aufgerufen wird SelectQuery::__toString()
, SelectQuery::compile()
oder SelectQuery::execute()
; Andernfalls wird SelectQuery::arguments()
zurückgegeben NULL
.
Sie können eine Funktion verwenden, die der folgenden ähnlich ist, um die Zeichenfolgenabfrage abzurufen, wobei die Platzhalter durch die Argumente ersetzt werden.
_get_query_string()
ein Teil derSelectQuery
Schnittstelle gewesen sein sollte.