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

#php #sql #codeigniter

#php #sql #codeigniter

Вопрос:

У меня есть инструкция sql в моей модели,

Затем я говорю

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

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

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

Ответ №1:

Вы можете использовать это:

 $this->db->last_query();
  

«Возвращает последний выполненный запрос (строку запроса, а не результат)».

Ссылка:https://www.codeigniter.com/userguide3/database/helpers.html

Ответ №2:

Для отображения строки запроса:

 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

Комментарии:

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

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

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

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

5. ну, я понял свою проблему, oracle не принимает мой формат даты, я перепробовал все форматы, которые я думаю, он будет принимать только SYSDATE

Ответ №3:

Вы можете отобразить сгенерированный ActiveRecord SQL:

Перед выполнением запроса:

 $this->db->_compile_select(); 
  

И после ее выполнения:

 $this->db->last_query(); 
  

Комментарии:

1. когда я использую $this->db->_compile_select(); я получаю неустранимую ошибку: Вызов защищенного метода CI_DB_active_record ::_compile_select() из

2. Для меня профилировщик не подходит, не показывает запрос, который я хочу, слишком сложно просто получить SQL… У меня это работает:- echo $ this-> EE-> db->_compile_select();

3. В CI3 вместо этого используйте $this->db->get_compiled_select() .

Ответ №4:

если вам нужен быстрый тест вашего запроса, это отлично подходит для меня

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

Ответ №5:

После безуспешной попытки использовать _compiled_select() or get_compiled_select() я просто напечатал db объект, и вы можете увидеть запрос там в queries свойстве.

Попробуйте это сами:

 var_dump( $this->db );
  

Если вы знаете, что у вас есть только один запрос, вы можете распечатать его напрямую:

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

Ответ №6:

Существует новый общедоступный метод get_compiled_select , который может распечатать запрос перед его запуском. _compile_select теперь защищен, поэтому не может быть использован.

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

Комментарии:

1. Неустранимая ошибка: вызов неопределенного метода CI_DB_mysql_driver::get_compiled_select()

Ответ №7:

Вы можете просто использовать это в конце..

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

Ответ №8:

В CodeIgniter4 вы делаете это:

 $db = ConfigDatabase::connect();  
// your queries here
$query = $db->getLastQuery();
$sql = $query->getQuery();
echo $sql;
  

Ответ №9:

Ни last_query() ни get_compiled_select() у меня не работает, поэтому небольшое изменение кода Педро работает для меня просто отлично. Не включайте ->get() в свою сборку, это должно быть перед -> get()

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

Ответ №10:

Я пытаюсь ответить @Chumillas и @chhameed, но это не работает, потому что sql неверен.Итак, я нашел новый подход,подобный этому:

  • Вставить echo $sql; flush(); exit; в функцию before return $sql;
    _compile_select из DB_active_rec.php

Ответ №11:

используйте get_compiled_select() для извлечения запроса вместо его замены

Комментарии:

1. Я бы предложил показать, как использовать функцию, которую вы предлагаете в данном конкретном случае, а не просто упомянуть об этом. С наилучшими пожеланиями

Ответ №12:

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

Пример:

$query = $this->db-> запрос(‘ВЫБРАТЬ * ИЗ таблицы, где условие’);

//Добавьте эту строку.

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

exit();

или

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

Ответ №13:

Я использую 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
  }
},
  

И запустите мой отладчик с точкой останова и, наконец, просто выберите мое выражение и щелкните правой кнопкой мыши> скопировать значение.

Ответ №14:

В codeigniter 4 я использую приведенный ниже код для повторения запроса. Это особенно удобно для просмотра неправильных запросов к базе данных

 use CodeIgniterEventsEvents; 

// listen to the event before $builder->get() or $model->find()

Events::on('DBQuery', function($query){
    log_message('info', $query);
});
  

Это событие запускается всякий раз, когда выполняется новый запрос, независимо от того, успешен он или нет.

Обратитесь к официальному документу о событии DbQuery здесь.

Комментарии:

1. должно быть объявлено перед выполнением CodeIgniterModel запроса

Ответ №15:

Я прочитал все ответы здесь, но не могу получить

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

для работы это выдало мне ошибку типа,

Вызов защищенного метода CI_DB_active_record::_compile_select() из контекста ‘Welcome’ в контроллерах в строке xx

Итак, я удалил protected из приведенной ниже строки из файла systemdatabaseDB_active_rec.php , и это сработало

 protected function _compile_select($select_override = FALSE)
  

Ответ №16:

У меня была точно такая же проблема, и в конце концов я нашел решение. Мой запрос выполняется следующим образом:

 $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 '; ?>

Это работает!

Комментарии:

1. Это не способ CodeIgniter.