Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


 Share

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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 |
Link to comment
Share on other sites

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 2
Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites


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

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

Link to comment
Share on other sites

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

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

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

 

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


 

Link to comment
Share on other sites

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

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

 

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

  • +1 1
Link to comment
Share on other sites


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

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

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

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

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

Link to comment
Share on other sites

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

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

 

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

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

  • +1 1
Link to comment
Share on other sites

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

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

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

 

Link to comment
Share on other sites

  • 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'");

Edited by antiuser
  • +1 3
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.