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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

1回答

1049閲覧

月別検索をしたとき、一致するデータを引っ張ってくることができません。

shippei

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2020/07/28 10:25

編集2020/07/30 06:44

前提・実現したいこと

プルダウンメニューから選択した「月」と合致するデータをDBから引っ張りたいです。
そのため、以下の関数を用意しました。
(プルダウンメニューから選択した「月」は、$_POST['month-selected'] になります。)

該当のソースコード

PHP

1if(!empty($_POST['month-selected'])){ 2 $_SESSION['month-selected'] = $_POST['month-selected']; 3 function getDateFromDB(){ 4 try{ 5 $dbh = dbConnect(); 6 $sql = 'SELECT date, menu FROM menu 7 WHERE (DATE_FORMAT(date, "%m") = ":month_selected") 8 '; 9 $data = array(':month_selected' => $_SESSION['month-selected']); 10 $stmt = queryPost($dbh, $sql, $data); 11 $result = $stmt->fetchAll(); 12 debug('SQL文の結果表示:'.print_r($result, true)); 13 if (empty($result)){ 14 debug('一致する結果はありません'); 15 }else{ 16 debug('一致する結果はあります'); 17 return $result; 18 } 19 }catch (Exception $e){ 20 error_log('エラー表示:'.$e->getMessage()); 21 debug('データベースに接続できませんでした'); 22 } 23 } 24}

上記関数内で使用しているqueryPost()は以下の通りです。

PHP

1function queryPost($dbh, $sql, $data){ 2 $stmt = $dbh->prepare($sql); 3 if(!$stmt->execute($data)){ 4 debug('クエリに失敗しました'); 5 debug('失敗したSQL:'.print_r($stmt, true)); 6 $err_msg['common'] = MSG07; 7 return 0; 8 }else{ 9 debug('DBには接続できました'); 10 return $stmt; 11 } 12 }

HTML

1<select name="month-selected"> 2 <option>選択してください</option> 3 <?php $month = array(1,2,3,4,5,6,7,8,9,10,11,12); 4 foreach ($month as $key){ ;?> 5 <option value="<?php echo printf("%02d", $key); ?>"><?php echo $key; ?></option> 6 <?php 7 }; 8 ?> 9</select>

以上の関数を実行すると、デバッグに「一致する結果はありません」と出てしまいます。

試したこと

具体的な数値を入れたとき、きちんと該当のデータを引っ張ってこれることを確認しました。

PHP

1$sql = 'SELECT date, menu FROM menu 2 WHERE (DATE_FORMAT(date, "%m") = 7) 3 ';

どこを修正すれば良いのか、アドバイスいただけたら大変有難いです。

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

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

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

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

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

saoyagi2

2020/07/29 13:18

queryPost() という関数も見せていただけますでしょうか。
saoyagi2

2020/07/29 13:20

<option value="<?php echo $key; ?>" の後に '>' が抜けています。これ直したらどうなるでしょう
shippei

2020/07/29 13:31 編集

ご指摘ありがとうございます。 以下queryPost()です。 上記質問文も修正いたします。 function queryPost($dbh, $sql, $data){ $stmt = $dbh->prepare($sql); if(!$stmt->execute($data)){ debug('クエリに失敗しました'); debug('失敗したSQL:'.print_r($stmt, true)); $err_msg['common'] = MSG07; return 0; }else{ debug('DBに接続できました'); return $stmt; } }
shippei

2020/07/29 13:26

<option>の '>'抜けについてもご指摘ありがとうございます。 修正いたしましたが、検索結果は変わりません。
guest

回答1

0

以下のように修正してみてはいかがでしょうか。

diff

