Як надрукувати оператор SQL у моделі кодигінера


107

Я маю заяву sql у своїй моделі,

Я тоді кажу

$query = $this->db->query($sql, array(fields, fields1);

if ($query) {
    return true:
} else {
    echo "failed";
    return false;
}

Мій запит завжди не вдається, як мені змусити PHP роздрукувати точну заявку sql, що надсилається до моєї бази даних? І відобразити це на моїй сторінці php, на сторінці

Відповіді:


124

Щоб відобразити рядок запиту:

print_r($this->db->last_query());    

Щоб відобразити результат запиту:

print_r($query);

Клас Profiler відображатиме результати порівняння, запити, які ви виконували, та $ _POST дані внизу ваших сторінок. Щоб увімкнути профілер, розмістіть наступний рядок у будь-якому місці методів контролера:

$this->output->enable_profiler(TRUE);

Посібник користувача з профілювання: https://www.codeigniter.com/user_guide/general/profiling.html


7
коли я роблю print_r ($ запит); нічого не роздруковується
Technupe

1
Використовуйте CI вбудований в профайлер, докладніше тут
Novo

2
все, що я хочу зробити, це роздрукувати заяву sql, передане в базу даних, сорі, але профайлер теж не дуже допомагає
Technupe

Перейдіть за посиланням користувача, яке я опублікував, якщо воно не працює, повідомте нам, що відбувається натомість.
Ново,

добре, я зрозумів, що моя проблема, oracle не приймає формат моєї дати, я намагався будь-якого формату, я думаю, він прийме лише SYSDATE
Technupe


41

Ви можете відобразити SQL, створений ActiveRecord:

Перед запуском запиту:

$this->db->_compile_select(); 

А після запуску:

$this->db->last_query(); 

4
коли я використовую $ this-> db -> _ compile_select (); я отримую фатальну помилку: виклик захищеного методу CI_DB_active_record :: _ compile_select () від
Angelin Nadar

Справа з профілером для мене не корисна, не показує потрібний запит, її надто складний, щоб просто отримати SQL ... Це працює для мене: - echo $ this-> EE-> db -> _ compile_select ();
Лоранс Коуп

3
У CI3 Використовуйте $this->db->get_compiled_select()замість цього.
Нік Цай

17

якщо вам потрібен швидкий тест на ваш запит, для мене це чудово працює

echo $this->db->last_query(); die;

14

Після спроби без успіху використати _compiled_select()або get_compiled_select()я просто надрукував dbоб’єкт, і ви можете побачити запит там у queriesвласність.

Спробуйте самі:

var_dump( $this->db );

Якщо ви знаєте, що у вас є лише один запит, ви можете надрукувати його безпосередньо:

echo $this->db->queries[0];

9

Існує новий публічний метод, get_compiled_selectякий може надрукувати запит перед його запуском. _compile_selectтепер захищений, тому не може бути використаний.

echo $this->db->get_compiled_select(); // before $this->db->get();

4
Фатальна помилка: виклик невизначеного методу CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


2

Ні last_query()або get_compiled_select()працює для мене, так що невелика зміна коду Педру працює для мене просто відмінно. Не включайте ->get()у свою збірку, це має бути до -> get ()

 echo $this->EE->db->_compile_select();

1

Я намагаюся відповісти @ Chumillas і відповідь @ chhameed, але це не спрацювало, тому що sql помиляється. Отже, я знайшов новий підхід, як-от так:

  • Вставити echo $sql; flush(); exit;до return $sql; _compile_selectфункціїDB_active_rec.php

0

Додайте цей рядок відразу після запиту, який потрібно надрукувати.

Приклад:

$ query = $ this-> db-> query ('SELECT * FROM table WHERE condition');

// Додати цей рядок.

var_dump ($ this-> db-> last_query ());

вихід();

або

echo $ this-> db-> last_query ();


0

Я використовую xdebug для перегляду цих значень у VSCode із відповідним розширенням та CI v2.x. Я додаю вираз $this->db->last_query()у розділ перегляду, і додаю xdebugSettingsвузол, подібний до цих рядків, для отримання значення без скорочення у launch.json.

{
  "name": "Launch currently open script",
  "type": "php",
  "request": "launch",
  "program": "${file}",
  "cwd": "${fileDirname}",
  "port": 9000,
  "xdebugSettings": {
    "max_data": -1,
    "max_children": -1
  }
},

І запустіть мій налагоджувач з точкою розриву, і, нарешті, просто виберіть мій вираз і натисніть праворуч> копіюйте значення.


-1

У мене була точно така ж проблема і врешті знайшли рішення. Мій запит працює так:

$result = mysqli_query($link,'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC ');

Щоб відобразити команду sql, все, що мені потрібно було зробити, це створити змінну ($ resultstring) з точно таким же вмістом, що і мій запит, а потім повторити її, як це:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Це працює!


Це не спосіб CodeIgniter.
mickmackusa

-1

використовувати get_compiled_select()для отримання запиту замість заміни


Я б запропонував показати, як використовувати функцію, яку ви пропонуєте в цьому конкретному випадку, а не просто згадувати про неї. З найкращими побажаннями
YakovL

-2

Я прочитав тут усі відповіді, але не можу отримати

echo $this->db->get_compiled_select();

працювати, це дало мені помилку,

Виклик захищеного методу CI_DB_active_record :: _ compile_select () з контексту "Welcome" в контролерах на лінії xx

Тому я видалив protectedз нижнього рядка з файлу \system\database\DB_active_rec.phpі він працював

protected function _compile_select($select_override = FALSE)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.