Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Дефолтная база opencart конфликт с mysql сервером.


Rassol2

Recommended Posts

Название темы то какое. :)

Собственно у меня сомнения то ли это баг который скоро начнет лезть со всех углов то ли я туплю. Второе вполне реально и не исключается.

Суть проблемы.
Есть таблица oc_product  в котором есть поле
date_available тип поля date и значение по умолчанию 0000-00-00
И если в настройках базы данных на хостинге указаны  параметры sql_mode
 

Цитата

NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


То такую таблицу уже не получится модифицировать. Мы получаем ошибку

(1067): Invalid default value for 'date_available'

И как я понимаю параметры sql_mode в базе данных пользователь сам поменять не может, это делается глобально для всего сервера базы данных. И это тупик.
Если убрать значение по умолчанию то вылазиют другие ошибки по типу.
Incorrect date value: '0000-00-00' for column 'date_available' at row 1

 

Да и правильно ли убирать значение по умолчанию в поле которое было так задумано автором движка?

С этим я столкнулся уже на двух базах данных.
Версия MySQL: 5.7.29-0ubuntu0.18.04.1
Версия MySQL: 5.5.5-10.1.44-MariaDB-1~jessie

Решение пока такое переключить тип поля с date на varchar но я до конца не понимаю чем это может грозить.
Судя по тому как проставлено значение по умолчанию для этого поля то изменения типа ничего не должно сломать.

Что вы думаете по этому вопросу ?
Может кто то сталкивался и знает решения а я как дурачок не вижу его ?

Надіслати
Поділитися на інших сайтах

1 час назад, Rassol2 сказал:

Может кто то сталкивался и знает решения

С лету не скажу, но в скули есть функция проверки полей таблицы. То есть в модели нужно проверить наличие поля, а потом принять решение. Счас поищу в документации.

Надіслати
Поділитися на інших сайтах

SHOW [COLUMNS|FIELDS] FROM table [FROM database] [LIKE wild] 

SHOW FIELDS FROM oc_product LIKE data_aviable

Функция вернет запись типа

 Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| widget_id          | mediumint(8) |      | PRI | 0       | auto_increment |
Надіслати
Поділитися на інших сайтах

1 час назад, Rassol2 сказал:

Название темы то какое. :)

Собственно у меня сомнения то ли это баг который скоро начнет лезть со всех углов то ли я туплю. Второе вполне реально и не исключается.

Суть проблемы.
Есть таблица oc_product  в котором есть поле
date_available тип поля date и значение по умолчанию 0000-00-00
И если в настройках базы данных на хостинге указаны  параметры sql_mode
 


То такую таблицу уже не получится модифицировать. Мы получаем ошибку

(1067): Invalid default value for 'date_available'

И как я понимаю параметры sql_mode в базе данных пользователь сам поменять не может, это делается глобально для всего сервера базы данных. И это тупик.
Если убрать значение по умолчанию то вылазиют другие ошибки по типу.
Incorrect date value: '0000-00-00' for column 'date_available' at row 1

 

Да и правильно ли убирать значение по умолчанию в поле которое было так задумано автором движка?

С этим я столкнулся уже на двух базах данных.
Версия MySQL: 5.7.29-0ubuntu0.18.04.1
Версия MySQL: 5.5.5-10.1.44-MariaDB-1~jessie

Решение пока такое переключить тип поля с date на varchar но я до конца не понимаю чем это может грозить.
Судя по тому как проставлено значение по умолчанию для этого поля то изменения типа ничего не должно сломать.

Что вы думаете по этому вопросу ?
Может кто то сталкивался и знает решения а я как дурачок не вижу его ?

 

Не не - решение не верное,  ничего не надо переключать.
Здесь нет ничего военного mariadb в определенных репо по умолчанию поддерживает более строгий режим хранения данных, чем стоит на большинстве хостингов, просто сделайте в конфиге my.cnf в разделе [mysqld]  параметр:

sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

И перезагрузите mysql сервер.  В вашем случае mariadb;

 

sudo service mariadb restart;

 

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

  • +1 1
Надіслати
Поділитися на інших сайтах


6 часов назад, Rassol2 сказал:

Да и правильно ли убирать значение по умолчанию в поле которое было так задумано автором движка?

