Как распечатать оператор SQL в модели codeigniter


107

В моей модели есть оператор sql,

Я тогда говорю

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

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

Мой запрос всегда терпит неудачу, как мне заставить php печатать точный оператор sql, отправляемый в мою базу данных? И отобразить это в моем представлении php, странице

Ответы:


125

Чтобы отобразить строку запроса:

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


8
когда я делаю print_r ($ query); вообще ничего не распечатывает
Technupe

1
Используйте встроенный профилировщик CI, подробнее здесь
ноя

2
все, что я хочу сделать, это распечатать инструкцию sql, переданную в базу данных, извините, но профилировщик
тоже

Посетите ссылку на руководство пользователя, которую я опубликовал, если она не работает, расскажите нам, что произойдет вместо этого.
Ново

ну, я понял свою проблему, 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

1

Добавьте эту строку сразу после запроса, который хотите распечатать.

Пример:

$ query = $ this-> db-> query ('ВЫБРАТЬ * ИЗ таблицы WHERE условие');

// Добавляем эту строку.

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

выход();

или

эхо $ 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.