🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

PHP

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

Q&A

4回答

3999閲覧

sqlから取得したデータのphpでの比較 == と!= の仕様

hima-mura.

総合スコア42

SQL

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

PHP

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

0グッド

1クリップ

投稿2021/03/30 17:56

編集2021/04/01 07:47

php

1<?php 2$conf_date=''; // 参照用の日付 3try{ 4 $db= new PDO('mysql:dbname='. DB_NAME. ';host=' 5 . HOST_NAME, USER_NAME, PASS_NAME); 6 echo '接続完了'. "<br>"; 7} catch(PDOException $e){ 8 echo '接続失敗'. $e->getMessage(); 9} 10// 接続完了 11$table='SELECT*FROM'. TABLE_NAME; 12$sql=$db->query($table); 13var_dump($table); // string(n) "SELECT*FROM (データベース名)" 14var_dump($conf_date); // string(0) "" 15var_dump($sql); 16// object(PDOStatement)#4(1){["queryString"]=> string(n) 17// "SELECT*FROM (データベース名)} 18foreach($sql as $row){ 19 20 // debug 21 var_dump($row['date_time'],0,10); 22 // string(10) "2000-01-01" //(最初のうちはこの値) 23 var_dump($conf_date); 24 // string(10) "2000-01-01" //(最初のうちはこの値) 25 echo (substr($row['date_time'],0,10)=='2000-01-01'); 26 // (最初のうちは 1 をかえす) 27 echo ($conf_date=='2000-01-01'); 28 // (最初のうちは 1 かえす) 29 30 if (substr($row['date_time'],0,10)==$conf_date){ 31 echo 'Success!'. "<br>"; 32 } 33 else if (substr($row['date_time'],0,10)!=$conf_date){ 34 echo 'Failure' ."<br>"; 35 } 36 // 何故か、'Failure'をかえす 37 38 // debug 39 echo (substr($row['date_time'],0,10)==$conf_date); 40 // 確認してみたが、ここでブランク(空)をかえす 41 // 三段論法的にここは 1 を返すはずなのに、なぜか帰ってこない 42 43 $conf_date=substr($row['date_time'],0,10); 44 } 45?>

データの内容は、
'date_time' 'value'
2000-01-01 00:00:00 60
2000-01-01 00:05:00 50
2000-01-01 00:10:00 65
.
2000-01-01 23:55:00 54
2000-01-02 00:00:00 49
.
2000-01-31 23:55:00  55

やりたいこととして、取得した'date_time'の値から日付部分を抜き取って、一つ前のデータと同じならば、'Success!'を表示するようにしたい。
仕様なのでしょうか。なにが間違っているのか、分からず、困っています。助言をお願いします。

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

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

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

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

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

takasima20

2021/03/30 21:18

ダブルクオートが足りてないようですよ? あと波括弧も。 (転記ミスでなければ、ですけど)
退会済みユーザー

退会済みユーザー

2021/03/30 21:19

ちょっと質問が分かりません。 再現できるデータとコードを記載して、期待する出力を合わせて提示してください。 質問テンプレートに従うと整理が楽にできると思います。
maisumakun

2021/03/30 22:29

$confirm_dateと$conf_dateは別の変数ですか?
退会済みユーザー

退会済みユーザー

2021/03/31 00:30

第三者が状況を再現できる情報が足りてないです。クエリーの中身がわからない、クエリーの対象としているテーブルの構造やサンプルデータも示されない。日時をDATE型で扱うのかTIMESTAMP型で扱うのかでも違う。日付データをPHPで文字列で持つのかUNIXTIMEで持つのかそれともDateTimeクラスで持つのかでも違う。
FKM

2021/03/31 01:10

PHPはvar_dumpで取得した変数を随時取得できるので、それで逐一確認してみましょう。
退会済みユーザー

退会済みユーザー

2021/03/31 06:44

たのむー、プレビューをよく見て、特にコードの記述ミスや転記ミスが生じていないように気をつけてほしい。
tanat

2021/03/31 07:13

