исправление в запросах v.2.09RC1 - исправлена сортировка по числовым полям, а так же условия (больше меньше и т.п.) при работе с числовыми полями

This commit is contained in:
2026-02-21 02:48:10 +05:00
parent 7e3a43a96c
commit 9157bc2810
4 changed files with 120 additions and 70 deletions

View File

@@ -47,7 +47,7 @@
<tbody>
<tr>
<td>
<select name="field_new" id="field_new" style="width:300px; max-height:80px;">
<select name="field_new" id="field_new" style="width:100px; max-height:80px;">
<option>&nbsp;</option>
{foreach from=$fields_list item=field_group}

View File

@@ -134,21 +134,21 @@ function request_get_settings ($id)
{
global $AVE_DB;
// Получаем информацию о запросе
// Модифицированный запрос: джойним настройки поля, выбранного для сортировки
$sql = "
SELECT
#REQUEST SETTINGS = " . $id . "
*
r.*,
f.rubric_field_numeric AS order_field_is_numeric
FROM
" . PREFIX . "_request
" . PREFIX . "_request AS r
LEFT JOIN
" . PREFIX . "_rubric_fields AS f ON f.Id = r.request_order_by_nat
WHERE
" . (is_numeric($id) ? 'Id' : 'request_alias') . " = '" . $id . "'
" . (is_numeric($id) ? 'r.Id' : 'r.request_alias') . " = '" . $id . "'
";
// Выполняем запрос с учетом кеширования
$reqest_settings = $AVE_DB->Query($sql, -1, 'rqs_' . $id, true, '.settings')->FetchRow();
// Выходим, если нет запроса
if (! is_object($reqest_settings))
return '';
else
@@ -194,20 +194,22 @@ function request_get_condition_sql_string($id)
}
}
// Теперь мы можем безопасно запросить условия, используя гарантированный ID.
// Теперь мы тянем не только условия, но и тип поля из таблицы определений
$sql_ak = $AVE_DB->Query(
"
SELECT
condition_field_id,
condition_value,
condition_compare,
condition_join
FROM " . PREFIX . "_request_conditions
c.condition_field_id,
c.condition_value,
c.condition_compare,
c.condition_join,
f.rubric_field_numeric -- Добавляем информацию о типе поля
FROM " . PREFIX . "_request_conditions AS c
LEFT JOIN " . PREFIX . "_rubric_fields AS f ON f.Id = c.condition_field_id
WHERE
request_id = '" . $request_settings->Id . "'
AND condition_status = '1'
c.request_id = '" . $request_settings->Id . "'
AND c.condition_status = '1'
ORDER BY
condition_position ASC;
c.condition_position ASC;
",
-1,
'rqc_' . $request_settings->Id,
@@ -229,7 +231,7 @@ function request_get_condition_sql_string($id)
}
}
while ($row_ak = $sql_ak->FetchRow())
while ($row_ak = $sql_ak->FetchRow())
{
$fid = $row_ak->condition_field_id;
@@ -238,19 +240,40 @@ function request_get_condition_sql_string($id)
if ($i) $from[] = "JOIN " . PREFIX . "_document_fields AS t$i ON t$i.document_id = t0.document_id";
$val = $row_ak->condition_value;
// Проверяем флаг числа
$is_num = ($row_ak->rubric_field_numeric == 1);
// Формируем имя колонки
$col = $is_num ? "t$i.field_number_value" : "t$i.field_value";
// ПОДГОТОВКА ЗНАЧЕНИЯ:
// Если число — строго (float) без кавычек. Если строка — экранируем и в кавычки.
if ($is_num) {
$val_sql = (float)str_replace(',', '.', $val); // Заменяем запятую на точку на всякий случай
} else {
$val_sql = "'" . $AVE_DB->Escape($val) . "'";
}
$val_esc = $AVE_DB->Escape($val);
switch ($row_ak->condition_compare)
// Убираем лишние пробелы из условия для корректного срабатывания switch
$compare = trim($row_ak->condition_compare);
switch ($compare)
{
case ' <': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value < '" . $AVE_DB->Escape($val) . "'"; break;
case ' >': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value > '" . $AVE_DB->Escape($val) . "'"; break;
case '<=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value <= '" . $AVE_DB->Escape($val) . "'"; break;
case '>=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value >= '" . $AVE_DB->Escape($val) . "'"; break;
case '==': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value = '" . $AVE_DB->Escape($val) . "'"; break;
case '!=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value != '" . $AVE_DB->Escape($val) . "'"; break;
case '%%': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value LIKE '%" . $AVE_DB->Escape($val) . "%'"; break;
case '%': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value LIKE '" . $AVE_DB->Escape($val) . "%'"; break;
case '--': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value NOT LIKE '%" . $AVE_DB->Escape($val) . "%'"; break;
case '!-': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value NOT LIKE '" . $AVE_DB->Escape($val) . "%'"; break;
case '<': $where[] = "t$i.rubric_field_id = $fid AND $col < $val_sql"; break;
case '>': $where[] = "t$i.rubric_field_id = $fid AND $col > $val_sql"; break;
case '<=': $where[] = "t$i.rubric_field_id = $fid AND $col <= $val_sql"; break;
case '>=': $where[] = "t$i.rubric_field_id = $fid AND $col >= $val_sql"; break;
case '==': $where[] = "t$i.rubric_field_id = $fid AND $col = $val_sql"; break;
case '!=': $where[] = "t$i.rubric_field_id = $fid AND $col != $val_sql"; break;
// LIKE всегда по текстовому полю
case '%%': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value LIKE '%$val_esc%'"; break;
case '%': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value LIKE '$val_esc%'"; break;
case '--': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value NOT LIKE '%$val_esc%'"; break;
case '!-': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value NOT LIKE '$val_esc%'"; break;
}
if ($i || $row_ak->condition_join == 'AND') ++$i;
@@ -681,12 +704,14 @@ function request_parse($id)
? "GROUP BY a.Id"
: "";
if ($request_order_by_nat != 0) {
$join_fields = "LEFT JOIN " . PREFIX . "_document_fields AS d ON a.Id = d.document_id";
$where_fields = "AND d.rubric_field_id = " . intval($request_order_by_nat);
$select_fields = ", d.field_value, d.rubric_field_id";
$order_by = "ORDER BY d.field_value " . ($request_asc_desc === 'DESC' ? 'DESC' : 'ASC');
} else {
if ($request_order_by_nat != 0) {
$sort_col = ($request->order_field_is_numeric == 1) ? 'd.field_number_value' : 'd.field_value';
$join_fields = "LEFT JOIN " . PREFIX . "_document_fields AS d ON a.Id = d.document_id";
$where_fields = "AND d.rubric_field_id = " . intval($request_order_by_nat);
$select_fields = ", " . $sort_col . " AS sort_val";
$order_by = "ORDER BY sort_val " . ($request_asc_desc === 'DESC' ? 'DESC' : 'ASC');
} else {
$join_fields = "";
$where_fields = "";
$select_fields = "";

View File

@@ -47,7 +47,7 @@
<tbody>
<tr>
<td>
<select name="field_new" id="field_new" style="width:300px; max-height:80px;">
<select name="field_new" id="field_new" style="width:100px; max-height:80px;">
<option>&nbsp;</option>
{foreach from=$fields_list item=field_group}

View File

@@ -134,21 +134,21 @@ function request_get_settings ($id)
{
global $AVE_DB;
// Получаем информацию о запросе
// Модифицированный запрос: джойним настройки поля, выбранного для сортировки
$sql = "
SELECT
#REQUEST SETTINGS = " . $id . "
*
r.*,
f.rubric_field_numeric AS order_field_is_numeric
FROM
" . PREFIX . "_request
" . PREFIX . "_request AS r
LEFT JOIN
" . PREFIX . "_rubric_fields AS f ON f.Id = r.request_order_by_nat
WHERE
" . (is_numeric($id) ? 'Id' : 'request_alias') . " = '" . $id . "'
" . (is_numeric($id) ? 'r.Id' : 'r.request_alias') . " = '" . $id . "'
";
// Выполняем запрос с учетом кеширования
$reqest_settings = $AVE_DB->Query($sql, -1, 'rqs_' . $id, true, '.settings')->FetchRow();
// Выходим, если нет запроса
if (! is_object($reqest_settings))
return '';
else
@@ -194,20 +194,22 @@ function request_get_condition_sql_string($id)
}
}
// Теперь мы можем безопасно запросить условия, используя гарантированный ID.
// Теперь мы тянем не только условия, но и тип поля из таблицы определений
$sql_ak = $AVE_DB->Query(
"
SELECT
condition_field_id,
condition_value,
condition_compare,
condition_join
FROM " . PREFIX . "_request_conditions
c.condition_field_id,
c.condition_value,
c.condition_compare,
c.condition_join,
f.rubric_field_numeric -- Добавляем информацию о типе поля
FROM " . PREFIX . "_request_conditions AS c
LEFT JOIN " . PREFIX . "_rubric_fields AS f ON f.Id = c.condition_field_id
WHERE
request_id = '" . $request_settings->Id . "'
AND condition_status = '1'
c.request_id = '" . $request_settings->Id . "'
AND c.condition_status = '1'
ORDER BY
condition_position ASC;
c.condition_position ASC;
",
-1,
'rqc_' . $request_settings->Id,
@@ -229,7 +231,7 @@ function request_get_condition_sql_string($id)
}
}
while ($row_ak = $sql_ak->FetchRow())
while ($row_ak = $sql_ak->FetchRow())
{
$fid = $row_ak->condition_field_id;
@@ -238,19 +240,40 @@ function request_get_condition_sql_string($id)
if ($i) $from[] = "JOIN " . PREFIX . "_document_fields AS t$i ON t$i.document_id = t0.document_id";
$val = $row_ak->condition_value;
// Проверяем флаг числа
$is_num = ($row_ak->rubric_field_numeric == 1);
// Формируем имя колонки
$col = $is_num ? "t$i.field_number_value" : "t$i.field_value";
// ПОДГОТОВКА ЗНАЧЕНИЯ:
// Если число — строго (float) без кавычек. Если строка — экранируем и в кавычки.
if ($is_num) {
$val_sql = (float)str_replace(',', '.', $val); // Заменяем запятую на точку на всякий случай
} else {
$val_sql = "'" . $AVE_DB->Escape($val) . "'";
}
$val_esc = $AVE_DB->Escape($val);
switch ($row_ak->condition_compare)
// Убираем лишние пробелы из условия для корректного срабатывания switch
$compare = trim($row_ak->condition_compare);
switch ($compare)
{
case ' <': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value < '" . $AVE_DB->Escape($val) . "'"; break;
case ' >': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value > '" . $AVE_DB->Escape($val) . "'"; break;
case '<=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value <= '" . $AVE_DB->Escape($val) . "'"; break;
case '>=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value >= '" . $AVE_DB->Escape($val) . "'"; break;
case '==': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value = '" . $AVE_DB->Escape($val) . "'"; break;
case '!=': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value != '" . $AVE_DB->Escape($val) . "'"; break;
case '%%': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value LIKE '%" . $AVE_DB->Escape($val) . "%'"; break;
case '%': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value LIKE '" . $AVE_DB->Escape($val) . "%'"; break;
case '--': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value NOT LIKE '%" . $AVE_DB->Escape($val) . "%'"; break;
case '!-': $where[] = "t$i.rubric_field_id = " . $fid . " AND t$i.field_value NOT LIKE '" . $AVE_DB->Escape($val) . "%'"; break;
case '<': $where[] = "t$i.rubric_field_id = $fid AND $col < $val_sql"; break;
case '>': $where[] = "t$i.rubric_field_id = $fid AND $col > $val_sql"; break;
case '<=': $where[] = "t$i.rubric_field_id = $fid AND $col <= $val_sql"; break;
case '>=': $where[] = "t$i.rubric_field_id = $fid AND $col >= $val_sql"; break;
case '==': $where[] = "t$i.rubric_field_id = $fid AND $col = $val_sql"; break;
case '!=': $where[] = "t$i.rubric_field_id = $fid AND $col != $val_sql"; break;
// LIKE всегда по текстовому полю
case '%%': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value LIKE '%$val_esc%'"; break;
case '%': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value LIKE '$val_esc%'"; break;
case '--': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value NOT LIKE '%$val_esc%'"; break;
case '!-': $where[] = "t$i.rubric_field_id = $fid AND t$i.field_value NOT LIKE '$val_esc%'"; break;
}
if ($i || $row_ak->condition_join == 'AND') ++$i;
@@ -681,12 +704,14 @@ function request_parse($id)
? "GROUP BY a.Id"
: "";
if ($request_order_by_nat != 0) {
$join_fields = "LEFT JOIN " . PREFIX . "_document_fields AS d ON a.Id = d.document_id";
$where_fields = "AND d.rubric_field_id = " . intval($request_order_by_nat);
$select_fields = ", d.field_value, d.rubric_field_id";
$order_by = "ORDER BY d.field_value " . ($request_asc_desc === 'DESC' ? 'DESC' : 'ASC');
} else {
if ($request_order_by_nat != 0) {
$sort_col = ($request->order_field_is_numeric == 1) ? 'd.field_number_value' : 'd.field_value';
$join_fields = "LEFT JOIN " . PREFIX . "_document_fields AS d ON a.Id = d.document_id";
$where_fields = "AND d.rubric_field_id = " . intval($request_order_by_nat);
$select_fields = ", " . $sort_col . " AS sort_val";
$order_by = "ORDER BY sort_val " . ($request_asc_desc === 'DESC' ? 'DESC' : 'ASC');
} else {
$join_fields = "";
$where_fields = "";
$select_fields = "";