Решено Got error 'POSIX collating elements are not supported at off

mrfmrka

Пользователь
Регист
3 Мар 2017
Сообщения
13
Симпатии
10
#1
В файле 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-error-posix-collating-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/d...regular-expressions-overview/#character-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 .
К сожалению, после обновления код надо будет снова подправить.
 
Сверху Снизу