Проблема с запросами в базу mysql CDbException

Вопросы и ответы по изменению функционала, смене дизайна, переносу сайта и т.п.

Модераторы: Xpycm, Koduc

Правила форума
ВНИМАНИЕ! Форум не является средством гарантированной поддержки клиентов и пользователей. Поэтому на быстрый ответ тут рассчитывать не нужно, как и на ответ вообще. Сотрудники отвечают по мере своих возможностей.

На форуме действует ограничение в 3 сообщения / сутки.
Если Вы хотите сказать "спасибо", то воспользуйтесь функцией "Повысить репутацию" - зелёная иконка "плюс" под ником ответившего.

Проблема с запросами в базу mysql CDbException

Сообщение illuzii » 12 мар 2022, 13:24

Добрый день,

после обновления операционки (был переезд на новый VPS) debian 9 -> 11 и обновления mysql.

Фронтэнд полностью работает, работает отправка писем из форм, все ок.

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

CDbException
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value...


Так же не могу создать любой новый объект - Добавить объявление

CDbException

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY000]: General error: 1364 Field 'loc_country' doesn't have a default value. The SQL statement executed was: INSERT INTO `ore_apartment` (`visits`, `date_updated`, `is_price_poa`, `num_of_rooms`, `floor`, `floor_total`, `square`, `land_square`, `window_to`, `living_conditions`, `services`, `berths`, `lat`, `lng`, `rating`, `price_type`, `sorter`, `autoVKPostId`, `autoFBPostId`, `autoTwitterPostId`, `ploshchad_zh12`, `ploshchad_ku`, `obshchaja_pl`, `obshchaja_pl1`, `active`, `owner_active`, `type`, `date_manual_updated`, `description_ru`, `owner_id`, `obj_type_id`, `price`, `date_created`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8, :yp9, :yp10, :yp11, :yp12, :yp13, :yp14, :yp15, :yp16, :yp17, :yp18, :yp19, :yp20, :yp21, :yp22, :yp23, :yp24, :yp25, :yp26, NOW(), :yp27, :yp28, :yp29, :yp30, NOW())

/framework/db/CDbCommand.php(358)

