mrfmrka
Пользователь
- Регист
- 3 Мар 2017
- Сообщения
- 13
- Реакции
- 11
В файле 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 .
Проверили, поддержка 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 .