SelectQuery
implementa SelectQuery::__toString()
, che viene chiamato nei contesti in cui è richiesta una stringa.
Considera il seguente codice.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Il suo output è il seguente.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Per ottenere l'array di argomenti utilizzati per la query, è possibile chiamare SelectQuery::arguments()
.
Il codice seguente stampa la query e i suoi argomenti usando le funzioni rese disponibili dal modulo Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
Il modulo Devel non è necessario, tuttavia, e potresti drupal_set_message()
mostrare l'output. Ad esempio, è possibile utilizzare la seguente funzione per ottenere una stringa con i segnaposto sostituiti dai loro valori effettivi.
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;
}
Il precedente codice di esempio che ho mostrato sarebbe diventato il seguente.
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;
}
Si noti che SelectQuery::arguments()
restituisce l'array di argomenti di query solo quando viene chiamato dopo SelectQuery::__toString()
, SelectQuery::compile()
oppure SelectQuery::execute()
; altrimenti, SelectQuery::arguments()
ritorna NULL
.
È possibile utilizzare una funzione simile alla seguente per ottenere la query stringa, con i segnaposto sostituiti con gli argomenti.
_get_query_string()
avrebbe dovuto far parteSelectQuery
dell'interfaccia.