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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

511閲覧

予約システムにおいて、データベースへの更新がされません。

Tsukumo_Aoi

総合スコア21

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/06/30 01:56

編集2017/06/30 02:07

###前提・実現したいこと

体育館の予約システムを組んでいます。プログラム自体に問題はなく、エラーも発生しないのですが、なぜかデータベースに予約内容が追加されません。

###発生している問題・エラーメッセージ

エラーは発生していません。
データベースへの予約内容の追加がされません。

###該当のソースコード

PHP

1 2<html> 3<head> 4 <title>reserve_scr</title> 5 6</head> 7 <body> 8 <?php 9 10 if (empty ($_GET['reserveID'])) { 11 print"予約内容を入力してください<br>\n"; 12 disp_form(); 13 } 14 else { 15 tsuika($_GET['reserveID'],$_GET['date'],$_GET['jikan'],$_GET['place']); 16 } 17 18 function disp_form() { 19 $pdo = new PDO('mysql:host=localhost; 20 dbname=taiikukandb;charset=utf8','dbuser','abc123'); 21 $pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 22 $sql = "SELECT max(reserveID) as new_reserve_id FROM `yoyaku_tbl`"; 23 $stmt = $pdo -> query($sql); 24 $row = $stmt -> fetch(PDO::FETCH_ASSOC); 25 $reserveID = htmlspecialchars($row["new_reserve_id"] +1); 26 27 28 29 print <<< FRM1 30 <form action="./reserve_scr.php" method="get"> 31 <table border=0"> 32 <tr> 33 <td>予約番号</td> 34 <td> 35 {$reserveID} 36 37 </td></tr> 38 39 <tr> 40 <td>日付</td> 41 <td><input type="text" name="date">(半角8桁 例:20100509)</td></tr> 42 43 <tr> 44 <td>時間帯</td> 45 <td><select name="jikan"> 46 <option value="gozen">午前</option> 47 <option value="gogo">午後</option> 48 <option value="yakan">夜間</option></select></td></tr> 49 50 <tr> 51 <td>使用場所</td> 52 <td><select name="place"> 53 <option value="main">メインアリーナ</option> 54 <option value="sub">サブアリーナ</option> 55 <option value="kakugi">格技場</option> 56 <option value="Aroom">控え室A</option> 57 <option value="Broom">控え室B</option> 58 <option value="Croom">控え室C</option> 59 <option value="Droom">控え室D</option></select></td></tr> 60</table> 61<br> 62<input type="submit" value="予約"> 63</form> 64FRM1; 65 66} 67 68 69//追加処理 70function tsuika($reserveID,$date,$jikan,$place) { 71 72 try{ 73 $pdo = new PDO('mysql:host=localhost; 74 dbname=taiikukandb;charset=utf8','dbuser','abc123'); 75 $pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 76 $pdo -> setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 77 $pdo -> beginTransaction(); 78 79 $query="insert into yoyaku_tbl(reserveID,date,jikan,place) 80 values(:reserveID,:date,:jikan,:place)"; 81 82 $stmt = $pdo -> prepare($query); 83 84 $stmt -> bindValue(':reserveID',$reserveID,PDO::PARAM_INT); 85 $stmt -> bindValue(':date',$date,PDO::PARAM_STR); 86 $stmt -> bindValue(':jikan',$jikan,PDO::PARAM_STR); 87 $stmt -> bindValue(':place',$place,PDO::PARAM_STR); 88 89 $stmt -> execute(); 90 $pdo -> commit(); 91 92 } catch(PDOException $Exeption) { 93 $pdo-> rollback(); 94 die('DBエラー:'.$Exeption -> getMessage()); 95 } 96print <<< FRM2 97<br> 98<form action="./reserve_scr.php" method="get"> 99<input type="submit" value="もう一回!"> 100</form> 101FRM2; 102 103} 104 ?> 105</body> 106</html> 107

###試したこと

データベースへのアクセス関連を見直しましたが、僕の知識ではどこが変なのか見当がつきません。

###補足情報(言語/FW/ツール等のバージョンなど)
PHPを使っています。

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

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

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

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

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

guest

回答3

0

フォームで "reserveID" を送っていないので、if (empty ($_GET['reserveID'])) の判定が常に true になり、常に表示処理しか起きないようです。

コードを書いたのに実行されない&エラーも出ないという場合は、print デバッグでよいので期待しているメソッドや判定に進んでいるかまずチェックしてみましょう。

例えばこんな感じ↓

php

1//追加処理 2function tsuika ($reserveID, $date, $jikan, $place) 3{ 4 error_log('tuika() 呼ばれたよ');

投稿2017/06/30 02:22

miyahan

総合スコア3095

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

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

Tsukumo_Aoi

2017/06/30 03:03

なるほど、判定チェックですね! ありがとうございます!
guest

0

ベストアンサー

追加したときにtuika関数は呼ばれていますか?
コードの先頭で、$_GET['reserveID']をしていますが、disp_form関数で出力されるHTMLに、name="reserveID"が見当たらないので呼ばれていないのではないかと思います。
データベースから取得した値を格納している$reserveIDがHTMLのタグごと入っているのであれば問題はないですが、まさかそんな作りではないでしょうし。

投稿2017/06/30 02:18

ttyp03

総合スコア16998

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

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

Tsukumo_Aoi

2017/06/30 03:02

今記載して試してみましたが、それでも更新されてません...
ttyp03

2017/06/30 03:03

まずは、更新されているか否かではなく、tuika関数が呼ばれているかどうかを確認しましょう。 確認しました?
Tsukumo_Aoi

2017/06/30 03:25 編集

関数自体は呼ばれてるようなんです。 今少し手をくわえたのですが、 ``` <tr> <td>予約番号</td> <td><input type="hidden" name="reserveID" value=".'$reserveID'."> {$reserveID}</td> </tr> ``` としたところ、 DBエラー:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY' と出てしまいました。
ttyp03

2017/06/30 04:10

書き型が悪いですね。 この書き方だと、例えば$reserveIDに"123"が入っていたとすると、value部分は次のように展開されます。 value=".'123'." なので、こう書きましょう。 value="{$reserveID}">{$reserveID}</td> DBエラーは恐らくキー重複だと思われるので、$reserveIDが正しくtuika関数まで伝わるようになれば解決すると思います。 現状INT型を想定しているのに、.'123’. という値をパラメーターとして使った結果、正しく数値化できずに0に変換され、既に登録済みのレコードとキーが重複したためエラーになったものと思われます。
guest

0

直接の回答とは関係ないですが、予約ID+1をhtmlspecialchars()内で計算するくらいならSQLでしてしまった方がいいと思います。new_って名称もついてますし。

SQL

1SELECT max(reserveID)+1 as new_reserve_id FROM `yoyaku_tbl`

(たぶん以前の質問でそんなサンプル書いた気がします)

また登録処理などDB更新の処理はGETよりPOSTにした方がより安全です。

HTML

1<form action="./reserve_scr.php" method="get"> 23<form action="./reserve_scr.php" method="post">

PHP

1$_GET$_POST

また予約ID以外を入力チェックしてないようなので、空(カラ)の値で登録していいかどうか
項目毎に決めて必要に応じて入力チェックしておいたほうが良いでしょう。
予約システムとしては提示の項目は一通り必須でないと予約情報として成り立たなそうですし、日付も自由入力なので入力形式制限しとかないと予約情報表示のときに苦労しますし(DBの型とかも関係します)・・

もっと言えば、hiddenであってもブラウザの開発ツールで改ざん可能なので、予約IDは表示のみにとどめておきhiddenでは保存せずtuika()で再度同じ値を同じSQLで払い出した方がより安全な情報が登録できます。

更に追記ですが、予約IDが「必ず最大値+1」というルールがあるのならmysqlだと「オートインクリメント」PostgreSQLなら「シーケンス」を利用することでわざわざテーブルに対してmax+1のような計算をしなくても楽にID払出が出来るようになります(オートインクリメントだとそもそも払いださなくて良くなります)
ご検討ください。

投稿2017/06/30 04:12

編集2017/06/30 04:18
m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問