Как отследить ошибки SQL в CakePHP на производственном сайте

Я хочу отслеживать ошибки на производственном сайте, если функция вставки или обновления не работает.

Чтобы проверить эту функциональность, я добавил в свой контроллер функцию: —

function testSqlStatement(){

$this->autoRender = false;
$save=array('UserId'=>'48','Active'=>'qw');
$this->User->saveAll($save);
$log = $this->getDataSource()->error;
$this->log('sql error' . print_r($log, true), 'sql');
}

я получаю ошибку: — вызов неопределенного метода AdminsController :: getDataSource ()
где я должен определить источник getdatasource? есть ли другой способ узнать ошибку, не изменяя отладку на 2

1

Решение

Вы используете следующий способ:

Обратный вызов onError вызывается классом DboSource в методах create (), read (), update () и delete (). Итак, если вы пишете пользовательский запрос и вызываете его через метод query () модели, onError () не будет вызываться автоматически, но не беспокойтесь, вы все равно можете отслеживать ошибки SQL. Эти методы CRUD вместе с query (), в свою очередь, используют метод execute (), который устанавливает ошибку SQL для переменной класса с именем «error»

Методы lastError () уже реализованы в каждом источнике DBO (mysql, mssql и т. Д.).

Давайте двигаться вперед, чтобы написать нашу модель обратного вызова. Пример кода для регистрации ошибки в текстовом файле будет выглядеть примерно так:

<?php

function onError()
{
// The SQL error
$error = $this->getDataSource()->error;

// Log file
$logFile = LOGS . 'sql_errors.txt';

// Log the error
file_put_contents($logFile, file_get_contents($logFile) . $error . "\n\n");
}

Этот код может идти в вашей app_model.

Еще один пример кода для отправки сообщения об ошибке будет что-то вроде

function onError()
{
// The SQL error
$error = $this->getDataSource()->error;

// Send the error
mail('[email protected]', 'SQL errors', $error);
}
0

Другие решения

Ваша проблема в том, что вы звоните $this->getDataSource когда $this имеет в виду контроллер, а не модель. Ты хочешь $this->User->getDataSource() вместо:

function testSqlStatement(){
$this->autoRender = false;
$save = array('UserId'=>'48','Active'=>'qw');
$this->User->saveAll($save);
$log = $this->User->getDataSource()->error;
$this->log('sql error' . print_r($log, true), 'sql');
}
0

По вопросам рекламы [email protected]