プログラムでdb_select()を使用して構築されたクエリを印刷したい。Drupal Abstraction Layerによって提供されるAPI関数はありますか?
これはビューのクエリ出力に似ていますが、デバッグ用にカスタムモジュールから出力したいです。
プログラムでdb_select()を使用して構築されたクエリを印刷したい。Drupal Abstraction Layerによって提供されるAPI関数はありますか?
これはビューのクエリ出力に似ていますが、デバッグ用にカスタムモジュールから出力したいです。
回答:
SelectQuery
implements SelectQuery::__toString()
は、文字列が必要なコンテキストで呼び出されます。
次のコードを検討してください。
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
出力は次のとおりです。
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
クエリに使用される引数の配列を取得するには、を呼び出すことができますSelectQuery::arguments()
。
次のコードは、Develモジュールから使用可能な関数を使用して、クエリとその引数を出力します。
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
ただし、Develモジュールは必要ありませんdrupal_set_message()
。出力を表示できます。たとえば、次の関数を使用して、プレースホルダーを実際の値に置き換えた文字列を取得できます。
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;
}
前に示したコード例は次のようになります。
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;
}
SelectQuery::arguments()
クエリ引数の配列は、、、またはの後SelectQuery::__toString()
に呼び出されたときにのみ返されることに注意してください。そうでなければ、を返します。SelectQuery::compile()
SelectQuery::execute()
SelectQuery::arguments()
NULL
次のような関数を使用して、プレースホルダーを引数に置き換えて文字列クエリを取得できます。
あなたは使用することができます)(DPQ *クエリ、および表示する)DPRを(結果を表示します。
$query = db_select('users','u');
$query->fields('u');
$query->condition('u.uid', 1042);
$result = $query->execute()->fetchAll();
dpq($query); // Display the query.
dpr($result); // Display the query result.
try
catch
クエリが失敗した場合、ブロックで機能するようには見えません。壊れたクエリをデバッグできない場合、私の場合は役に立ちません。
別のオプションは次のとおりです。
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print strtr((string) $query, $query->arguments());
dpq
、try / catchでも許可されていないようです。
私はあなたがPhpmyadminの「SQL」セクションに直接クエリ文字列をコピー/貼り付けてクエリをデバッグできる良い解決策を持っています(クエリに苦労するとき、私はしばしばこの方法を使用します)
$querystring=$query->__toString();
$querystring=str_replace("{",'',$querystring);
$querystring=str_replace("}",'',$querystring);
foreach($query->getArguments() as $key=> $item){
if(!$item) {
$item = 'NULL';
}
$querystring=str_replace($key.')',$item.')',$querystring);
}
dpm($querystring);
これが他の人たちにとって役に立つことを願っています。
_get_query_string()
はSelectQuery
インターフェースの一部であるはずだったと思います。