#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;
в функцию beforereturn $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.