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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1098閲覧

【MySQL5.7】デフォルト値から減算するしくみを作りたい

Masa-Y

総合スコア30

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/10/11 04:45

編集2019/10/11 09:24

予約フォームで以下のような仕組みを作っています。

1日あたりの予約可能上限枠:10名(午前、午後それぞれ)
あらかじめ、残り空き枠数カラムavailable_numのデフォルト値を10にしておき、
予約が入るたびにそこから0になるまで減算し値を更新する

上記のような動きにしたいのですが、エラーになってしまいます。

試しに、PHPのヒアドキュメント内で以下のようなクエリにしてみました。

sql

155 UPDATE reserv_info 256 SET available_num -= $_SESSION['adult_member'] 357 WHERE slot = $_SESSION['slot'] 458 GROUP BY reserved_date 5 ;
  • reserv_info = テーブル名
  • available_num = デフォルト値で10が入っています
  • $_SESSION['adult_member'] = 入力された予約人数
  • slot = 午前の部or午後の部
  • reserved_date = 予約希望日

以下のエラーとなりました。

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /中略/reserved.php on line 56

デフォルト値を数式で更新することはできないのでしょうか。
または内容に誤りがありますか。

他の方法も含めてご教示くださると助かります。


以下に修正てみましたが、結果は同じエラーでした。

sql

1 UPDATE reserv_info 2 SET available_num = available_num - $_SESSION['adult_member'] 3 WHERE slot = $_SESSION['slot'] 4 AND reserved_date = $reserved_date
  • $reserved_date = 予約希望日

エラー内容

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /中略/reserved.php on line 56


以下のように修正しましたら、解決しました。

sql

1 UPDATE reserv_info 2 SET available_num = available_num - $_SESSION[adult_member] 3 WHERE slot = '$_SESSION[slot]' 4 AND reserved_date = '$reserved_date' 5 ;

① $_SESSION[adult_member] = 数値型
② '$_SESSION[slot]' = 文字列型
③ '$reserved_date' = 日付型

②③の変数はクォーテーションで囲うべきでした。
また①は[]内のクォーテーションを外しました。

残り空き枠数のデフォルト値も、予約が入るたびにきちんと減算されています。
テーブルを分けようとも思いましたが、このまま進めてみます。
アドバイス下さった方々、どうもありがとうございました。

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

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

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

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

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

Orlofsky

2019/10/11 04:49

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。
Orlofsky

2019/10/11 04:51

質問に CREATE TABLE を提示できると適切なコメントが付きやすいです。
Masa-Y

2019/10/11 04:51

失礼いたしました、MySQL5.7です。
Orlofsky

2019/10/11 04:54

ちゃんとコメントを読んでください。 >どのデータベースを使うのかを質問のタグで示したり、バージョンも明記
guest

回答3

0

似たような過去の質問がありました
質問

56行目より前でシングルコーテーションかダブルコーテーションの閉じ忘れはないですか?

投稿2019/10/11 07:32

shirokuma4690

総合スコア154

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

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

Masa-Y

2019/10/11 09:41 編集

詳細追記しました。 変数に適切にクォーテーションをつけていませんでした。 気づきをありがとうございました。
guest

0

予約日とユーザーidの組み合わせを別テーブルに保存して
予約日のユーザー数上限がきたら登録できないようにするか
上限以上をキャンセル待ち扱いにすればいいでしょう。
その際データ登録日時を設定しておけばキャンセル待ちの優先順位にもなります

投稿2019/10/11 04:55

編集2019/10/11 04:56
yambejp

総合スコア114827

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

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

Masa-Y

2019/10/11 06:52

こちらの方法でやり直してみます、 「予約日のユーザー数上限がきたら登録できないようにする」方法がまだわかりませんが調べてみます。データ登録日時のカラムは設けております。ありがとうございます。
guest

0

ベストアンサー

・SET available_num -= $_SESSION['adult_member']
デクリメントする演算子はありません。
行うなら以下の様になります。
SET available_num = available_num - $_SESSION['adult_member']
※変数の展開は大丈夫なのかは分かりませんが。
・updateにGROUP BYは使用できません。
複数の特定予約日に対して更新を掛けたいのが意図するところなら、reserved_dateはwhere条件になります。

投稿2019/10/11 04:53

編集2019/10/11 04:56
sazi

総合スコア25184

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

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

Masa-Y

2019/10/11 07:12

演算子の修正とWHEREに修正してみましたが、再び同じエラーになってしまいました。(追記しました) 別テーブルに分ける方法を試してみようと思っています ありがとうございます。
sazi

2019/10/11 07:19

Parse errorですから、組み立てられたSQLの内容を確認する必要があります。 組み立てられたSQLを直接実行して確認して下さい
Masa-Y

2019/10/11 09:13

詳細を追記しました。 ご指摘通り、SQL文にミスがあり、修正しました。 最初のご指摘もとても参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問