ホームページ > バックエンド開発 > PHPチュートリアル > 同じSQLでもphpプログラムの実行結果とデータベースの実行結果は異なります。

同じSQLでもphpプログラムの実行結果とデータベースの実行結果は異なります。

WBOY
リリース: 2016-06-23 13:59:06
オリジナル
1575 人が閲覧しました

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」に変更しても機能しません。どうすれば解決できますか?

'Withdrawn' を
".iconv('utf-8', 'gbk', 'Withdrawn') に変更することで問題を解決しました。

時間条件が含まれていると思いますが、条件が異なります

次に、それが同じデータベースであるかどうかを確認します
コンソールがバックアップ ライブラリをクエリする間、使用中のライブラリをクエリするために php を使用しないでください (値が大きくなります)
Bamboo さん、別の質問をしてください
Excel ファイルにエクスポートする場合, 私はnumber_format関数でデータを処理し、最終的な集計でExcelのsum関数ruを

$objActSheet->setCellValue($arr[$j].$n,"=SUM($x1:$x2)");
ログイン後にコピー

と呼んでしまい、以下のように誤った集計結果になってしまいます。

データ形式と合計結果が正しいことを確認するにはどうすればよいですか?

データの書式設定にnumber_format 関数を使用しないでください
代わりに、

$sheet->getStyle('D6')            ->getNumberFormat()            ->setFormatCode('#,##0');
ログイン後にコピー

などのセルの書式設定を使用してデータを制御します
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート