Mysql запрос всегда возвращает ноль

0

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 и консольных работ.
Я подозреваю, что некоторые настройки проблемы или, возможно, какая-то ошибка, но я не знаю, что может быть неправильно.

  • 0
    Что вы получаете, когда вы используете var_dump $ sql в последнем фрагменте кода?
  • 1
    Что такое db_query() и db_fetch_assoc() и db-fetch_row() они не являются ванильным PHP
Показать ещё 12 комментариев
Теги:

2 ответа

0
Лучший ответ

Вопрос может быть закрыт. Проблема была в другом месте - кто-то по ошибке оставил функцию, скрытую глубоко в коде, которая опорочила все суммы до того, как моя функция запросила их. Я не заметил, что из-за срыва транзакции где-то еще.

0

Похоже, что в вашем запросе отсутствуют одиночные кавычки:

$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() также полезна

  • 0
    Спасибо, но это не так. db_escape добавляет цитаты. Я также попробовал это с ванильным mysqli_query и mysqli_fetch_row - тот же результат.
  • 0
    Ах хорошо. Вы можете повторить или сделать var_dump из $ sql, чтобы увидеть, что запрашивается? Это тот же запрос, что вы пробовали в верстаке?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню