首頁 >後端開發 >php教程 >同一条sql,php程序执行的结果和数据库执行的结果不一样,求解

同一条sql,php程序执行的结果和数据库执行的结果不一样,求解

WBOY
WBOY原創
2016-06-23 13:59:061578瀏覽

输出sql和结果集的代码如下

$sql=$sql1.$sql_initbest;echo $sql;//initRows4($start_date,$end_date,$objActSheet);//$months=getIntMonth($start_date,$end_date1);//$count_1=3*$months+3;//每个月有3列//echo $sql1.$sql_initbest;$query = mssql_query($sql);//$c=0;//$arr=Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//$count_4=0;//月份计数器//$n=4;//$arr1=array();while($row=mssql_fetch_array($query)){	print_r($row);	echo "<br><br>";

输出结果 注意红框中的数据

把sql复制到数据库中执行结果如下

我确定是同一条sql,请问为什么会这样?


回复讨论(解决方案)

数据是在时时更新的吗?

1)贴出sql,拿到mysql编辑器执行看看。
2)在程序处输出sql,并且打印结果集看看。

1)贴出sql,拿到mysql编辑器执行看看。
2)在程序处输出sql,并且打印结果集看看。
都在帖子上有,用的是ms-sql数据库

select class2,January2014_Number_stores,January2014_Quantity_sold, January2014_qn=January2014_Quantity_sold/January2014_Number_stores,February2014_Number_stores,February2014_Quantity_sold, February2014_qn=February2014_Quantity_sold/February2014_Number_stores,March2014_Number_stores,March2014_Quantity_sold, March2014_qn=March2014_Quantity_sold/March2014_Number_stores from (select db_bi.class2,January2014_Number_stores = count(distinct case when left(db_bi.qsq,6) <='201401' then db_bi.dbno_bi else null end),January2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201401'then CMD..cmd_xjjx_sale.nb else 0 end),February2014_Number_stores = count(distinct case when left(db_bi.qsq,6) <='201402' then db_bi.dbno_bi else null end),February2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201402'then CMD..cmd_xjjx_sale.nb else 0 end),March2014_Number_stores = count(distinct case when left(db_bi.qsq,6) <='201403' then db_bi.dbno_bi else null end),March2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201403'then CMD..cmd_xjjx_sale.nb else 0 end),April2014_Number_stores = count(distinct case when left(db_bi.qsq,6) <='201404' then db_bi.dbno_bi else null end),April2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201404'then CMD..cmd_xjjx_sale.nb else 0 end) from db_bi ,CMD..cmd_xjjx_sale ,BI_Product_Information where db_bi.dbno = CMD..cmd_xjjx_sale.store and BI_Product_Information.colthno = CMD..cmd_xjjx_sale.colthno and CMD..cmd_xjjx_sale.outdate>='2014-01' and CMD..cmd_xjjx_sale.outdate<='2014-04' and charindex( '已撤',db_bi.names) = 0 and db_bi.class2 in ('A','B','C','O') and closeif <> 1 and flags_bi in('1','2','3','4')	 and CMD..cmd_xjjx_sale.endprice <> 0 group by db_bi.class2 ) a  order by class2

class2 为 B、C 时的相应值都不一样
你能确定表数据没有变化吗?

数据是在时时更新的吗?
数据不是实时更新的

class2 为 B、C 时的相应值都不一样
你能确定表数据没有变化吗?
class2为B、C时值不一样;能确定表数据没变化

这下悲剧鸟....有好几个都是同样的sql用程序和直接在数据库编译器中执行的结果不一样( 确定是同样的sql,确定数据库不是实时更新的)
测试如下 代码:

<?phpinclude_once 'DB_connmssql.php';$sql="select class2 ,January2014_Number_stores,January2014_Quantity_sold,					January2014_qn=January2014_Quantity_sold/January2014_Number_stores,February2014_Number_stores,February2014_Quantity_sold,					February2014_qn=February2014_Quantity_sold/February2014_Number_stores,March2014_Number_stores,March2014_Quantity_sold,					March2014_qn=March2014_Quantity_sold/March2014_Number_stores from (select  db_bi.class2,January2014_Number_stores = count(distinct case  when left(db_bi.qsq,6)  <='201401' then db_bi.dbno_bi else null end),January2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201401'then CMD..cmd_xjjx_sale.nb else 0 end),February2014_Number_stores = count(distinct case  when left(db_bi.qsq,6)  <='201402' then db_bi.dbno_bi else null end),February2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201402'then CMD..cmd_xjjx_sale.nb else 0 end),March2014_Number_stores = count(distinct case  when left(db_bi.qsq,6)  <='201403' then db_bi.dbno_bi else null end),March2014_Quantity_sold = SUM(case left(CMD..cmd_xjjx_sale.outdate,6) when '201403'then CMD..cmd_xjjx_sale.nb else 0 end)from db_bi,CMD..cmd_xjjx_sale,BI_Product_Informationwhere db_bi.dbno = CMD..cmd_xjjx_sale.storeand BI_Product_Information.colthno = CMD..cmd_xjjx_sale.colthnoand CMD..cmd_xjjx_sale.outdate>='2014-01'and CMD..cmd_xjjx_sale.outdate<='2014-04'and charindex( '已撤',db_bi.names) = 0   and db_bi.class2  in ('A','B','C','O')  and closeif <> 1    and flags_bi in('1','2','3','4')	and CMD..cmd_xjjx_sale.endprice <> 0group by db_bi.class2) aorder by class2";$query = mssql_query($sql);while($row=mssql_fetch_array($query)){	print_r($row);	echo "<br><br>";}?>

结果

那你检查一下是否为同一的数据库
不要 php 查询的是在用的库(数值大些),而控制台查询的是备份的库

那你检查一下是否为同一的数据库
不要 php 查询的是在用的库(数值大些),而控制台查询的是备份的库
确定是同一个数据库,而且发现了几个类似的问题,同样的sql用程序执行和直接在控制台执行的结果不一样。

那你检查一下是否为同一的数据库
不要 php 查询的是在用的库(数值大些),而控制台查询的是备份的库
找到原因了,经过对比发现sql中这一句

and charindex( '已撤',db_bi.names) = 0  

这一个条件在php程序查询数据库时没起作用,换成 not like也不行,该怎么解决呢?

解决了把‘已撤’改为
". iconv('utf-8', 'gbk', '已撤')."

我看你里面有时间条件,是条件不一样吧

那你检查一下是否为同一的数据库
不要 php 查询的是在用的库(数值大些),而控制台查询的是备份的库
斑竹 请教另外个问题
在导出成excel文件时我用number_format函数对数据进行了处理,然后在最后求和是调用了excel的sum函数ru

$objActSheet->setCellValue($arr[$j].$n,"=SUM($x1:$x2)");

导致求和的结果不对,如下。 

请问怎么做才能保证数据格式和求和的结果正确?

不要用 number_format 函数格式化数据
而应该用单元格格式来控制,比如

$sheet->getStyle('D6')            ->getNumberFormat()            ->setFormatCode('#,##0');

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn