Got error 'POSIX collating elements are not supported at off

Известные ошибки проявляющиеся при работе с сайтом
-Got error 28 from storage engine
-MySQL server has gone away
-Данные не в формате JSON
Ответить
Аватара пользователя
Mark
Web-мастер
Сообщения: 4608
Зарегистрирован: 28 авг 2012, 16:09

Got error 'POSIX collating elements are not supported at off

Сообщение Mark » 02 фев 2016, 12:46

Got error 'POSIX collating elements are not supported at offset 1' from regexp

Данная ошибка встречается при попытке отфильтровать товар на странице каталога в публичной части сайта.

Суть ошибки заключается в невозможности использовать 'POSIX элементы в SQL запросе
например такие:

[[.vertical-line.]]
[[.plus-sign.]]
[[.asterisk.]]
[[.left-parenthesis.]]
[[.right-parenthesis.]]
[[.question-mark.]]


Для устранения ошибки, необходимо обратиться к администратору базы данных с просьбой включить опцию MySQL для работы с POSIX элементами в регулярных выражениях.

Внимание! Если на вашем хостинге нет возможности изменить настройки MySQL, можно изменить код в файле
mg-core\lib\filter.php
Найдите строку 568 строку

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

$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|"))  REGEXP LCASE("[[.vertical-line.]]'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?[[.vertical-line.]]")))) OR ';
Замените ее на

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

$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|"))  REGEXP LCASE("'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?")))) OR ';
Но имейте ввиду, если в значениях характеристик тоавар будут встречаться символы "|+*()?" ошибка появится снова.
Аватара пользователя
yurganov
lvl 1
Сообщения: 1
Зарегистрирован: 01 мар 2016, 22:28

Re: Got error 'POSIX collating elements are not supported at

Сообщение yurganov » 01 мар 2016, 22:30

Может пора отказаться от POSIX? И дело не в том, что где-то нельзя их включить, а в том, что есть, например MariaDB, на которой POSIX вообще не поддерживается, только PCRE.
Аватара пользователя
Creator
lvl 5
Сообщения: 57
Зарегистрирован: 15 фев 2016, 17:39

Re: Got error 'POSIX collating elements are not supported at

Сообщение Creator » 03 мар 2016, 02:10

фигня эти костыли! не работает на нашем сервере.. зачем нам платить за чужой дополнительно, если есть свои серваки, но эта часть не работает?
Аватара пользователя
dommi2
lvl 1
Сообщения: 3
Зарегистрирован: 29 авг 2015, 17:09

Re: Got error 'POSIX collating elements are not supported at

Сообщение dommi2 » 12 май 2016, 13:20

второй день мучаюсь с "Ошибка в SQL запросе:..... Got error 'POSIX collating elements are not supported at offset 1' from regexp"" Ошибка возникает при выборе к-л характеристики. При нажатии "Фильтровать" - белый экран
Решила проверить насколько совпадают технические характеристики веб-сервера хостера требованиям CMS
Джино: Информация о системе
Операционная система Linux 2.6.18-406.el5
Perl 5.8.8
PHP 5.5.16
MySQL 10.1.13-MariaDB

Moguta.CMS:
Хостинг с операционной системой – Unix;
Минимальный объем оперативной памяти 128мб; (чем больше товаров планируется, тем больше необходимо памяти)
Базы данных — MySQL 5+ с поддержкой системы хранения данных: MyISAM;
Веб-сервер — Apache 2.2.x. Рекомендуется связка Apache 2.2.x и nginx(фронтэнд);
Интерпретатор PHP 5.3+ с установленными модулями: session, json, curl, php_zip, gd_lib, xmlwriter, xmlreader;

Техподдержка пока никак не помогла. Да, хостинг Джино - рекомендованный хостинг для CMS Moguta
Что посоветуете предпринять еще?
Аватара пользователя
Yuricson
Web-мастер
Сообщения: 1052
Зарегистрирован: 12 фев 2014, 21:57
Откуда: Екатеринбург- Краснодар
Контактная информация:

Re: Got error 'POSIX collating elements are not supported at

Сообщение Yuricson » 16 май 2016, 08:08

MySQL 10.1.13-MariaDB
Причина в этом.
Аватара пользователя
dommi2
lvl 1
Сообщения: 3
Зарегистрирован: 29 авг 2015, 17:09

Re: Got error 'POSIX collating elements are not supported at

Сообщение dommi2 » 20 май 2016, 12:13

