Yanlış davranan bir modül var. Bir EFQ beklenmeyen sonuçları geri alıyor, ancak neden sadece koda bakarak göremiyorum . EFQ’lar için dpq () eşdeğeri var mı? Onları hata ayıklamanın diğer yolları?
Yanlış davranan bir modül var. Bir EFQ beklenmeyen sonuçları geri alıyor, ancak neden sadece koda bakarak göremiyorum . EFQ’lar için dpq () eşdeğeri var mı? Onları hata ayıklamanın diğer yolları?
Yanıtlar:
Bir kesmek biraz zor, ancak EntityFieldQuery
sorguyu yazdırmakla ilgilenen kişilere bir etiket ekleyebilir , daha sonra hook_query_alter()
standart olduğunda engellemek için uygulayabilir SelectQuery
, sonra hata ayıklama için dizeye atabilirsiniz:
function MYMODULE_query_alter($query) {
if ($query->hasTag('efq_debug')) {
dpm((string)$query);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node')
->addTag('efq_debug')
->execute();
Bu bir hack biraz ama hile yapar. Yukarıdakilerin çıktısı:
SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type
AS entity_type
FROM {node} node
Muhtemelen bu, yalnızca saha depolama sistemi olarak MySQL kullanırken de işe yarar.
hook_query_alter()
Sorgulama zamanı geldiğinde EntityFieldQuery
, artık bir standarda dönüştürülmedi db_select()
, bu yüzden __tostring()
harika çalışıyor :) Bunu yaptığımdan beri oldukça çok kullanıyorum ve oldukça iyi çalışıyor
hook_query_alter()
.
Kendi hook_query_alter () 'inizi yuvarlamak yerine, Devel modülünün sizin için ağır kaldırma işlemini yapmasına izin verebilirsiniz debug
:
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
Bu, sorguyu tıpkı ekrana benzer şekilde dpq()
basar.
Genellikle sorguyu değer ile birlikte değil, yer tutucu ile birlikte basan @Clive cevabını eklemek. Sorgu ile değeri yazdırmak için hook_query_alter altındaki aşağıdaki kodu kullanın.
function hook_query_alter($query) {
if ($query->hasTag('debug')) {
$sql = (string)$query;
$connection = Database::getConnection();
foreach ((array) $query->arguments() as $key => $val) {
$quoted[$key] = $connection->quote($val);
}
$sql = strtr($sql, $quoted);
dpm($sql);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug');
->execute();
Birkaç kod satırı için bir modül kurmak iyi bir uygulama değildir. Bu yüzden yukarıda belirtilen çözümü seçtim.
Nice DPQ'nun dev sürümünü (veya herhangi bir şey => 1.1) indirirseniz, aşağıdakileri yapabilirsiniz:
$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();
ve güzel dpm'ed sorgusu alacaksınız :). Yukarıdaki kodda yer alan önemli kısım addTag ('nicedpq') - yani tetikleyicidir dpm()
.
XDebug aracılığıyla hata ayıklamayı deneyebilirsiniz . Kurulduktan sonra xdebug_start_trace()
, koddan önce yapın ve xdebug_stop_trace()
bundan sonra, neyin yürütüldüğünü ve nerede yapıldığını net bir izleme günlüğüne sahip olacaksınız.
Ayrıca MySQL yapılandırmasında sorgu günlüğünü etkinleştirebilirsiniz.
Diğer yöntem ise strace / truss / dtruss benzeri hata ayıklayıcıları kullanmaktır.
Dtruss kullanarak örnek:
tüm sorgular
sudo dtruss -t read -n mysqld
belirli sorgular
sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
Bunun dtruss
yalnızca DTrace kullanan bir komut dosyası olduğunu unutmayın , bu nedenle kendi komut dosyanızı yazarak doğrudan PHP DTrace statik problarının veya DTracing MySQL'in uygulanmasını düşünebilirsiniz .
Devamını oku: Komut satırını kullanarak strupal çekirdeğin gelişmiş hata ayıklaması (strace & tcpdump)
Bu işlevi modülünüze ekleyin. Ardından, etiketi debug
herhangi bir EFQ'ya ekleyin. Sorgu yazdırmak için Devel modülünün etkin olmasını gerektirir.
/**
* Implements hook_query_TAG_alter().
*
* Add the tag 'debug' to any EFQ and this will print the query to the messages.
*
* @param \QueryAlterableInterface $query
*/
function MYMODULE_query_debug_alter(QueryAlterableInterface $query) {
if (function_exists('dpq') && !$query->hasTag('debug-semaphore')) {
$query->addTag('debug-semaphore');
dpq($query);
}
}