mysql查询始终返回零

时间:2018-06-28 13:35:26

标签: php mysql

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

...进入工作台,它给了我正确的结果(22)!

我试图在不同的表上执行类似的查询(只是切换表和列),并且没问题。
我还尝试总结该表中的另一个字段(person_type_id),并且查询也成功。
最后,我们将代码粘贴到同事的笔记本电脑上(相同的数据库,相同的系统-Ubuntu,相同的代码),并且可以正常工作。

以某种方式在计算机上进行设置后,整个数据库中的这一列始终为0,并且仅当我从代码中查询它时才如此。
代码还可以-它可以在其他表和列上使用
db可以-来自Workbench和控制台的查询。
我怀疑某些设置问题或可能存在某种错误,但我不知道可能是什么问题。

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注入。您应该使用PDO或预处理语句,而不要使用自定义函数。进一步了解here

$sql检查$var_dump()也很有帮助

答案 1 :(得分:0)

问题可以关闭。问题出在别处-有人错误地将一个函数隐藏在代码的深处,在我的函数向他们查询之前,这些函数使所有金额无效。我没有注意到由于其他地方的事务失败。