Не очень задумка, явно пережиток прошлого. "0000-00-00" это же типа дата не определена, для неопределенных значении принято заводить NULL, т.е. надо значение по умолчанию делать NULL.

Надіслати
Поділитися на інших сайтах


7 часов назад, Yoda сказал:

Не не - решение не верное,  ничего не надо переключать.
Здесь нет ничего военного mariadb в определенных репо по умолчанию поддерживает более строгий режим хранения данных, чем стоит на большинстве хостингов, просто сделайте в конфиге my.cnf в разделе [mysqld]  параметр:


sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

И перезагрузите mysql сервер.  В вашем случае mariadb;

 

sudo service mariadb restart;

 

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

Это понятно. Но вопрос как видно не только в mariadb и что самое страшно, что проблема не на VDS а на хостинге.
То есть у вас как у пользователя нету возможности поменять sql_mode.
Ну или скажите как поменять sql_mode простым юзером. У меня не получилось. Ну а my.cnf никто не даст вам править.

Надіслати
Поділитися на інших сайтах

2 часа назад, nikifalex сказал:

по-моему я убирал DEFAULT или менял на DEFAULT CURRENT_TIMESTAMP

особых проблем не было

Это попробую.

Надіслати
Поділитися на інших сайтах

3 часа назад, i3bepb сказал:

Не очень задумка, явно пережиток прошлого. "0000-00-00" это же типа дата не определена, для неопределенных значении принято заводить NULL, т.е. надо значение по умолчанию делать NULL.

так сделано по дефолту.

 

Как было сказано в одном видео и сети.
"На этом мои полномочия ВСЕ"


 

Надіслати
Поділитися на інших сайтах

8 часов назад, i3bepb сказал:

Не очень задумка, явно пережиток прошлого. "0000-00-00" это же типа дата не определена, для неопределенных значении принято заводить NULL, т.е. надо значение по умолчанию делать NULL.

 

Мы сейчас о чем говорим, о том как правильно неправильно, или как решить ситуацию ?
И это.. в концепции модели данных SQL дата не может быть NULL!

  • +1 1
Надіслати
Поділитися на інших сайтах


8 часов назад, nikifalex сказал:

по-моему я убирал DEFAULT или менял на DEFAULT CURRENT_TIMESTAMP

особых проблем не было

как вариант - тогда дата буде в гарантированно верном формате

Если поменяете тип, то возможно у вас будут проблемы с функциями датs или придется для этого поля конвертировать

Надіслати
Поділитися на інших сайтах

54 минуты назад, chukcha сказал:

$this->db->query("SET sql_mode = '')

 

это точно не работает проверял, такой же ответ в сети нашел. Значение sql_mode можно менять только с правами рута.
На шаред хостинге таких прав нету.

 

Надіслати
Поділитися на інших сайтах

Меня сейчас больше волнует вопрос не будет ли в будущем проблем.
Все модули которые хотят внести изменения в таблицу oc_product
Столкнутся с проблемой, такое изменение внести не получится. Из за этого ограничения. И все модули которым для работы требуют модификацию таблицы будут выпадать с ошибкой на хостингах с строгим режимом.

Надіслати
Поділитися на інших сайтах

44 минуты назад, chukcha сказал:

Как это нет?
system\library\db\mysqli.php
$this->connection->query("SET SQL_MODE = ''");

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

  • +1 1
Надіслати
Поділитися на інших сайтах

2 минуты назад, chukcha сказал:

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

Да хорошо, спасибо это я понял проверю.

 

Надіслати
Поділитися на інших сайтах

  • 7 months later...
  • 3 months later...
В 27.04.2020 в 01:40, Rassol2 сказал:

Название темы то какое. :)

 

Тоже столкнулся с аналогичной проблемой при установке Opencart 3 может кому пригодится

system/library/db/mysqli.php

меняем это

$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION'");

на это

$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION'");

Змінено користувачем antiuser
  • +1 4
Надіслати
Поділитися на інших сайтах


  • 1 year later...
18.03.2021 в 03:39, antiuser сказал:

 

Тоже столкнулся с аналогичной проблемой при установке Opencart 3 может кому пригодится

system/library/db/mysqli.php

меняем это

$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION'");

на это

$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION'");

Благодарю! Рабочая схема! Рекомендую!

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.