SelectQuery
mengimplementasikan SelectQuery::__toString()
, yang disebut dalam konteks di mana string diperlukan.
Pertimbangkan kode berikut.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
print $query;
Keluarannya adalah sebagai berikut.
SELECT block.*
FROM
{block} block
WHERE (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)
Untuk mendapatkan berbagai argumen yang digunakan untuk kueri, Anda bisa menelepon SelectQuery::arguments()
.
Kode berikut mencetak kueri dan argumennya menggunakan fungsi yang tersedia dari modul Devel.
global $theme_key;
$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
dpm((string) $query);
dpm($query->arguments());
Modul Devel tidak perlu, dan Anda bisa drupal_set_message()
menampilkan hasilnya. Misalnya, Anda bisa menggunakan fungsi berikut untuk mendapatkan string dengan placeholder diganti dengan nilai aktualnya.
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;
}
Contoh kode sebelumnya yang saya tunjukkan akan menjadi yang berikut.
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;
}
Perhatikan bahwa SelectQuery::arguments()
mengembalikan array argumen permintaan hanya ketika dipanggil setelah SelectQuery::__toString()
, SelectQuery::compile()
atau SelectQuery::execute()
; jika tidak, SelectQuery::arguments()
kembali NULL
.
Anda bisa menggunakan fungsi yang mirip dengan yang berikut ini untuk mendapatkan kueri string, dengan placeholder diganti dengan argumen.
_get_query_string()
seharusnya menjadi bagian dariSelectQuery
antarmuka.Anda dapat menggunakan dpq () untuk menampilkan kueri, dan dpr () untuk menampilkan hasilnya.
sumber
try
catch
blok ketika kueri gagal. Jadi tidak membantu dalam kasus saya jika saya tidak dapat men-debug permintaan yang rusak.Pilihan lain adalah:
sumber
dpq
tampaknya tidak mengizinkan ini bahkan dalam coba / tangkap.Jawaban di atas baik ketika Anda telah menginstal dan mengkonfigurasi Devel.
Cara terbaik untuk mencetak kueri tanpa Devel adalah seperti di bawah ini.
Kami dapat menggunakan salah satu cara di atas untuk mencetak kueri.
sumber
Saya punya solusi bagus yang bisa Anda salin / tempel string kueri Anda langsung di bagian "SQL" di Phpmyadmin dan debug permintaan Anda (saya sering menggunakan metode ini ketika saya berjuang dengan permintaan)
Saya harap ini bermanfaat bagi orang lain.
sumber