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.Sie können dpq () verwenden , um die Abfrage anzuzeigen, und dpr () , um das Ergebnis anzuzeigen.
quelle
try
catch
Block zu funktionieren , wenn die Abfrage fehlschlägt. In meinem Fall also nicht hilfreich, wenn ich die fehlerhafte Abfrage nicht debuggen kann.Eine andere Option ist:
quelle
dpq
ausgibt. Dies scheint selbst bei einem Versuch / Fang nicht zuzulassen.Die obigen Antworten sind gut, wenn Sie Devel installiert und konfiguriert haben.
Der beste Weg, die Abfrage ohne Devel zu drucken, ist der folgende.
Wir können eine der oben genannten Möglichkeiten verwenden, um die Abfrage zu drucken.
quelle
Ich habe eine gute Lösung, Sie können Ihre Abfragezeichenfolge direkt in den Abschnitt "SQL" in Phpmyadmin kopieren / einfügen und Ihre Abfrage debuggen (ich verwende diese Methode oft, wenn ich mit der Abfrage zu kämpfen habe).
Ich hoffe, das ist nützlich für andere Leute.
quelle