我想以编程方式打印使用db_select()构建的查询。Drupal抽象层提供任何API函数吗?
它类似于Views中的查询输出,但是我想从我的自定义模块中打印它以进行调试。
我想以编程方式打印使用db_select()构建的查询。Drupal抽象层提供任何API函数吗?
它类似于Views中的查询输出,但是我想从我的自定义模块中打印它以进行调试。
Answers:
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
。
您可以使用类似于以下函数的函数来获取字符串查询,并用参数替换占位符。
$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
接口的一部分。