EntityFieldQuery hata ayıklama?


27

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ı?


Benzer soru: drupal.stackexchange.com/questions/33473/… . SQL'in ipucu verip vermediğini kontrol etmek için sorgu nesnesini bir dizgeye fırlatabilir misiniz?
Clive

1
Bununla birlikte harika öneriler: Kurtarılabilir ölümcül hata: Sınıf nesnesi EntityFieldQuery, dizgeye dönüştürülemedi :(
Letharion

Yanıtlar:


36

Bir kesmek biraz zor, ancak EntityFieldQuerysorguyu 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.


Teoride harika geliyor, ama soru hakkındaki yorumlar ne olacak? EFQ __toString () öğesini uygulamıyor mu?
Letharion,

4
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
Clive

Dizeye döküm işleminin, sorgu alındıktan sonra çalıştığını onayladı hook_query_alter().
Ağustos'ta

Argumentos sorgusunu görmek için (yukarıdaki örnekte ": entity_type") dpm ($ query-> arguments ());
sanzante

13

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.


4

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.


2

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().


devel için güzel alternatif geçici çözüm. Bu modül doğrudan DO üzerinden bulunamadı, çünkü orada bulunan önceki modül bloğunu kaldırdılar.
15’de

1

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 dtrussyalnı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)


0

Bu işlevi modülünüze ekleyin. Ardından, etiketi debugherhangi 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);
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.