SelectQuery
implémente SelectQuery::__toString()
, qui est appelée dans les contextes où une chaîne est requise.
Considérons le code suivant.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Sa sortie est la suivante.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Pour obtenir le tableau des arguments utilisés pour la requête, vous pouvez appeler SelectQuery::arguments()
.
Le code suivant imprime la requête et ses arguments à l'aide des fonctions fournies par le module Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
Le module Devel n'est cependant pas nécessaire et vous pouvez drupal_set_message()
afficher le résultat. Par exemple, vous pouvez utiliser la fonction suivante pour obtenir une chaîne avec les espaces réservés remplacés par leurs valeurs réelles.
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;
}
L'exemple de code précédent que j'ai montré deviendrait le suivant.
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;
}
Notez que SelectQuery::arguments()
renvoie le tableau d'arguments de la requête que si elle est appelée après SelectQuery::__toString()
, SelectQuery::compile()
ou SelectQuery::execute()
; sinon, SelectQuery::arguments()
retourne NULL
.
Vous pouvez utiliser une fonction similaire à la suivante pour obtenir la requête de chaîne, les espaces réservés étant remplacés par les arguments.
_get_query_string()
aurait dû faire partie de l'SelectQuery
interface.Vous pouvez utiliser dpq () pour afficher la requête et dpr () pour afficher le résultat.
la source
try
catch
bloc lorsque la requête échoue. Donc pas utile dans mon cas si je ne peux pas déboguer la requête cassée.Une autre option est:
la source
dpq
Cela ne semble pas le permettre, même dans un try / catch.Les réponses ci-dessus sont utiles lorsque Devel est installé et configuré.
La meilleure façon d’imprimer la requête sans utiliser Devel est la suivante.
Nous pouvons utiliser l'une des méthodes ci-dessus pour imprimer la requête.
la source
J'ai une bonne solution que vous pouvez copier / coller votre chaîne de requête directement dans la section "SQL" de Phpmyadmin et déboguer votre requête (j'utilise souvent cette méthode lorsque j'ai des difficultés avec la requête)
J'espère que cela sera utile pour les autres gars.
la source