PHP 7.0
Версия сервера: 10.0.34-MariaDB-0ubuntu0.16.04.1
Это, наверное, самая странная проблема, с которой я когда-либо сталкивался.
Моя цель состоит в том, чтобы суммировать значения из таблицы, если выполняются некоторые условия (specific type, type_no and positive value
). Сумма столбца типа double.
Это запрос:
SELECT SUM(amount) FROM gl_trans WHERE type='0' AND type_no='1' AND amount>0;
И это таблица gl_trans - она представляет собой амортизацию основных средств:
# counter, type, type_no, tran_date, event_date, doc_date, account, memo_, amount, dimension_id, dimension2_id, person_type_id, person_id
'1', '0', '1', '2018-02-28', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'2', '0', '1', '2018-02-28', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'3', '0', '1', '2018-03-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'4', '0', '1', '2018-03-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'5', '0', '1', '2018-04-30', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'6', '0', '1', '2018-04-30', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'7', '0', '1', '2018-05-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'8', '0', '1', '2018-05-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'9', '0', '1', '2018-06-30', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'10', '0', '1', '2018-06-30', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'11', '0', '1', '2018-07-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'12', '0', '1', '2018-07-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'13', '0', '1', '2018-08-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'14', '0', '1', '2018-08-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'15', '0', '1', '2018-09-30', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'16', '0', '1', '2018-09-30', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'17', '0', '1', '2018-10-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'18', '0', '1', '2018-10-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'19', '0', '1', '2018-11-30', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'20', '0', '1', '2018-11-30', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
'21', '0', '1', '2018-12-31', '0000-00-00', '0000-00-00', '071-1-1', '', '-2', '0', '0', '6', '0001'
'22', '0', '1', '2018-12-31', '0000-00-00', '0000-00-00', '401-1', '', '2', '0', '0', '6', '0001'
Итак, я сделал: (db_query и db_fetch_row являются пользовательскими функциями - они на 100% хорошо)
$sql = "SELECT SUM(amount) FROM gl_trans WHERE type=".db_escape($type)." AND type_no=".db_escape($type_no)." AND amount>0";
$result = db_query($sql, "query for gl trans total");
$row = db_fetch_row($result);
return $row[0];
Результат был нулевым. Во время отладки я обнаружил, что запрос для столбца суммы... возвращает 0:
$sql = "SELECT amount FROM gl_trans WHERE type=".db_escape($type)." AND type_no=".db_escape($type_no);
$result = db_query($sql, "blah blah blah");
while ($test = db_fetch_assoc($result)) {
var_dump($test); // [amount] => 0 !!!
}
Я вставил один и тот же точный запрос:
SELECT SUM(amount) FROM gl_trans WHERE type='0' AND type_no='1' AND amount>0
... в Workbench, и это дало мне правильный результат (22)!
Я попытался выполнить подобные запросы в разных таблицах (просто переключив таблицу и столбец), и они были в порядке.
Я также попытался подвести другое поле в этой таблице (person_type_id), и запрос также был успешным.
Наконец, мы наклеили код на мой коллекторский ноутбук (та же база данных, одна и та же система - Ubuntu, тот же код), и он сработал.
Как-то на моем компьютере, с моими настройками, только один столбец во всей базе данных всегда равен 0 и только если я запрошу его из кода.
Код в порядке - он работает с другими таблицами и столбцами
Db в порядке - запросы из Workbench и консольных работ.
Я подозреваю, что некоторые настройки проблемы или, возможно, какая-то ошибка, но я не знаю, что может быть неправильно.
Вопрос может быть закрыт. Проблема была в другом месте - кто-то по ошибке оставил функцию, скрытую глубоко в коде, которая опорочила все суммы до того, как моя функция запросила их. Я не заметил, что из-за срыва транзакции где-то еще.
Похоже, что в вашем запросе отсутствуют одиночные кавычки:
$sql = "SELECT SUM(amount) FROM gl_trans WHERE type='".db_escape($type)."' AND type_no='".db_escape($type_no)."' AND amount>0";
Ваш код не защищен от SQL Injection. Вы должны использовать PDO или подготовленные инструкции вместо пользовательских функций, которые у вас есть. Подробнее об этом читайте здесь.
Проверка вашего $sql
с помощью $var_dump()
также полезна
db_query()
иdb_fetch_assoc()
иdb-fetch_row()
они не являются ванильным PHP