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

Дефолтная база 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

Expand  


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

(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 но я до конца не понимаю чем это может грозить.
Судя по тому как проставлено значение по умолчанию для этого поля то изменения типа ничего не должно сломать.

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

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

  В 26.04.2020 в 22:40, Rassol2 сказав:

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

Expand  

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

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

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 |
Надіслати
Поділитися на інших сайтах

  В 26.04.2020 в 22:40, 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 но я до конца не понимаю чем это может грозить.
Судя по тому как проставлено значение по умолчанию для этого поля то изменения типа ничего не должно сломать.

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

Expand  

 

Не не - решение не верное,  ничего не надо переключать.
Здесь нет ничего военного 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
Надіслати
Поділитися на інших сайтах


  В 26.04.2020 в 22:40, Rassol2 сказав:

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

Expand  

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

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


  В 27.04.2020 в 00:23, 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;

 

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

Expand  

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

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

  В 27.04.2020 в 06:24, nikifalex сказав:

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

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

Expand  

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

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

  В 27.04.2020 в 05:40, i3bepb сказав:

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

Expand  

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

 

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


 

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

  В 27.04.2020 в 05:40, i3bepb сказав:

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

Expand  

 

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

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


  В 27.04.2020 в 06:24, nikifalex сказав:

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

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

Expand  

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

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

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

  В 27.04.2020 в 14:06, chukcha сказав:

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

 

Expand  

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

 

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

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

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

  В 27.04.2020 в 15:04, chukcha сказав:

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

Expand  

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

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

  В 27.04.2020 в 15:50, chukcha сказав:

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

Expand  

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

 

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

  • 7 months later...
  • 3 months later...
  В 26.04.2020 в 22:40, Rassol2 сказав:

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

Expand  

 

Тоже столкнулся с аналогичной проблемой при установке 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...
  В 17.03.2021 в 21: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'");

Expand  

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

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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