346 {
347 if($this->_connection->enableProfiling)
348 Yii::endProfile('system.db.CDbCommand.execute('.$this->getText().$par.')','system.db.CDbCommand.execute');
349
350 $errorInfo=$e instanceof PDOException ? $e->errorInfo : null;
351 $message=$e->getMessage();
352 Yii::log(Yii::t('yii','CDbCommand::execute() failed: {error}. The SQL statement executed was: {sql}.',
353 array('{error}'=>$message, '{sql}'=>$this->getText().$par)),CLogger::LEVEL_ERROR,'system.db.CDbCommand');
354
355 if(YII_DEBUG)
356 $message.='. The SQL statement executed was: '.$this->getText().$par;
357
358 throw new CDbException(Yii::t('yii','CDbCommand failed to execute the SQL statement: {error}',

Это касается не только Добавить объявление - но похожие ошибки и получаю при попытке добавить Новость, Вопрос-ответ, Комментарий.

Все связаны с изменениями которые произошли в новых версиях mysql и не были учтены в коде движка сайта:
https://github.com/yiisoft/yii/issues/2993

Куда рыть не знаю.
Помогите советом, готов оплатить посильную помощь.
illuzii
Прохожий
 
Сообщения: 44
Зарегистрирован: 12 окт 2015, 22:16
Очки репутации: -6

Re: Проблема с запросами в базу mysql CDbException

Сообщение illuzii » 12 мар 2022, 14:19

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

Мое предположение: по умолчанию когда openrealestate создает объект, то эти ячейки в базе данных не имеют значение NULL - они просто пустые, из-за этого происходит ошибка. Если в существующем объекте заполнить все пустые поля, то такой объект нормально сохранится, если хоть одно поле будет незаполненным (даже если это необязательное поле) - то получим ошибку.
illuzii
Прохожий
 
Сообщения: 44
Зарегистрирован: 12 окт 2015, 22:16
Очки репутации: -6

Re: Проблема с запросами в базу mysql CDbException

Сообщение Dmitry » 13 мар 2022, 18:31

может стоит сравнить изменения до и после применения "Спец.предл" в БД для какого-либо объекта и потом провести аналогичные изменения (скриптом или запросами) для всех остальных объявлений?
Dmitry
Гражданин
Гражданин
 
Сообщения: 134
Зарегистрирован: 29 мар 2020, 17:04
Откуда: Крым
Очки репутации: 22

Re: Проблема с запросами в базу mysql CDbException

Сообщение illuzii » 14 мар 2022, 22:32

Пустующие ячейки существующих объявлений можно заполнить NULL напрямую в mysql - не вопрос, но остаются ошибки при добавлении нового объявления, новости, опроса - жмешь кнопку Добавить - сразу вываливаются ошибки :-/
illuzii
Прохожий
 
Сообщения: 44
Зарегистрирован: 12 окт 2015, 22:16
Очки репутации: -6

Re: Проблема с запросами в базу mysql CDbException

Сообщение illuzii » 14 мар 2022, 23:21

Еще выявил один глюк при редактировании старого объявления - при добавлении новых фото.
Они загружаются (вижу по ftp в /uploads/objects/XXX/yyy.jpg , где XXX - id объекта, yyy - имя файла), но в поле редактора напротив каждого названия файла получаю - Ошибка.
Разумеется при сохранении вижу, что "Фото галерея пуста".
illuzii
Прохожий
 
Сообщения: 44
Зарегистрирован: 12 окт 2015, 22:16
Очки репутации: -6

Re: Проблема с запросами в базу mysql CDbException

Сообщение Dmitry » 14 мар 2022, 23:33

может не поддерживается эта версия мускла в используемой версии ORE? Вы обновлялись или у Вас версия 2015 года? С тех пор менялись версии YII и, как следствие, поддерживаемые версии PHP, ну и вероятно MySQL-я. Например, PHP 7.4 поддерживается только с прошлого года, а 8.0 вообще меньше полугода начало поддерживаться - история изменений ORE - тут.
Всегда при смене параметров хостинга возникает вопрос совместимости с ним разных CMS-движков. Иногда вообще приходится отказываться от обновления CMS или повышения версии того же PHP из-за невозможности работы на нем разных движков используемых на сайте (форумы, фотогалереи и т.п.)
Dmitry
Гражданин
Гражданин
 
Сообщения: 134
Зарегистрирован: 29 мар 2020, 17:04
Откуда: Крым
Очки репутации: 22

Re: Проблема с запросами в базу mysql CDbException

Сообщение illuzii » 15 мар 2022, 12:24

Спасибо Olga Monoray Support - написала решение проблемы:
в файле protected\config\db.php

до строки:
'class' => 'CDbConnection',

вставить:
'initSQLs' => array("SET SESSION sql_mode='';")

Все заработало.
illuzii
Прохожий
 
Сообщения: 44
Зарегистрирован: 12 окт 2015, 22:16
Очки репутации: -6

Re: Проблема с запросами в базу mysql CDbException

Сообщение beLbli » 16 июл 2022, 09:08

Здравствуйте. Подскажите, пожалуйста, если можно, с сайтом http://primegang.ru/sudoku похожая проблема после переноса файлов хостинга - внешне с сайтом всё нормально, но при создании новых туров (записей) выдаёт ошибку :
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY000]: General error: 1364 Field 'score_team1_total' doesn't have a default value. The SQL statement executed was: INSERT INTO `sudoku_tours_teams` (`division`, `id_sudoku_team1`, `id_sudoku_team2`, `id_tour`) VALUES (:yp0, :yp1, :yp2, :yp3)

/framework/db/CDbCommand.php(358)

{
347 if($this->_connection->enableProfiling)
348 Yii::endProfile('system.db.CDbCommand.execute('.$this->getText().$par.')','system.db.CDbCommand.execute');
349
350 $errorInfo=$e instanceof PDOException ? $e->errorInfo : null;
351 $message=$e->getMessage();
352 Yii::log(Yii::t('yii','CDbCommand::execute() failed: {error}. The SQL statement executed was: {sql}.',
353 array('{error}'=>$message, '{sql}'=>$this->getText().$par)),CLogger::LEVEL_ERROR,'system.db.CDbCommand');
354
355 if(YII_DEBUG)
356 $message.='. The SQL statement executed was: '.$this->getText().$par;
357
358 throw new CDbException(Yii::t('yii','CDbCommand failed to execute the SQL statement: {error}',
359 array('{error}'=>$message)),(int)$e->getCode(),$errorInfo);

Файла protected\config\db.php у меня нет, как в предыдущем примере, может, сможет кто подсказать как быть?
beLbli
Незнакомец
 
Сообщения: 5
Зарегистрирован: 16 июл 2022, 08:36
Очки репутации: 0

Re: Проблема с запросами в базу mysql CDbException

Сообщение andipas » 18 июл 2022, 20:01

Здравствуйте. Подскажите, пожалуйста, если можно, с сайтом http://primegang.ru/sudoku похожая проблема


Добавьте такую функцию в файл protected/controllers/SiteController.php

Не забудьте сделать бэкап базы перед запуском!


Код: Выделить всё
public function actionConvertDefaultValue()
{
    
$sql "SELECT table_schema, table_name, column_name, data_type FROM information_schema.columns WHERE IS_NULLABLE = 'NO' AND column_default IS NULL AND column_key = '' ORDER BY table_name";

    foreach (
Yii::app()
        ->
db
        
->createCommand($sql)->queryAll() as $item)
    {
        if (
$item['data_type'] == 'text')
        {
            
$sql "ALTER TABLE `{$item['table_schema']}`.`{$item['table_name']}` MODIFY `{$item['column_name']}` TEXT NULL";
        }
        else
        {
            
$defaultValue '';

            if (
$item['data_type'] == 'date')
            {
                
$defaultValue '0000-00-00';
            }
            elseif (
$item['data_type'] == 'datetime')
            {
                
$defaultValue '0000-00-00 00:00:00';
            }
            elseif (
$item['data_type'] == 'enum')
            {
                
$defaultValue 'text';
            }
            elseif (
$item['data_type'] == 'float' || $item['data_type'] == 'int' || $item['data_type'] == 'smallint' || $item['data_type'] == 'tinyint')
            {
                
$defaultValue 0;
            }

            
$sql "ALTER TABLE `{$item['table_schema']}`.`{$item['table_name']}` ALTER COLUMN `{$item['column_name']}` SET DEFAULT '{$defaultValue}'";
        }

        
print_r($sql ';');

        try
        {
            
Yii::app()
                ->
db
                
->createCommand($sql)->execute();
        }
        catch(
Exception $e)
        {
            
print_r(' - ERROR: ' $e->getMessage());
        }

        
print_r("
"
);
    }

    echo 
"
Job done, sir."
;
    exit;
}

 


Запустить скрипт можно так: your-site.ru/site/convertDefaultValue
Часто задаваемые вопросы. Для правки файлов notepad++, netbeans, phpStorm. Для правки CSS firebug.
Аватара пользователя
andipas
Разработчик
Разработчик
 
Сообщения: 695
Зарегистрирован: 28 дек 2011, 22:37
Очки репутации: 30

Re: Проблема с запросами в базу mysql CDbException

Сообщение beLbli » 19 июл 2022, 15:03

К сожалению, не получилось, теперь выдало вот такую вещь при открытии главной страницы сайта. Сейчас вернул как было изначально. Надо ж было добавить в самый конец файла SiteController.php, я правильно понял?
Если есть возможность поработать с этим , посмотрите, пожалуйста, я заплачу


Код: Выделить всё
ParseError
syntax error
unexpected 'public' (T_PUBLIC), expecting end of file

/domains/primegang.ru/protected/controllers/SiteController.php(156)

144     
145     
/**
146      * Custom index functions
147      */
148     private function getIndexNews() {
149         
150     
}
151 
152     
public function actionTest() {
153         return $this->render('test');
154     }
155 }
156 public function actionConvertDefaultValue()
157 {
158     $sql "SELECT table_schema, table_name, column_name, data_type FROM information_schema.columns WHERE IS_NULLABLE = 'NO' AND column_default IS NULL AND column_key = '' ORDER BY table_name";
159 
160     
foreach (Yii::app()
161         ->db
162         
->createCommand($sql)->queryAll() as $item)
163     {
164         if ($item['data_type'] == 'text')
165         {
166             $sql "ALTER TABLE `{$item['table_schema']}`.`{$item['table_name']}` MODIFY `{$item['column_name']}` TEXT NULL";
167         }
168         else 


У меня первоначально в файле controllers/SiteController.php было вот так:

Код: Выделить всё
<?php

class SiteController extends Controller 
{
    function init() {
        parent::init();
        Yii::app()->theme = 'prime';
    }
    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
            'postOnly + delete', // we only allow deletion via POST request
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array(
            array('allow',  // allow all users to perform 'index' and 'view' actions
                'actions'=>array('error','login','logout','index','contact','test'),
                'users'=>array('*'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }

    /**
     * Declares class-based actions.
     */
    public function actions()
    {
        return array(
            // captcha action renders the CAPTCHA image displayed on the contact page
            'captcha'=>array(
                'class'=>'CCaptchaAction',
                'backColor'=>0xFFFFFF,
            ),
            // page action renders "static" pages stored under 'protected/views/site/pages'
            // They can be accessed via: index.php?r=site/page&view=FileName
            'page'=>array(
                'class'=>'CViewAction',
            ),
        );
    }

    public function actionIndex()
    {
        // renders the view file 'protected/views/site/index.php'
        // using the default layout 'protected/views/layouts/main.php'
        $newsProvider = new CActiveDataProvider("News",array(
            'criteria'=>array('order'=>'date DESC, id DESC'),
            'pagination'=>array('pageSize'=>5),
        ));
        
        $this
->render('index', array(
            'newsProvider'=>$newsProvider,
        ));
    }

    /**
     * This is the action to handle external exceptions.
     */
    public function actionError()
    {
        if($error=Yii::app()->errorHandler->error)
        {
            if(Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this
->render('error', $error);
        }
    }

    /**
     * Displays the contact page
     */
    public function actionContact()
    {
        $model=new ContactForm;
        if(isset($_POST['ContactForm']))
        {
            $model->attributes=$_POST['ContactForm'];
            if($model->validate())
            {
                $name='=?UTF-8?B?'.base64_encode($model->name).'?=';
                $subject='=?UTF-8?B?'.base64_encode($model->subject).'?=';
                $headers="From: $name <{$model->email}>\r\n".
                    "Reply-To: {$model->email}\r\n".
                    "MIME-Version: 1.0\r\n".
                    "Content-Type: text/plain; charset=UTF-8";

                mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers);
                Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
                $this->refresh();
            }
        }
        $this->render('contact',array('model'=>$model));
    }

    /**
     * Displays the login page
     */
    public function actionLogin()
    {
        $model=new LoginForm;

        // if it is ajax validation request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }

        // collect user input data
        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            // validate user input and redirect to the previous page if valid
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        // display the login form
        $this->render('login',array('model'=>$model));
    }

    /**
     * Logs out the current user and redirect to homepage.
     */
    public function actionLogout()
    {
        Yii::app()->user->logout();
        $this->redirect(Yii::app()->homeUrl);
    }
    
    
/**
     * Custom index functions
     */
    private function getIndexNews() {
        
    
}

    public function actionTest() {
        return $this->render('test');
    }
}
beLbli
Незнакомец
 
Сообщения: 5
Зарегистрирован: 16 июл 2022, 08:36
Очки репутации: 0

След.

Вернуться в Вопросы и помощь по изменениям

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7