$sql=$db->query($table); var_dump($conf_date); var_dump($sql); die(); foreach($sql as $row){ とした場合の出力結果を追記して下さい
hima-mura.

2021/03/31 07:20

ご指摘ありがとうございます。コードは編集させていただきました。再現性が不十分なのでしょうが、phpもsqlも初学者な故どう表現していいかわかりません。このデータは,keyとしてdate_timeとvalueがあり、MySQLに置いています。
tanat

2021/03/31 07:27

表示されたものをそのままコピーして、コードブロック(```)で囲んで追記お願い出来ますか? 現状では書き方が独特なので情報が正しく伝わっていません。
tanat

2021/03/31 07:28

よくわからなければ、最悪スクリーンショットでもいいです。
hima-mura.

2021/03/31 07:34

tanatさんのコードを実行した結果 var_dump($conf_date); // string(4)"date" var_dump($sql); // NULL
tanat

2021/03/31 07:45

ありがとうございます。 質問に追記して下さい。 現状はデータを取得する時点で失敗していることが示されていますね。 foreachに入れていないはずです
tanat

2021/03/31 09:29

また、 var_dump($conf_date); // string(4)"date" と言うのは提示されているソースではあり得ないので、 今実際に確認に使っているソースと質問のソースで差分があるのかなと思われます。 実際に確認に使っているソースをそのまま貼り付けてみて下さい。 加えて、 $sql=$db->query($table); var_dump($table); var_dump($conf_date); var_dump($sql); die(); とした場合の結果も貼り付けてみて下さい。 (これも質問のソースと実際に動いているソースの差分かもしれませんが。)
hima-mura.

2021/03/31 17:05

すいません。確認のためにいじった部分がそのままになっていました。 あとデータベース名などは私事により控えさせてください。 本当に申し訳ありません。 var_dump($table); // string(n) "SELECT*FROM (データベース名)" var_dump($conf_date)+ // string(0) "" var_dump($sql); // object(PDOStatement)#4(1){["queryString"]=> string(n) "SELECT*FROM (データベース名)} となりました。
tanat

2021/03/31 18:48

foreachには入れるような気がしますね。 後半部分もおそらく修正途中のコードになってしまっているように思うので(質問文のままだと文法エラーになるはずです)、実際に動かしているものに修正してください。 デバッグ方法を回答に書いたので、同じような要領で変数の中身を都度都度確認して、どのタイミングで想定と異なった値が入ってしまったのかを確認してデバッグしてみください。
hima-mura.

2021/04/01 06:24

もちろん、変数の中身のデバッグはしていましたが(echo を使用して)、それでも変数の中身は期待通りだったのにも関わらず、==で比較した場合だけ、予想外の結果が出ているわけです。
FKM

2021/04/01 07:36

変数はかならず$をつけましょう。三段論法とか言ってる部分のconf_dateも$がありません。 本当にこれ、ちゃんと動いてるプログラムなのか怪しいぐらいミスが目立ちますので。 コピペするのも一つの手です。
FKM

2021/04/01 07:38

ここの値だけを見せてもらっていいですか? foreach($sql as $row){ // debug var_dump($row['date_time'],0,10); //ここだけを確認したい。元のクエリの値に問題が生じているのは確実
hima-mura.

2021/04/01 07:55

データ量が多いので最初しか確認していませんが、約100個ぐらい見た感じ、ずっと同じ値 string(10) "2000-01-01" が表示されています。
hima-mura.

2021/04/01 08:06

ついでに上記のコードの下にvar_dump($row['date_time])もコードして確認してみましたが、 string(19) "2000-01-01 00:00:00" string(19) "2000-01-01 00:05:00" string(19) "2000-01-01 00:10:00" string(19) "2000-01-01 00:15:00" といった感じで値は取得できていました。
guest

回答4

0

$sqlの値を見ないとなんともいえないところはあります。

queryメソッドを用いた場合でもデータ取得はできるのですが(昔推奨されてた方法。プレースホルダを用いない場合はこれでも問題はない)、質問文のような動作をするのは下に挙げたように、判定となる$conf_dateに代入しているためだと思われます。

おそらく、元のテーブルの日付の値が変更したために判定条件も入れ替わっているのでしょう。

PHP

1foreach($sql as $row){ 2 if (substr($row['date_time'],0,10)==$conf_date){ 3 echo 'Success!'. "<br>"; 4 elif (substr($row['date_time'],0,10)!=$conf_date){ 5 echo 'Failure' ."<br>"; 6 $conf_date=substr($row['date_time'],0,10); //ここで判定の値を代入している 7} 8

あと質問文のような変数の命名の仕方は混乱を招きます。
役割を考えた名前にしましょう。

$sql = "select …"; while ($rows = $db -> query($sql)){ };

投稿2021/03/31 07:35

編集2021/03/31 07:53
FKM

総合スコア3647

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

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

hima-mura.

2021/03/31 17:22

var_dump($sql); // object(PDOStatement)#4(1){["queryString"]=> string(n) "SELECT*FROM (データベース名)} となりました。 日付の値は変更されても、substrで抜き出しているので値は一定になっているはずなのですが。
FKM

2021/04/01 00:05

var_dump($row)をforeach文の間に置いてください。
FKM

2021/04/01 06:06

値は一定になっても、元のテーブルの値が変更されたら、そこで判定文がtrueに変わるはずです、そうなったら今度は代入処理が行われないので、テーブルの値が終了するまでtrueを続けることになります。
hima-mura.

2021/04/01 06:55

申し訳ありません。自分の理解力が及ばず理解できていないのですが、判定文がTrueを返したら、代入処理($conf_dateのところですか?)が行われないのはどういうことでしょうか。
FKM

2021/04/01 07:02

そもそもelifってPHPで使えなかったはずですが、elseif、またはelse ifにして、最後の代入式をきちんと閉じてから記述してもらっていいですかね?今のままだと最後の代入式がどっちの判定文にかかってるかわかりかねますので。それともelifって独自で設定している関数ですか? foreach($sql as $row){ if (substr($row['date_time'],0,10)==$conf_date){ echo 'Success!'. "<br>"; elseif (substr($row['date_time'],0,10)!=$conf_date){ echo 'Failure' ."<br>"; $conf_date=substr($row['date_time'],0,10); //ここで判定の値を代入している  } } //本来ならここでもう一つ括弧があるはず
hima-mura.

2021/04/01 07:23

ご指摘通り確認不足で申し訳ありません・コードの編集をさせていただきました。上記のやりたいことに記述した通りconf_dateには一つ前の値を入れて保持するようなので、else if{}の枠外です。
guest

0

まずちゃんと SQL が投入できる環境を確保した方が良いですよ。
(現状だとタイトルの質問前提まで進めていません)

以下にテンプレートを用意しているので、現状を改修してください。
PHP で MySQL 接続時に必要な知識(最小限版)

で、環境を整えると、以下の SQL が syntax error として弾かれると思います。
(ほかにもあるかも。ざっとしか見てないです^^;)

diff

1- $table='SELECT*FROM'. TABLE_NAME; 2+ $table='SELECT * FROM '. TABLE_NAME;

この辺りまで整理できて初めてタイトル部分の質問にかかれるかと。

投稿2021/04/02 00:19

編集2021/04/02 00:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

まず、PHP デバッグ xdebug ブレークポイント+使用しているエディタやIDE名
で検索して、PHPのデバッグ環境を整えることを強くお勧めします。

そもそもデバッグ方法がよくわかっていないのであれば
PHP デバッグ方法で調べてみてください。

原始的で、コードをいじらないといけないデバッグ方法ですが、
var_dumpでその時点での変数の中身を確認していくという方法があります。

例えば、

PHP

1 echo 'Failure' ."<br>"; 2 $conf_date=substr($row['date_time'],0,10); 3 // 取得したデータの日付(20XX:XX:XX)がひとつ前のデータと同じとき処理したい 4 // なぜかFailureが表示されるが、Successを表示したい

であれば

PHP

1 echo 'Failure' ."<br>"; 2 var_dump($row['date_time'],0,10)); 3 var_dump($conf_date); 4 echo 'Failure' ."<br>"; 5 $conf_date=substr($row['date_time'],0,10); 6 var_dump(substr($row['date_time'],0,10)); 7

という感じにして、判定に使用した変数に実際にどんな値が入っているかを確認していけばどのタイミングで想定外の値になっているかが分かります。
他にも、ifの直前で同様に確認してみたり、foreach開始直後に$rowをvar_dump()して、それぞれが本当に想定通りになっているのかを確認してデバッグしてみてください。


// 確認用  echo (substr($row['date_time'],0,10)=='2000-01-01') // 最初の何回かは1を返す echo ($conf_date=='2000-01-01') // 最初の何回かは1を返す echo ((substr($row['date_time'],0,10)==$conf_date)

のあたりデバッグしようとしているのは理解できるのですが、これだと理由まではわからないのでデバッグするには情報が足りません。
条件判定の結果を確認するのではなく、条件判定に使用した変数そのものを確認する方向でデバッグしてみてください。

投稿2021/03/31 18:44

編集2021/03/31 18:50
tanat

総合スコア18727

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

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

0

全体的にPHPでのDB接続を理解していない書き方です。
pdoでの接続を前提ではないのでしょうか?
データはfetchして得てください。

投稿2021/03/31 00:38

yambejp

総合スコア116661

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

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

hima-mura.

2021/03/31 06:42

申し訳ありません。ネットのコードをそのまま参考にしたんですが、確かに理解できていないところも多いです。これでデータの中身は取得できてはいるのですが、問題なければなぜfetchを使うのか教えてくださると助かります。
yambejp

2021/03/31 06:48

その前にこれはPDOですか? pdoでqueryを実行した戻り値は接続情報でしかありません そこからデータを抜き出す処理がfetchです
hima-mura.

2021/03/31 07:13

はい、PDOを使って取得しようとしました。では変数$sqlには接続情報が入っているということですか?
退会済みユーザー

退会済みユーザー

2021/03/31 08:13

ん?PDO::query() は結果セットが返ってくるから、foreach で良いと思うけど? (FETCH MODE の指定がないから微妙だけど)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問