Db_select () kullanılarak oluşturulan sorguyu yazdırın


61

Db_select () kullanılarak oluşturulan sorguyu programatik bir şekilde yazdırmak istiyorum . Drupal Abstraction Layer tarafından sağlanan herhangi bir API işlevi var mı?
Görünümler'deki sorgu çıktısına benzer, ancak hata ayıklama amacıyla özel modülümden yazdırmak istiyorum.

Yanıtlar:


67

SelectQuerySelectQuery::__toString()Bir dize gereken bağlamlarda denilen uygular .

Aşağıdaki kodu düşünün.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print $query;

Çıktıları aşağıdaki gibidir.

SELECT block.*
FROM 
{block} block
WHERE  (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)

Sorgu için kullanılan argüman dizisini almak için arayabilirsiniz SelectQuery::arguments().

Aşağıdaki kod, Devel modülünden sağlanan işlevleri kullanarak sorguyu ve argümanlarını yazdırır.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

dpm((string) $query);
dpm($query->arguments());

ekran görüntüsü

Ancak Devel modülü gerekli değildir drupal_set_message()ve çıktıyı gösterebilirsiniz. Örneğin, yer tutucuları gerçek değerleriyle değiştiren bir dize elde etmek için aşağıdaki işlevi kullanabilirsiniz.

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;
}

Gösterdiğim önceki örnek kod aşağıdaki olurdu.

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;
}

Uyarı SelectQuery::arguments()bu sonra çağrılan tek sorgu argümanlar dizi döndürür SelectQuery::__toString(), SelectQuery::compile()ya da SelectQuery::execute(); Aksi takdirde SelectQuery::arguments()döner NULL.

Dize sorgusunu almak için, yer tutucuları argümanlarla değiştirmek için aşağıdakine benzer bir işlev kullanabilirsiniz.


1
Bunun gibi bir fonksiyonun arayüzün bir _get_query_string()parçası olması gerektiğini düşünüyorum SelectQuery.
dashohoxha

46

Sen kullanabilirsiniz DPQ () sorgusu ve görüntülemek için DPR () sonucunu görüntülemek için.

  $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.

1
Bunun Devel modülünün kurulmasını gerektirdiğini unutmayın. Devel kullanıyorsanız (onu seviyorum), bu gitmek için en kolay yoldur.
joe_flash

2
dpq () hayatım boyunca neredeydin!
Lomax,

try catchSorgu başarısız olduğunda bir blokta iş görünmüyor . Öyleyse benim durumumda yardımcı değil, eğer bozuk sorguyu hata ayıklayamazsam.
Kiee,

19

Başka bir seçenek:

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print strtr((string) $query, $query->arguments());

2
Gerçekten kısa ve özlü.
dashohoxha

2
Herhangi bir şişkinlik / 3. parti modül gerektirmez. Ayrıca bu, yürütülmeyen sorgular üzerinde çalışır, bu nedenle başarısız olan ve hata veren bir sorgu yazdırabilirsiniz, dpqdenemeye / yakalamaya bile izin vermez.
Kiee,

1
Bu doğru cevap olmalı.
albertski

8

Devel'i kurup yapılandırdığınızda yukarıdaki cevaplar iyidir.

Sorguyu Devel olmadan yazdırmanın en iyi yolu aşağıdaki gibidir.

$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
//One way
echo $query->__toString();
// Second way
echo (string)$query;

Sorguyu yazdırmak için yukarıdaki yöntemlerden birini kullanabiliriz.


4

Sorgu dizenizi doğrudan Phpmyadmin'deki "SQL" bölümünde kopyalayıp yapıştırabileceğiniz ve sorgunuzu ayıklayabileceğiniz iyi bir çözümüm var (Sorgu ile mücadele ederken genellikle bu yöntemi kullanırım)

$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);

Umarım bu diğer çocuklar için faydalı olur.

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.