Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

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


Rassol2
 Погделиться

Рекомендованные сообещёния

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

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

Суть проблемы.
Есть иблица 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 часов назад, ****** сказал:

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


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

параметры sql_mode

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

 

Ссылка на комменирий
Погделиться на других сайих

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

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

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

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

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

Ссылка на комменирий
Погделиться на других сайих

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

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

 

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

 

Ссылка на комменирий
Погделиться на других сайих

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

  • +1 1
Ссылка на комменирий
Погделиться на других сайих

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

Ссылка на комменирий
Погделиться на других сайих

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

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

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

  • +1 1
Ссылка на комменирий
Погделиться на других сайих

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

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

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

 

Ссылка на комменирий
Погделиться на других сайих

  • 7 месяэтов спустя...
  • 3 месяца спустя...
В 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 год спустя...
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'");

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

Ссылка на комменирий
Погделиться на других сайих


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы осивить комменирий

Создать аккаунт

Зарегистрируйтесь для получения аккауни. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите згдесь.

Войти сейчас
 Погделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обрилитка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфигденциальности.