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

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

詳細はこちら
MySQL

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

PHP

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

Q&A

解決済

3回答

1567閲覧

array_search()ができません。

Masa-Y

総合スコア30

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/10/12 07:23

編集2019/10/12 08:04

PHPで予約フォームを組んでいます。
同じ予約希望日でも3パターン(午前、午後1、午後2)があり、
それぞれに最大10件の予約枠を設けています。

こちらのページでは、申込者がカレンダーの表示から
任意の日付をクリックすると、
その日の予約状況が表示される仕組みです。

日付がクリックされたら、GETで同ページに日付(年月日)を受け渡します。
PDO接続でデータベースからfetchAllした予約情報の中から、
まず同じ日付(2019-10-00)の予約がすでに入っているかどうかをしらべて、
ある場合→現在の予約状況の表示
ない場合→新規予約日の表示
というふうにif文で表示を分けようと考えました。

それで、array_search()で検索をかけたのですが、
予約が入っていない日も入っている日も、結果がbool(false)となってしまいます。
同じ日付の予約日がすでにある場合は、
配列の整数インデックスキーが返ってくると思ったんですが
使い方が間違っているでしょうか。

アドバイスいただけると助かります。

ところどころでvar_dumpしてみました。

(Apache2.4.6/PHP Version 7.2.17/MySQL5.7x)

php

1【index.php】 2// データベース接続 3try { 4 $pdo = new PDO(PDO_DSN_HELPFUL,DB_USER,DB_PASSWORD); 5 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 6 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 7 print '接続しました。<br />'; 8}catch(PDOException $e) { 9 die('接続エラー:' . $e->getMessage()); 10} 11 12// 予約日(reserved_date)・予約枠am,pm1,pm2(slot)・空席数(available_num)取得 13// 最新の予約の受付日reception_dateから残りの空席を取得します 14try { 15 $sql = <<<VACANCY 16 SELECT 17 reserved_date,slot,available_num 18 FROM 19 reserv_info 20 GROUP BY reserved_date,slot 21 HAVING MAX(reception_date) 22 ; 23VACANCY; 24 $stmh = $pdo->prepare($sql); 25 $stmh->execute(); 26}catch(PDOException $e) { 27 echo "エラー:" . $e->getMessage(); 28} 29 30$rows = $stmh->fetchAll(PDO::FETCH_ASSOC); 31 32 33foreach($rows as $row){ 34 echo $row["reserved_date"] . $row["slot"]. "残り空き予約枠:" . $row["available_num"] . "名<br />"; 35} 36 37//カレンダーで選択された年月日 38if(isset($_GET['year'])&& isset($_GET['month'])&& isset($_GET['day'])) { 39 $page_flag = 1; 40 41 $year = h($_GET['year']); 42 $month = h($_GET['month']); 43 $day = h($_GET['day']); 44 $week = weekName($year,$month,$day); //曜日名(日〜土)を出す関数 45 $preferred_date = $year . "-" .$month. "-" .$day; 46 47 var_dump('予約希望日:'. $preferred_date); 48 49 $keyIndex = array_column($rows, 'reserved_date'); //予約済み日付だけの配列に変換 50 var_dump($keyIndex); 51 var_dump(array_search('$preferred_date',$keyIndex)); 52 53} 54...以下略

上の結果です。(データベースにはテスト用で3件の予約を入れてあります。)

2019-10-24午後の部① 13:00 - 14:30残り空き予約枠:6名

2019-11-11午前の部 9:00 - 10:30残り空き予約枠:3名
2019-11-13午前の部 9:00 - 10:30残り空き予約枠:8名
string(22) "予約希望日:2019-11-11" array(3) { [0]=> string(10) "2019-10-24" [1]=> string(10) "2019-11-11" [2]=> string(10) "2019-11-13" } bool(false)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/12 07:32

データベースにクエリー実行している箇所を示さないのはなぜでしょう? データの取得時点から潜在的に問題があるような気がしてなりません。
Masa-Y

2019/10/12 07:35

追加しました。お願いいたします。
guest

回答3

0

SELECT文のクエリーで、WHERE句を使わないのはなぜでしょう?
常に予約データを全行引き出すのは無駄です。
今は数十件かもしれなくても、長期の利用で何千何万の中から加工するのは無駄な処理です。
データベース上のreserved_dateに適した形で「WHERE reserved_date = 日付文字列」みたいなのを加えるべきかと。

さらに、そのSELECT分でGROUP BY句を使っていますが、
reserved_dateとslotでユニークなデータを持っていそうな雰囲気で、
available_numが何をしているのかピンときません。
日付と枠で空き件数を足し算したいのであればSUM(available_num)した上でGROUP BY句を使うのならわかりますが。

SELECT文が妥当かどうかを第三者が判定できるよう、
CREATE TABLE文によってreserv_infoがどういうデータ構造を持っているのかをしてしてもらえれば、
より的確な回答につながるかと思います。


想定される予約状況管理として
空き状況をテーブルで持つ、というよりも、
予約を記録するテーブルを持つって考え方の方がしっくり来ます。
予約のデータがなければ、そこは空いていると考えられるからです。
日付、予約枠、予約顧客id
がセットであればそこそこ機能しそうな気がします。
予約を記録しつつ空き状況データを更新する、
まぁやれなくはないですが、
予約データのクエリーを工夫することで直接空き状況を取得する事もできます。
(PostgreSQL民なので具体例を示せず申し訳ないです。)

投稿2019/10/12 08:05

編集2019/10/12 08:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Masa-Y

2019/10/12 08:50 編集

詳しいアドバイスをありがとうございます。 WHERE句の活用がないのは確かにそうですね、 毎回すべてのデータを取得する形になっていました...。 必要最小限のデータ取得になるように 早速「WHERE reserved_date = 日付文字列」を組み込もうと思います。 今回の質問の趣旨の部分が解決できましたので、 いただいたアドバイスは今後参考にさせていただきます。 どうもありがとうございました。
guest

0

$preferred_dateをクオテーションで括っていたことが原因でした。

投稿2019/10/12 08:36

編集2019/10/12 09:28
Masa-Y

総合スコア30

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

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

0

ベストアンサー

とりあえず確認方法に問題があります。

PHP

1// array_search('$preferred_date',$keyIndex) 2// ↓ ↓ 3 array_search( $preferred_date, $keyIndex, true )

投稿2019/10/12 07:53

kei344

総合スコア69596

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

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

Masa-Y

2019/10/12 07:58 編集

当初クォテーションなしでbool(false)でしたので、あとからつけてみましたが、 同じ結果でした。再度外しておきます(確認しましたがやはりbool(false)です)
退会済みユーザー

退会済みユーザー

2019/10/12 08:06

シングルクォーテーションで括ると、変数をそこに展開せず「$preferred_date」そのものの文字列になってしまいますよ、と言い換えれば伝わるでしょうか。
Masa-Y

2019/10/12 08:36

こちらのご指摘がヒントになり、解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問