1--- main.php.org 2020-07-30 10:55:54.000000000 +0900 2+++ main.php 2020-07-30 10:56:13.000000000 +0900 3@@ -4,9 +4,9 @@ if(!empty($_POST['month-selected'])){ 4 try{ 5 $dbh = dbConnect(); 6 $sql = 'SELECT date, menu FROM menu 7- WHERE (DATE_FORMAT(date, "%m") = ":month-selected") 8+ WHERE (DATE_FORMAT(date, "%m") = ":month_selected") 9 '; 10- $data = array(':month-selected' => $_SESSION['month-selected']); 11+ $data = array(':month_selected' => $_SESSION['month-selected']); 12 $stmt = queryPost($dbh, $sql, $data); 13 $result = $stmt->fetchAll(); 14 debug('SQL文の結果表示:'.print_r($result, true));

プレースホルダの名称に '-'(ハイフン)はおそらく使えません。'_'(アンダースコア)などのシンボルに使用できる記号に置き換えてみてください。

diff

1--- view.php.org 2020-07-30 10:56:41.000000000 +0900 2+++ view.php 2020-07-30 10:56:57.000000000 +0900 3@@ -2,7 +2,7 @@ 4 <option>選択してください</option> 5 <?php $month = array(1,2,3,4,5,6,7,8,9,10,11,12); 6 foreach ($month as $key){ ;?> 7- <option value="<?php echo $key; ?>"><?php echo $key; ?></option> 8+ <option value="<?php printf("%02d", $key); ?>"><?php echo $key; ?></option> 9 <?php 10 }; 11 ?>

フォームから渡った month-selected は文字列で引き渡されます。7を選択した場合

sql

1$sql = 'SELECT date, menu FROM menu 2 WHERE (DATE_FORMAT(date, "%m") = "7") 3 ';

というクエリが実行されることになります。

データベース(おそらく MySQL)は、型が違う場合は自動的に型変換をして比較を行ってくれるのですが、型が同じ場合はそのまま比較します。DATE_FORMAT()%m は月を2桁の数字で返しますので "07" ですが、例示いただいたクエリの場合は数値で渡していますので "07" = 7 という条件を 7 = 7 と変換して検索が行われます。一方、プログラムで実行した際には "07" = "7" という条件のまま検索され、一致するレコードが0件になってしまったのでしょう。
上記の修正では option value の値をゼロ詰して2桁の文字列にしてみました。おそらくこの修正をする前でも10月11月12月は正常にレコードが取得できたのではないでしょうか。

投稿2020/07/30 02:10

saoyagi2

総合スコア210

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

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

shippei

2020/07/30 06:37

saoyagi2さん ご丁寧に教えていただき、本当にありがとうございました!   >>プレースホルダの名称に '-'(ハイフン)はおそらく使えません。 →勉強不足でした。教えていただいて初めて知りました。 型に対する認識の甘さも痛感しました。大変参考になりました。 ただ、ゼロ詰めしてもやはり該当するデータを引っ張ってこれません・・・。 (debugで$_SESSION['month-selected']の数値がゼロ詰めされていることを確認しました。)
saoyagi2

2020/07/30 09:08

PDOStatement::debugDumpParams でクエリの内容を確認してみるとどうでしょう。
shippei

2020/07/31 01:25

お返事ありがとうございます! 不勉強でこのようにパラメータの情報を確認することを知りませんでした。 実行した結果以下の通りになります。 SQL: [136] SELECT surve_date1, menu1 FROM menu1 WHERE (DATE_FORMAT(surve_date1, "%m") = ":month_selected") Params: 1 Key: Name: [15] :month_selected paramno=-1 name=[15] ":month_selected" is_param=1 param_type=2 クエリはきちんと通っていると言ってよろしいでしょうか? 恥ずかしながらマニュアルを確認しましたが、 例えばparam_typeがパラメータのデータ型を指していることは分かりましたが、 2がどのデータ型のことかまでは分からないなど、 情報の読み取り方を分かっておらず、 もしよろしければこちらも教えていただければ大変有難いです。
saoyagi2

2020/08/02 10:43

クエリはちゃんと通っているようですね。 となると、原因がわからなくなってしまいました。お役に立てず申し訳ありません。
shippei

2020/08/03 15:09

とんでもないです! 回答以外にいろいろと勉強させていただけました。 答えを考えていただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問