質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1438閲覧

php エラーはでないが、値が予期したものではなくNULL

earnest_gay

総合スコア615

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/09/20 13:12

編集2016/09/20 13:17

SQL文絡みの質問です。

持ち出し禁止なのでソースはありませんが、覚えている範囲で質問します。
あるクラス内で定義されている関数内で更に別の関数を、LEFT JOINに使ってサブクエリを得るというものですが、エラーはでないが予期した値が得られないのでどこまで読み込めているのかわからず困っています。

ちゃんとクエリが返っているかの確認は
そのクラスファイルの最下部に下記を付けたし、WinSCPで該当ディレクトリまでcdしてphp -f Class.phpで確認しています。

内容はともかくとして、これで返るはずの値が返ってこないのです。
一応、クエリ文としては引数があろうがなかろうがNULLのときはNULLで返ってくるのでエラーにはならないのです。

$section = array("1","2","3","4","5","6","7","8","9")
というのが、DBレコードに入っている部門ID的なものなので、それに対して2年分の検索をかけています。

が、なにも返ってこないのでどこから手をつけていいのか悩んでいます。

$section = array("1","2","3","4","5","6","7","8","9") for($year=2015;$year<=2016;$year++){ for($mon=1;$mon<=12;$mon++){ for($day=1;$day<=28;$day++){ for($i=0;$i<count($section);$i++) { $year = sprintf('%04d',$year); $mon = sprintf('%02d',$mon); $day = sprintf('%02d',$day); $target = $year . "/" . $mon . "/" . $day; echo "------------------------------------------------------------"; echo PHP_ELO,PHP_ELO; echo $target; echo PHP_ELO; echo "Section_id:" . $section[$i]; echo PHP_ELO,PHP_ELO; $test =Class::saranibetsunokansuu($section[$i],$target); var_dump($test); } } } }

$dayのfor文が28までなのはあまり関係ないです。
該当レコードは28日以下にもあるので、めんどくさがって28にしているだけです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyper-drums-ko

2016/09/20 14:10

Class::saranibetsunokansuu にてデータベースにアクセスしているものと思われますが、そちらを提示いただくことは可能でしょうか?
guest

回答3

0

とりあえず、forで回している変数を
ループ中で更新するのはだめじゃないスかねえ。
--- 追加 ---

あとは、その関数とパラメータの意識があってるか
の確認くらいかなあ。
--- 追加 ---

これはなぜ駄目なのでしょうか?

自分だったら

PHP

1 $year = sprintf('%04d',$year); 2 $mon = sprintf('%02d',$mon); 3 $day = sprintf('%02d',$day); 4 5 $target = $year . "/" . $mon . "/" . $day;

の部分を

PHP

1 $target = sprintf('%04d/%02d/%02d',$year,$mon,$day);

こうします。
意図してそうしているのならかまいませんが、
そうでないならバグのもとになりがちなものです。
ただ、今回のに関しては明確に誤りだという確信はないので、
正しく動作するのならそのままでもいいのではないでしょうか。

投稿2016/09/20 13:18

編集2016/09/22 13:55
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/09/22 11:07

>とりあえず、forで回している変数を >ループ中で更新するのはだめじゃないスかねえ。 これはなぜ駄目なのでしょうか?
Panzer_vor

2016/09/23 16:00 編集

横から失礼します。 ループ変数の書き換えが一般的に良くないとされるのは、 厄介な不具合を招きやすく、可読性を著しく低下させるからです。 今回のケースではループ変数を書式変換してるのみなので大事には至っていませんが、ループ内でループ変数自体をいじるとその結果を利用してループが継続されます。 例えば0〜5までループする処理でループ変数に対して1加算すると、 実質的なループ処理は、 0、2、4の3回となります。 その処理を書いた人ならいいですが、 他の人がそのソースを見た時に、 この動きをすぐには想定できないし、 普通の感覚ではループ処理は開始から終了まで1つずつ処理されるというのがほとんどなので、注意深く見ないと見落としかねません。 そういう事情もありループ変数を上書きするのは、 一般的にはナンセンスとされています。 今回のケースでも実害が出ていなくとも、 書式変換後の値を保存する専用変数を定義して使用するのが行儀の良いコーディングとなります。
guest

0

SQL部分の記載はないので、
あまり踏み込んだ回答は出来そうもないですが^^;

当方が気になる点は2カ所で、
takasima20さんが既に指摘されているループ変数の書き換えが行われている点。
(動作するにしても別変数に入れ直した方が安心できます)

それとループで日付と部門ID?を組み立て点は1つ1つ検索をかけてるように見えますが、
SQLの書き方次第で、
対象データを一気に抽出してこの工程が省けるのではないかなといった点です。
(細かい実装が分からないのでもしかしたらループで1件ずつ回すのが正解な可能性もありますが)

特に2点目については、
要件的にSQL自体を改善できるのであれば、
PHP側でごちゃごちゃする必要性が減るのでコードを簡潔にできる可能性は高いように思えます。

投稿2016/09/20 18:24

編集2016/09/20 18:25
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

SQL

1SELECT 日時, 欲しいもの, 他に欲しいもの 2 FROM 欲しいものが入ったテーブル 3 WHERE 4 日時 between '2015-01-01' and '2017-01-01' 5 and 6 部門ID in (1, 2, 3, 4, 5, 6, 7, 8, 9) 7 GROUP BY 日時

と言うようなSQLで取得するようにしてはいかがでしょうか。

投稿2016/09/21 01:33

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/09/22 11:08

ありがとうございます! 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問