Причина в этом.
)) а делать-то что?
и ещё один вопрос (
После обновления системы до 6.6.2. опять возникла та же самая ошибка при фильтрации. Как в админке, так и на самом сайте. Я поправила файл filter.php как рекомендовано выше.
Но, собственно сам вопрос, неужели нет универсального решения этой проблемы? или после каждого обновления системы мне придется восстанавливать файл filter.php?
Аватара пользователя
Mark
Web-мастер
Сообщения: 4608
Зарегистрирован: 28 авг 2012, 16:09

Re: Got error 'POSIX collating elements are not supported at

Сообщение Mark » 20 май 2016, 16:14

dommi2 писал(а):
Причина в этом.
)) а делать-то что?
и ещё один вопрос (
После обновления системы до 6.6.2. опять возникла та же самая ошибка при фильтрации. Как в админке, так и на самом сайте. Я поправила файл filter.php как рекомендовано выше.
Но, собственно сам вопрос, неужели нет универсального решения этой проблемы? или после каждого обновления системы мне придется восстанавливать файл filter.php?
Универсальное решение есть - соблюсти системные требования движка.
MariaDB пока не поддерживается.
Используйте MySQL 5+
Смените хостинг например на регру, проблем не будет.
Аватара пользователя
dommi2
lvl 1
Сообщения: 3
Зарегистрирован: 29 авг 2015, 17:09

Re: Got error 'POSIX collating elements are not supported at

Сообщение dommi2 » 20 май 2016, 16:46

Mark писал(а): Универсальное решение есть - соблюсти системные требования движка.
Смените хостинг например на регру, проблем не будет.
Безусловно, сменить хостинг - самое простое решение... Но зачем тогда рекомендоватьна сайте хостинг, который не соответствует требованиям движка? я о хостинге Джино
Аватара пользователя
Mark
Web-мастер
Сообщения: 4608
Зарегистрирован: 28 авг 2012, 16:09

Re: Got error 'POSIX collating elements are not supported at

Сообщение Mark » 20 май 2016, 18:12

dommi2 писал(а):
Mark писал(а):Но зачем тогда рекомендоватьна сайте хостинг, который не соответствует требованиям движка? я о хостинге Джино
Действительно незачем. Ранее проблем с ним не возникало.
Аватара пользователя
mrfmrka
lvl 1
Сообщения: 4
Зарегистрирован: 17 мар 2017, 17:08

Re: Got error 'POSIX collating elements are not supported at

Сообщение mrfmrka » 17 мар 2017, 17:27

В файле mg-core\lib\filter.php меняем код:

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

        $value = str_replace('+', '[[.plus-sign.]]', $value);
        $value = str_replace('*', '[[.asterisk.]]', $value);
        $value = str_replace('(', '[[.left-parenthesis.]]', $value);
        $value = str_replace(')', '[[.right-parenthesis.]]', $value);
        $value = str_replace('?', '[[.question-mark.]]', $value);         
    
        $sql .= '(pup'.$id.'.product_id = p.id AND ';
        $sql .= '((pup'.$id.'.property_id = '.DB::quote($id).') AND ';
        
        //Проверяем, выводится ли тип характеристика слайдером. #ДОБАВЛЕНО
        if($property[0] == "slider"){
          $sql .= '(pup'.$id.'.value BETWEEN '.$property[1].' AND '.$property[2].' OR pup'.$id.'.value = \'\'))) OR ';
          continue;
        }
        
	$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|"))  REGEXP LCASE("[[.vertical-line.]]'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?[[.vertical-line.]]")))) OR ';
на такой:

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

        $value = str_replace('+', '\\+', $value);
        $value = str_replace('*', '\\*', $value);   
        $value = str_replace('(', '\\(', $value);   
        $value = str_replace(')', '\\)', $value); 
        $value = str_replace('?', '\\?', $value);         
    
        $sql .= '(pup'.$id.'.product_id = p.id AND ';
        $sql .= '((pup'.$id.'.property_id = '.DB::quote($id).') AND ';
        
        //Проверяем, выводится ли тип характеристика слайдером. #ДОБАВЛЕНО
        if($property[0] == "slider"){
          $sql .= '(pup'.$id.'.value BETWEEN '.$property[1].' AND '.$property[2].' OR pup'.$id.'.value = \'\'))) OR ';
          continue;
        }
        
	$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|"))  REGEXP LCASE("'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?")))) OR ';
К сожалению, после обновления код надо будет снова подправить.
Вот ответ от "Джино":
Здравствуйте.

Проверили, поддержка REGEXP включена во всех версиях.
Из их FAQ'а: http://wiki.moguta.ru/faq/oshibki/got-e ... g-elements
Суть ошибки заключается в невозможности использовать 'POSIX элементы в SQL запросе
например такие:
[[.vertical-line.]]
[[.plus-sign.]]
[[.asterisk.]]
[[.left-parenthesis.]]
[[.right-parenthesis.]]
[[.question-mark.]]
Это не "POSIX-элементы". Вот что говорится в обсуждении ошибки в багтрекере MariaDB:
The old Henry Spencer regex library supported a number of character names:
https://mariadb.com/kb/en/mariadb/docum ... cter-names
This was a non-standard, non-POSIX extension in the old library.
In POSIX regex the syntax '[[.xxx.]]' is reserved for collating elements.
For some reasons, Henry Spencer reused the same syntax for its character names extension.
PCRE does not support collating elements yet (but I guess it will in the future).
Currently PCRE only recognizes this syntax and just returns an error that you can see.
Далее авторы рекомендуют включить какую-то опцию в MySQL:
Для устранения ошибки, необходимо обратиться к администратору базы данных с просьбой включить опцию MySQL для работы с POSIX элементами в регулярных выражениях.
Что это за опция, нам к сожалению непонятно. На сколько мы можм судить, такой опции в MySQL нет.

И есть обходной путь:
Внимание! Если на вашем хостинге нет возможности изменить настройки MySQL, можно изменить код в файле
mg-core\lib\filter.php
Найдите строку
$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|")) REGEXP LCASE("[[.vertical-line.]]'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?[[.vertical-line.]]")))) OR ';
Замените ее на

$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|")) REGEXP LCASE("'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?")))) OR ';
Можно просто не заменить "[[.vertical-line.]]" на "|", "[[.plus-sign.]]" на "\\+" и т.д.
MariaDB [(none)]> SELECT '|' REGEXP '|';
+----------------+
| '|' REGEXP '|' |
+----------------+
| 1 |
+----------------+

MariaDB [(none)]> SELECT '+' REGEXP '\\+';
+------------------+
| '+' REGEXP '\\+' |
+------------------+
| 1 |
+------------------+

MariaDB [(none)]> SELECT '(' REGEXP '\\(';
+------------------+
| '(' REGEXP '\\(' |
+------------------+
| 1 |
+------------------+

MariaDB [(none)]> SELECT ')' REGEXP '\\)';
+------------------+
| ')' REGEXP '\\)' |
+------------------+
| 1 |
+------------------+

MariaDB [(none)]> SELECT '*' REGEXP '\\*';
+------------------+
| '*' REGEXP '\\*' |
+------------------+
| 1 |
+------------------+

MariaDB [(none)]> SELECT '?' REGEXP '\\?';
+------------------+
| '?' REGEXP '\\?' |
+------------------+
| 1 |
+------------------+
Код в файле /home/users/z/zarya-arhangelsk/domains/zarya29.ru/mg-core/lib/filter.php:
$value = str_replace('+', '[[.plus-sign.]]', $value);
$value = str_replace('*', '[[.asterisk.]]', $value);
$value = str_replace('(', '[[.left-parenthesis.]]', $value);
$value = str_replace(')', '[[.right-parenthesis.]]', $value);
$value = str_replace('?', '[[.question-mark.]]', $value);
$sql .= '(pup'.$id.'.product_id = p.id AND ';
$sql .= '((pup'.$id.'.property_id = '.DB::quote($id).') AND ';
//Проверяем, выводится ли тип характеристика слайдером. #ДОБАВЛЕНО
if($property[0] == "slider"){
$sql .= '(pup'.$id.'.value BETWEEN '.$property[1].' AND '.$property[2].' OR pup'.$id.'.value = \'\'))) OR ';
continue;
}
$sql .= '(LCASE(concat("|",pup'.$id.'.value,"|")) REGEXP LCASE("[[.vertical-line.]]'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?[[.vertical-line.]]")))) OR ';
Строки:
622 // $sql .= '(LCASE(concat("|",pup'.$id.'.value,"|")) REGEXP LCASE("[[.vertical-line.]]'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?[[.vertical-line.]]")))) OR ';
623 $sql .= '(LCASE(concat("|",pup'.$id.'.value,"|")) REGEXP LCASE("'.DB::quote(htmlspecialchars_decode($value),true).'(#.*#)?")))) OR '; // Ошибка в CMS
Проверьте, у нас не было жалоб на данный функционал от других клиентов не поступало, поэтому проблема вряд ли в несоответствии POSIX .
Ответить